pdb是指「程式資料庫」文件,是VS編譯連結時產生的文件。 DPB檔案主要儲存了VS偵錯程式時所需的基本訊息,主要包括來源檔案名稱、變數名稱、函數名稱、FPO、對應的行號等等。 PDB檔案是在編譯工程的時候產生的,它是和對應的模組一起產生出來的。
本教學操作環境:windows7系統、Dell G3電腦。
PDB(Program DataBase),全稱為「程式資料庫」文件,是VS編譯連結時產生的檔案。 DPB檔案主要儲存了VS偵錯程式時所需的基本訊息,主要包括來源檔案名稱、變數名稱、函數名稱、FPO(幀指標)、對應的行號等等。因為儲存的是偵錯訊息,所以一般情況下PDB檔案是在Debug模式下才會產生。
PDB檔案中記錄了來源檔案路徑的相關訊息,所以在載入PDB檔案的時候,就可以將相關偵錯資訊與原始碼對應。這樣可以視覺化的即時查看偵錯時的函數呼叫、變數值等相關資訊。模組當中記錄的PDB檔案是絕對路徑。所以只要模組在目前電腦上載入,偵錯器自然會根據模組當中的路徑資訊找到對應PDB檔案並載入。同樣PDB檔案中記錄的來源檔案路徑也是絕對路徑,所以PDB檔案只要在目前電腦上載入,調試進入對應模組時,都能夠配對到記錄的來源文件,然後視覺化地檢視對應資訊。
PDB檔案什麼時候產生?
PDB檔案是在我們編譯工程的時候產生的,它是和對應的模組(exe或dll)一起產生出來的。我們一般可能不會意識到PDB文件的重要性,因為如果只是我們在本地進行開發,我們總是能夠進行調適。這裡我要介紹兩個概念:Private Build和Public Build1。 Private Build指的是開發機器上的編譯,Public Build指的是負責編譯的機器上的編譯。
正如上面我所說Private Build一般不會有問題,因為在編譯出來的機器上進行調試所有必要的文件都在該在的地方。所有大部分不能調試的問題都發生在Public Build的情況下。
如果你的應用程式需要發布或當作產品賣得,你就需要特別注意要保存你發佈出去的那個版本的PDB檔案和原始檔。注意:你只有一次機會保存發佈出去的PDB文件,如果你弄丟了將無法找回。 2(原因下面說明)
為什麼PDB這麼重要?
也許你會認為如果拿一份一模一樣的原始碼重新編譯一個PDB文件,然後用來調試就行了。我也曾經這麼認為過,直到有一天…......
直接的原因是因為VS生成出來的二進位檔案的Header部分裡麵包含了它對應的PDB的GUID,PDB也包含一個GUIID,這兩個GUID實在編譯的時候加進去的。 VS調試器在載入PDB的時候會去比對這個兩個GUID,如果不一致,那就不能使用。
當然上面那個原因只是一個表面現象,根本原因是既是兩份一模一樣的程式碼編譯器編譯出來的檔案可能是不一樣的。因為編譯器在編譯的時候會對程式碼進行最佳化,而同一份程式碼可能會有很多種最佳化的方法,它會根據當時的特定機器的環境等情況選擇一個最快的生成方法。所以它產生出來的檔案有可能是不一樣的!所以如果連產生出來的檔案都不一樣,那麼原來的那個PDB裡面的符號對應的位址就沒有意義了。
如何查看二進位檔案和PDB的GUID?
使用VS自帶的DUMPBIN工具可以查看二進位檔案所期望的PDB的GUID。基本用法就是DUMPBIN /HEADER 文件,具體用可可參考MSDN(http://msdn.microsoft.com/zh-cn/library/c1h23y6c(v=vs.80).aspx)。
查看PDB的GUID可以用下面這個工具,直接將PDB拉進去即可。
http://www.codeproject.com/Articles/37456/How-To-Inspect-the-Content-of-a-Program-Database-P
#PDB檔案的尋找策略
先上試驗結果,可以再調試的時候從Visual Studio 的Module串口中查找到一個module的symbol的查找策略。從截圖中我們可以看到結果如下:
1. 文件被執行或被載入的位址
2. 就是硬編碼在PE文件頭中的那個地址。大家可以看到obj\
2.5 如果設定了符號伺服器,第二步以後應該先去符號伺服器的快取目錄下找,如果找不到再去符號伺服器上去找。找到的話就會下載到快取目錄。
3. 第三部分是我VS中設定的一些符號查詢的目錄,因為我裝過Reflector所以預設加了這幾個目錄在我的設定中。
4. Windows資料夾。
這裡有一個比較有趣的現象就是,VS的查找策略都是會先找一個目錄下的symbol\exe\project.pdb,然後exe\project.pdb,最後才找project.pdb。這個順序有點出乎意料。
PDB檔案會影響效能麼?
可能有些人會覺得PDB檔案的產生會對最終的應用程式的效能產生一定的影響,所以覺得在發布版中不應該產生PDB檔案。
錯誤!對於.NET應用程式來說,產生PDB檔案不會影響編譯器的最佳化,所以也完全不會影響應用程式的效能。只會對於產生的程式集中的一個DebuggableAttribute的屬性產生影響。有興趣的人可以閱讀Do PDB Files Affect Performance?
相關影片教學推薦:《ASP.NET教學》
以上是pdb是什麼檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!