如何调试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模式下才可用

复制代码
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会输出如下形式的错误框,信息非常丰富,包含错误所在的文件,错误所在的行,错误码及其描述,对于定位及解决问题非常有帮助。

需要注意的是如果在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!!!


本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/archive/2011/03/14/1984200.html,如需转载请自行联系原作者

相关文章
|
6月前
|
存储 NoSQL 安全
【C++调试】深入探索C++调试:从DWARF到堆栈解析
【C++调试】深入探索C++调试:从DWARF到堆栈解析
322 1
|
6月前
|
Windows
86/88汇编代码的运行调试
86/88汇编代码的运行调试
42 0
|
6月前
|
传感器 编解码 Linux
V4L2框架 | MIPI Camera指令调试笔记
V4L2框架 | MIPI Camera指令调试笔记
2901 2
|
IDE 开发工具 开发者
ESP8266固件SDK开发初体验-打印helloworld
ESP8266固件SDK开发初体验-打印helloworld
270 0
|
存储 编译器 C语言
一定要掌握的实用调试技巧(vs2019)(下)
一定要掌握的实用调试技巧(vs2019)(下)
|
安全 编译器 程序员
一定要掌握的实用调试技巧(vs2019)(上)
一定要掌握的实用调试技巧(vs2019)(上)
|
监控 程序员 编译器
代码的调试技巧
代码的调试技巧
|
Windows
【Windows 逆向】OD 调试器工具 ( OD 调试数据时硬件断点对应的关键代码 | 删除硬件端点恢复运行 )
【Windows 逆向】OD 调试器工具 ( OD 调试数据时硬件断点对应的关键代码 | 删除硬件端点恢复运行 )
350 0
【Windows 逆向】OD 调试器工具 ( OD 调试数据时硬件断点对应的关键代码 | 删除硬件端点恢复运行 )
|
Windows
【Windows 逆向】OD 调试器工具 ( CE 中获取子弹动态地址前置操作 | OD 中调试指定地址的数据 )(二)
【Windows 逆向】OD 调试器工具 ( CE 中获取子弹动态地址前置操作 | OD 中调试指定地址的数据 )(二)
151 0
【Windows 逆向】OD 调试器工具 ( CE 中获取子弹动态地址前置操作 | OD 中调试指定地址的数据 )(二)
|
Windows
【Windows 逆向】OD 调试器工具 ( CE 中获取子弹动态地址前置操作 | OD 中调试指定地址的数据 )(三)
【Windows 逆向】OD 调试器工具 ( CE 中获取子弹动态地址前置操作 | OD 中调试指定地址的数据 )(三)
197 0
【Windows 逆向】OD 调试器工具 ( CE 中获取子弹动态地址前置操作 | OD 中调试指定地址的数据 )(三)