pdb檔案 小結

2021-07-09 07:04:44 字數 1333 閱讀 6382

**:

.pdb檔案,是vs生成的用於除錯的符號檔案(program database),儲存著除錯的資訊。在vs的工程屬性,c/c++,除錯資訊格式,設定/zi,那麼vs就會在構建專案時建立pdb檔案。

在這裡要區分兩種情況:

1、構建靜態庫時,可以在工程屬性 –> c/c++ –> 輸出檔案 –> 程式資料庫名 設定生成的pdb檔名稱,如果不指定,預設是生成為vcx0.pdb,這裡x是vs版本號,例如用vs2005,就會生成vc80.pdb。這裡就會產生乙個疑問,編譯靜態庫時預設生成的.pdb檔案名字都一樣,那引用這個靜態庫的專案最後能找到正確的.pdb檔案嗎?答案是肯定的,因為vs會在生成的檔案中嵌入 .pdb 檔案的路徑。

舉個例子,在project/toola下,構建了乙個靜態庫toola.lib,對應生成乙個vc80.pdb,同樣在在project/toolb下,構建了乙個靜態庫toolb.lib,對應生成乙個vc80.pdb。然後最終的工程work.exe同時鏈結了這兩個靜態庫.這時,生成work.pdb的時候,就會在toola.lib中找到它對應的符號檔案路徑project/toola/vc80.pdb,以及toolb.lib對應的符號檔案路徑project/toolb/vc80.pdb,合併生成最終工程的work.pdb。

2、構建可執行檔案或動態庫,這種情況下,編譯器會生成乙個.pdb檔案,鏈結器會生成乙個.pdb檔案,編譯器生成的pdb檔案可以在在工程屬性 –> c/c++ –> 輸出檔案 –> 程式資料庫名 設定,鏈結器生成的.pdb檔案可以在工程屬性 –> 鏈結器 –> 除錯 –> 生成除錯資訊(設定yes),生成程式資料庫名設定。

這兩個pdb檔案有什麼不一樣呢?編譯器生成的pdb檔案,預設也是用vcx0命名,是編譯器在編譯過程中,把每個.obj檔案對應的符號資訊儲存在其中的,但不包括函式定義。而鏈結器生成的.pdb檔案,預設使用工程名命名,是鏈結器在鏈結工程時,根據編譯器生成的vcx0.pdb再進一步加工出來的,具有完整資訊的符號檔案。就像鏈結器根據各個.obj檔案生成exe或dll一樣,編譯器生成的.pdb檔案是編譯-鏈結過程的中間產物,最後用於除錯程式的是鏈結器生成的projectname.pdb.

上面說的是pdb檔案生成規則。在使用的時候,調時期會取到檔案對應的pdb檔案路徑,然後去那個路徑(絕對路徑)下找,如果這個exe或者dll是自己編的,那無論它放在**,pdb檔案只要不動,偵錯程式都能找到它。如果偵錯程式在那個路徑下找不到,就會到exe或者dll的同級目錄找。例如這個工程是別人編出來的,連同符號檔案一起發過來,我們只要把符號檔案與exe或者dll放在同級目錄,偵錯程式也能找到它。當然,在偵錯程式中也可以自己指定符號檔案路徑。

這兩天糾結專案中各種靜態庫,動態庫,可執行檔案的除錯以及對應的符號檔案,總算搞清楚pdb檔案的生成以及使用規則,在此總結記錄一下。

pdb檔案 小結

pdb檔案,是vs生成的用於除錯的符號檔案 program database 儲存著除錯的資訊。在vs的工程屬性,c c 除錯資訊格式,設定 zi,那麼vs就會在構建專案時建立pdb檔案。在這裡要區分兩種情況 1 構建靜態庫時,可以在工程屬性 c c 輸出檔案 程式資料庫名 設定生成的pdb檔名稱,...

PDB檔案詳解

原文 pdb檔案 每個開發人員都必須知道的 一 什麼是pdb檔案 大部分的開發人員應該都知道pdb檔案是用來幫助軟體的除錯的。但是他究竟是如何工作的呢,我們可能並不熟悉。本文描述了pdb檔案的儲存和內容。同時還描 述了debugger如何找到binay相應的pdb檔案,以及debugger如何找到與...

PDB符號檔案資訊

一 前言 這個方法是通過網上的一些方式自己學習列舉pdb檔案資訊。二 實現 首先列舉驅動檔案,這裡用psapi庫 include psapi.h pragma comment lib,psapi.lib void cenumpdbdlg enummodule 獲得基位址 if enumdeviced...