1. 程式人生 > >讓Visual Studio載入Symbol(pdb)檔案

讓Visual Studio載入Symbol(pdb)檔案

Visual Studio載入Symbolpdb)檔案

VC編譯工程的編譯連線階段,會產生Symbol檔案,也就是常說的 pdb 檔案。pdb 的全稱為 program database,在 MSDN 中的解釋為,pdb 檔案是一個在編譯和連結階段產生的,包含了型別和除錯符號資訊的二進位制檔案。pdb 檔案中包含了各個函式的符號表,也是進行 WinDbg 除錯必不可少的檔案。

既然 pdb 檔案是給偵錯程式使用的,那麼 Visual Studio 偵錯程式也就可以使用之。通過如下設定,Visual Studio 便可以在除錯過程中載入 pdb 檔案了。

Tools --> Options --> Debugging

在“Symbol file (.pdb) locations:”下面的控制元件中輸入微軟預設 pdb 檔案的下載路徑“http://msdl.microsoft.com/download/symbols”。

在“Cache symbols from symbol servers to this directory:”下的編輯框中輸入本地儲存路徑,如:D:/WinSymbols/MsDownSymbols

下面兩個 CheckBox 的意思分別為:

Search the above locations only when symbols are loaded manually”。

偵錯程式僅僅載入手動載入的 Symbol

。勾上此選項,除錯速度會更快,但 pdb 載入相對較少,除錯資訊較少,建議不勾選。

Load symbols using the updated settings when the dialog is closed”

對話方塊關閉後,立刻載入符號表。勾上此選項可以立刻看到效果,除錯速度當然會稍微慢一點,建議勾選。

點選 OK 關閉對話方塊,設定便生效了。

如圖所示:

 

設定過了,當然要看看效果啦。

我們先看看正常情況下 CallStack 的狀態,建立一個普通 Win32 程式,在InitInstance入口下個斷點,F5開啟除錯,在 CallStack 視窗如下顯示: 

我們可以看到,在最下面兩行中,資訊是灰掉的,kernel32.dll

中那個函式呼叫了我們的wWinMainCRTStartup也看不到,程序最開始由哪個函式建立也看不到。

現在看看設定了 Symbol CallStack 的狀態,建立一個普通 Win32 程式,在InitInstance入口下個斷點,F5開啟除錯,在 CallStack 視窗如下顯示: 

我們可以看到,程式是由kernel32.dll中的匯出函式“_BaseProcessStart”開始的,_BaseProcessStart呼叫了我們的wWinMainCRTStartup函式,然後程式就執行起來了。

當然設定 Symbol 的用處遠遠不止這些,其餘的就等您慢慢發現。

注:設定 Symbol 之後,除錯速度會慢下來,如果無需知道系統函式是如何呼叫的,建議除錯時不設定 Symbol