PDB 檔案格式¶
簡介¶
PDB(程式資料庫)是由微軟發明的檔案格式,其中包含偵錯資訊,這些資訊可以被偵錯器和其他工具使用。由於在 Windows 上存在官方支援的 API,即使使用者不了解檔案格式的內部結構也可以從 PDB 中查詢偵錯資訊,因此已經為 Windows 建立了一個龐大的工具生態系統來使用這種格式。為了讓 Clang 能夠生成可以與這些工具交互操作的程式,我們必須自己生成 PDB 檔案。
同時,LLVM 長期以來一直能夠從任何平台交叉編譯到任何平台,我們希望在這裡也是如此。因此,我們有必要在位元組級別了解 PDB 檔案格式,以便我們可以完全自己生成 PDB 檔案。
本手冊描述了我們今天對 PDB 檔案格式的了解。檔案的佈局、其中包含的各種串流、個別記錄的格式等等。
我們要向微軟表示衷心的感謝,沒有他們,我們就無法取得今天的成就。本手冊中包含的許多知識都是通過閱讀微軟在其 GitHub 儲存庫 上發布的程式碼而學到的。
檔案佈局¶
重要
除非另有說明,否則所有數值均以小端序編碼。如果您在接下來看到 uint16_t
或 uint64_t
之類的類型,請始終假設它是小端序!
MSF 容器¶
PDB 檔案是一個 MSF(多串流格式)檔案。MSF 檔案是一個“檔案中的檔案系統”。它包含多個串流(也稱為檔案),這些串流可以表示任意數據,並且這些串流被分成多個區塊,這些區塊不一定在 MSF 容器檔案中連續佈局。此外,MSF 還包含一個串流目錄(也稱為 MFT),它描述了串流(檔案)在 MSF 中的佈局方式。
有關 MSF 容器格式、串流目錄和區塊佈局的更多資訊,請參閱 MSF 檔案格式。
串流¶
PDB 格式包含許多串流,這些串流描述了程式的各種資訊,例如程式的類型、符號、原始程式檔和編譯單元(例如目標檔),以及一些包含雜湊表的其他串流,偵錯器和其他工具使用這些雜湊表按名稱快速查找記錄和類型,以及有關程式編譯方式的各種其他資訊,例如使用的特定工具鏈等等。PDB 檔案中包含的串流摘要如下
名稱 |
串流索引 |
內容 |
---|---|---|
舊目錄 |
|
|
PDB 資料流 |
|
|
TPI 資料流 |
|
|
DBI 資料流 |
|
|
IPI 資料流 |
|
|
/連結資訊 |
|
|
/src/標題區塊 |
|
|
/名稱 |
|
|
模組資訊資料流 |
|
|
公開資料流 |
|
|
全域資料流 |
|
|
TPI 雜湊資料流 |
|
|
IPI 雜湊資料流 |
|
|
您可以在以下頁面中找到有關每個結構的更多資訊
- PDB 資訊資料流(又稱 PDB 資料流)
有關 PDB 資訊資料流以及如何使用它將 PDB 與 EXE 相符的資訊。
- PDB TPI 和 IPI 資料流
有關 TPI 資料流和其中包含的 CodeView 記錄的資訊。
- PDB DBI(偵錯資訊)資料流
有關 DBI 資料流和相關子資料流的資訊,包括模組子資料流、原始程式檔資訊和其中包含的 CodeView 符號記錄。
- 模組資訊資料流
有關模組資訊資料流的資訊,每個編譯單元都有一個,以及其中包含的符號格式。
- PDB 公開符號資料流
有關公開符號資料流的資訊。
- PDB 全域符號資料流
有關全域符號資料流的資訊。
- PDB 序列化雜湊表格式
有關內部用於表示諸如已命名資料流映射和TPI/IPI 資料流中的雜湊調整器之類的事物的序列化雜湊表格式的資訊。
CodeView¶
CodeView 是另一個出現的格式。雖然 MSF 定義了整個檔案的結構,PDB 定義了 MSF 檔案中出現的資料流集以及這些資料流的格式,但 CodeView 定義了出現在特定資料流中的**符號和類型記錄**的格式。如需有關 CodeView 格式的詳細資訊,請參閱CodeView 符號記錄和CodeView 類型記錄頁面。