PDB文件詳解

  1. PDB文件的介紹

PDB(Program Data Base),意即程序的基本數據,是VS編譯鏈接時生成的文件。DPB文件主要存儲了VS調試程序時所需要的基本信息,主要包括源文件名、變量名、函數名、FPO(幀指針)、對應的行號等等。因爲存儲的是調試信息,所以一般情況下PDB文件是在Debug模式下才會生成。

  1. PDB文件的調用過程

模塊(Module),EXE和DLL都可以稱之爲模塊,因爲它們都有自已獨立的Stack,所以我們在調試程序時,可以在Call Stack窗口查看到所有調用的Module Name。並且可以右鍵查看相應模塊的ybmol Load Information,即該模塊調用的PDB文件路徑的過程。

每個模塊被載入的時候,其相同名字的PDB文件同時被載入。所以Debug模式下,不僅因爲代碼沒有優化,同時因爲要載入PDB文件,所以Debug模式下的程序執行速度非常慢。

每個模塊只會生成一個相同名字的PDB文件,並且模塊生成的同時,會校驗PDB文件生成GUID記錄在模塊內。這是因爲調試時,調試器強制要求每個模塊必須和PDB文件保持一致。實驗過程中,用之前生成的PDB文件替換當前生成的PDB文件時,Debug窗口會顯示No symbols loaded. MSDN也做了相應的說明:The debugger will load only a PDB for a binary that exactly matches the PDB that was created when the binary was built.

PDB文件中記錄了源文件路徑的相關信息,所以在載入PDB文件的時候,就可以將相關調試信息與源碼對應。這樣可以可視化的實時查看調試時的函數調用、變量值等相關信息。模塊當中記錄的PDB文件是絕對路徑。所以只要模塊在當前電腦上載入,調試器自然地會根據模塊當中的路徑信息找到相應PDB文件並載入。同樣PDB文件中記錄的源文件路徑也是絕對路徑,所以PDB文件只要在當前電腦上載入,調試進入相應模塊時,都能夠匹配到記錄的源文件,然後可視化地查看相應信息。

如果源文件找不到,那麼依然能夠查看調試信息,只是這個時候只能查看彙編代碼,不能通過源文件可視化查看信息。一般情況下,絕大多數C++程序員不具備閱讀彙編代碼的能力。所以完全通過PDB文件調試,意義與作用均沒有多大。如果要讓其他人能夠調試自已的代碼,PDB文件和源碼都應該提供,只提供PDB文件的意義不大。如果確實有類似的需求,可以保留相應生成的PDB文件。微軟的很多庫默認是不提供PDB文件的,但是近來微軟逐漸開放了一些庫的PDB文件。

  1. VS搜索PDB文件的路徑順序

MSDN中詳細的講述:

1. The Visual Studio debugger uses the path to the PDB in the EXE or DLL file to find the project.PDB file.

2. If the debugger cannot find the PDB file at that location or if the path is invalid (for example, if the project was moved to another computer), the debugger searches the path containing the EXE.

3. the symbol paths specified in the Options dialog box (Debugging folder, Symbols node).

1是默認當前路徑,2是編譯鏈接時記錄在模塊當中的路徑。現在重點說3,即設置符號文件路徑。

通過Options->Debuggin->Symbols或在Call Stack窗口右鍵找到Symbol Settings打開下面的窗口。

 

我將PDF的生成路徑調整到D:\,調試時將PFB文件剪切到D:\Other目錄。

 

然後調試進入dll模塊時,右鍵在Call Stack對應的Module上選擇查看Symbol Load Information.

 

通過上圖即可以看到VS加載PDB文件的順序,這與MSDN中介紹的是一樣的。

Symbol Settings窗口裏,還可以從服務器上緩存符號文件,可是我試了很多方式,均沒有成功。

爲什麼講這個設置符號文件呢?因爲有時候,有些項目非常龐大,並且代碼是共享的,所以代碼會放到服務器上。很多很大PDB調試文件,如果拷貝到本地電腦上比較麻煩。這個時候,就可以指定網絡路徑,直接通過網絡路徑調試。

  1. 靜態庫的PDB文件

靜態庫也有自已的PDB文件,只不過其名字是VC80.PDB/VC100.PDB這樣的名字。靜態庫的PDB文件會在鏈接時合併到EXE/DLL的PDB文件中去。如果生成的靜態庫lib裏有記錄相應的PDB文件,卻又沒有相應的PDB文件,那麼靜態庫鏈接成EXE/DLL時就會報警告找不到靜態庫對應的PDB文件。所以如果靜態庫作第三方庫發佈時,可以不用生成PDB文件,這樣調用者鏈接時就不會報警告。

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