PDB檔案詳解

2022-04-04 07:17:31 字數 2397 閱讀 6792

原文:

pdb檔案:每個開發人員都必須知道的

一 什麼是pdb檔案

大部分的開發人員應該都知道pdb檔案是用來幫助軟體的除錯的。但是他究竟是如何工作的呢,我們可能並不熟悉。本文描述了pdb檔案的儲存和內容。同時還描

述了debugger如何找到binay相應的pdb檔案,以及debugger如何找到與binay對應的源**檔案。本文適用於所有的native和

managed的開發人員。

在開始前,我們先定義2個術語:private build,

用來表示在開發人員自己機器上生成的build;public build,表示在公用的build機器上生成的build。private

build相對來說比較簡單,因為pdb和binay在相同的地方,通常地我們遇到的問題都是關於public build。 

所有的的開發人員需要知道的最重要的事情是」pdb檔案跟源**同樣的重要「,

沒有pdb檔案,你甚至不能debugging。對於public build,需要symbol

server儲存所有的pdb,然後當使用者報告錯誤的時候,debugger才可以自動地找到binay相應的pdb檔案, visual studio

和 windbg都知道如何訪問symbol server。在將pdb和binay儲存到symbol

server前,還需要對pdb執行進行source indexing, source indexing的作用是將pdb和source關聯起來。 

接下來的部分假設有已經設定好了symbol server和source server indexing。tfs2010中可以很簡單地完成對乙個新的build的source indexing 和 symbol server copying。

二 pdb檔案的內容

正式開始pdb的內容,pdb不是公開的檔案格式,但是microsoft提供了api來幫助從pdb中獲取資料。

native c++ pdb包含了如下的資訊:

* public,private 和static函式位址;

* 全域性變數的名字和位址;

* 引數和區域性變數的名字和在堆疊的偏移量;

* class,structure 和資料的型別定義;

* frame pointer omission 資料,用來在x86上的native堆疊的遍歷;

* 源**檔案的名字和行數;

.net pdb只包含了2部分資訊:

* 源**檔案名字和行數;

* 和區域性變數的名字;

* 所有的其他的資料都已經包含在了.net metadata中了; 

三 pdb如何工作

當你載入乙個模組到程序的位址空間的時候,debugger用2中資訊來找到相應的pdb檔案。第乙個毫無疑問就是檔案的名字,如果載入

zzz.dll,debugger則查詢zzz.pdb檔案。在檔案名字相同的情況下debugger還通過嵌入到pdb和binay的guid來確保

pdb和binay的真正的匹配。

所以即使沒有任何的**修改,昨天的binay和今天的pdb是不能匹配的。可以使用dempbin.exe來檢視binary的guid。

在visualstudio中的modules視窗的symbol

file列可以檢視pdb的load順序。第乙個搜尋的路徑是binary所在的路徑,如果不在binary所在的路徑,則查詢binary中hardcode記錄的build目錄,例如obj\debug\*.pdb,

如果以上兩個路徑都沒有找到pdb,則根據symbol server的設定,在本地的symbol

server的cache中查詢,如果在本地的symbol server的cache中沒有對應的pdb,則最後才到遠端的symbol

server中查詢。通過上面的查詢順序我們可以看出為什麼public build和private build的pdb查詢不會衝突。

對於private

在你開啟了development模式後,如果devpath沒有定義或路徑不存在的話會導致程式啟動時異常"invalid

value for

registry"。而且如果在machine.config中開啟devpath的使用會影響其他的所有的程式,所以要慎重使用machine.config。

最後開發人員需要知道的是源**資訊是如何儲存在pdb檔案中的。對於public builds,在執行source

indexing tool後,版本控制工具將**儲存到你設定的**cache中。對於private

builds,只是儲存了pdb檔案的全路徑,例如在c:\foo下的原始檔mycode.cpp,在pdb檔案中儲存的路徑為c:\foo\mycode.cpp。對於private

builds可以使用虛擬盤來增加pdb對絕對路徑的依賴,例如可以使用subst.exe將源**路徑掛載為v:,在別人的機器上debug的時候也掛載v:。

pdb檔案 小結

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

pdb檔案 小結

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

PDB符號檔案資訊

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