如何调试DirectX3D程序

转载地址:http://www.cnblogs.com/minggoddess/archive/2011/06/16/2082970.html

如果安装了DirectX SDK,就可以通过SDK中的DirectX Control Panel来设置调试选项,这个工具位于开始-程序-Microsoft DirectX SDK(June 2010)-DirectX Utilities中,也可以在SDK的安装目录下找到,在我这里是C:\Program Files\Microsoft DirectX SDK (June 2010)\Utilities\bin\x86。运行后如下图。

如何调试DirectX3D程序_第1张图片

由于我机器上安装的是DX9,所以我们只看有关DX9的设置

Debug Output Level – 这是调试输出的级别,级别越高,输出的调试信息越丰富,选择More

Debug/Retail D3D9 Runtime – 这是选择调试所用的库类型,我们选择Use Debug Version of Direct3D9

Debugging – Select all

  • Maximum Validation, 最大验证模式
  • Enable Shader Debugging, 启用Shader调试
  • Break on Memory Leaks, 内存泄露时中断,这是最有用的选项,因为最常见的错误就是内存泄露
  • Break on D3D9 Error, 在D3D函数调用错误时中断
  • Enable Multi-mon Debugging, 启用多显示器调试

说一下Break on D3D9 Error选项,如果某个D3D函数调用出现错误,那么程序会立即断下,你将会看到如下模样的对话框。

单击Break按钮中断程序,然后打开Output窗口,会看到如下信息,这种信息只有在使用Debug版本的SDK时才会有,所以在开发的时候我 们尽量使用Debug版本,在发布的时候在转换为Release版本。下面的信息详细描述了错误的原因,在Clear函数中设置了清除z-buffer的 选项,但实际上我们根本没有创建z-buffer,所以清除失败了。Output窗口里面的信息是最全面,最直观的。应该尽可能参考此处的信息。

如何调试DirectX3D程序_第2张图片

更丰富的调试信息

使用 #define D3D_DEBUG_INFO 宏可以产生更加丰富的调试信息,需要注意的是,这个宏必须出现在D3D9.h文件之前,DXUT程序都自动启用了这个宏。在未启用这个宏的时候,我们的到的信息常常是下面这样的

如何调试DirectX3D程序_第3张图片

而在启用了这个宏之后,一个对象的所有属性都可以在调试的时候查看了

如何调试DirectX3D程序_第4张图片

将\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Direct3D\\ D3D9Debugging\\EnableCreationStack设置为1,还可以查看对象创建过程中的调用栈,这样做会导致程序的速度很慢,但是 有助于发现资源泄漏。设置了这个值以后,在Watch窗口中会多出来一个变量CreationCallStack,里面记录的调用栈的内容,如下图。

使用DX提供的函数

DxErr.h 文件中提供了几个函数,可以用来输出Error或者Trace信息,这几个函数如下,需要注意的是,有几个函数只有在Debug模式下才可用

HRESULT hr ;
hr = g_pd3dDevice->Clear(0, 
    NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 
    D3DCOLOR_XRGB(0,0,0), 
    1.0f, 
    0); 
if (FAILED(hr))
{
    DXTRACE_ERR_MSGBOX(DXGetErrorDescription(hr), hr) ;
    DXTRACE_ERR_MSGBOX(DXGetErrorString(hr), hr) ;
    DXTRACE_ERR_MSGBOX(L"Clear failed!", hr) ; // Use customized error string
    DXTRACE_MSG(DXGetErrorDescription(hr)) ;
    DXTRACE_ERR(DXGetErrorDescription(hr), hr) ;
}

DXTRACE_ERR_MSGBOX会输出如下形式的错误框,信息非常丰富,包含错误所在的文件,错误所在的行,错误码及其描述,对于定位及解决问题非常有帮助。

如何调试DirectX3D程序_第5张图片

需要注意的是如果在DX Control Panel中的Debugging选项中开启了Break on D3D9 Error,那么这个对话框有时候将不会被显示,因为程序优先选择显示了程序中断对话框。DXTRACE_ERR和DXTRACE_MSG作用相同,都是 向Output窗口输出错误信息,而不显示错误框。

全屏程序的调试

全屏程序调试有两种方法

1 转换为窗口模式进行调试

2 使用双屏,要记得在DX的Control Panel里面将双屏调试选项开启

符号调试(symbol debugging)

符号文件可以从微软的符号文件服务器上下载,也可以在安装DX SDK的时候选择安装。连接符号服务器的方法有两种,一种是从Visual Studio的选项中设置,一种是用系统环境变量设置,这里推荐使用后者,因为后者是针对整个系统的设置,系统中其他的调试器也可以使用这个设置,比如 WinDbg,而前者则只是针对VS的设置。

使用Visual Studio的选项设置

Tools-Option-Debugging-Symbols,在Symbol file Locations中添加symbol server的地址,在本地缓存上添上c:\symbols,符号附件会下载到该文件夹。配置完以后,第一次调试的时候VS会变得很慢,这是因为需要下载 符号文件,等下载完成以后,再启动速度就会恢复正常了。

如何调试DirectX3D程序_第6张图片

使用系统环境变量

使用该方法可以添加多个symbol server,添加一个名为_NT_SYMBOL_PATH的系统环境变量,该变量的值遵循如下语法格式:

srv*[local cache]*[private symbol server]*http://msdl.microsoft.com/download/symbols

一个常用的写法如下

srv*c:\symbols*http://msdl.microsoft.com/download/symbols,这样符号文件会下载到c:\symbols文件夹下。

你可能感兴趣的:(如何调试DirectX3D程序)