• 如何调试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!!!

  • 相关阅读:
    java----session
    js封装成插件-------Canvas统计图插件编写
    js封装成插件
    js学习--变量作用域和作用域链
    学习js函数--自执行函数
    学习js函数--函数定义
    footer不满一屏时在最底部,超出一屏时在页面最下部
    ios 点击区域阴影问题
    提交表单后数据返回时间过长
    点击显示video
  • 原文地址:https://www.cnblogs.com/graphics/p/1984200.html
Copyright © 2020-2023  润新知