如何调试DX程序
配置调试环境
如果安装了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。运行后如下图。
由于我机器上安装的是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, 启用多显示器调试
注意:Software Only这个选项不要选,否则的话在创建D3D Device的时候就不能使用硬件设备了(D3DDEVTYPE_HAL)。
说一下Break on D3D9 Error选项,如果某个D3D函数调用出现错误,那么程序会立即断下,你将会看到如下模样的对话框。
单击Break按钮中断程序,然后打开Output窗口,会看到如下信息,这种信息只有在使用Debug版本的SDK时才会有,所以在开发的时候我 们尽量使用Debug版本,在发布的时候在转换为Release版本。下面的信息详细描述了错误的原因,在Clear函数中设置了清除z-buffer的 选项,但实际上我们根本没有创建z-buffer,所以清除失败了。Output窗口里面的信息是最全面,最直观的。应该尽可能参考此处的信息。
更丰富的调试信息
使用 #define D3D_DEBUG_INFO 宏可以产生更加丰富的调试信息,需要注意的是,这个宏必须出现在D3D9.h文件之前,DXUT程序都自动启用了这个宏。在未启用这个宏的时候,我们的到的信息常常是下面这样的
而在启用了这个宏之后,一个对象的所有属性都可以在调试的时候查看了
将\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Direct3D\\ D3D9Debugging\\EnableCreationStack设置为1,还可以查看对象创建过程中的调用栈,这样做会导致程序的速度很慢,但是 有助于发现资源泄漏。设置了这个值以后,在Watch窗口中会多出来一个变量CreationCallStack,里面记录的调用栈的内容,如下图。
使用DX提供的函数
DxErr.h 文件中提供了几个函数,可以用来输出Error或者Trace信息,这几个函数如下,需要注意的是,有几个函数只有在Debug模式下才可用
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会输出如下形式的错误框,信息非常丰富,包含错误所在的文件,错误所在的行,错误码及其描述,对于定位及解决问题非常有帮助。
需要注意的是如果在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会变得很慢,这是因为需要下载 符号文件,等下载完成以后,再启动速度就会恢复正常了。
使用系统环境变量
使用该方法可以添加多个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文件夹下。
=THE END=
Happy coding!!!