如何調試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。運行後如下圖。

由於我機器上安裝的是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窗口裏面的信息是最全面,最直觀的。應該儘可能參考此處的信息。

更豐富的調試信息

使用 #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文件夾下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章