PDB 檔案格式¶
簡介¶
PDB (程式資料庫) 是由 Microsoft 發明的一種檔案格式,其中包含可供偵錯工具和其他工具使用的偵錯資訊。由於 Windows 上存在官方支援的 API,即使使用者不了解檔案格式的內部結構,也能從 PDB 查詢偵錯資訊,因此已為 Windows 建構了一個龐大的工具生態系統來使用此格式。為了使 Clang 能夠產生可與這些工具互通操作的程式,我們必須自行產生 PDB 檔案。
同時,LLVM 在能夠從任何平台交叉編譯到任何平台方面,有著悠久的歷史,我們希望在這裡也能實現同樣的目標。因此,我們有必要在位元組層級理解 PDB 檔案格式,以便完全獨立地產生 PDB 檔案。
本手冊描述了我們今天對 PDB 檔案格式的了解。包括檔案的佈局、其中包含的各種串流、串流中個別記錄的格式等等。
我們衷心感謝 Microsoft,沒有他們,我們就不會有今天的成就。本手冊中包含的許多知識是透過閱讀 Microsoft 在其 GitHub 儲存庫 上發布的程式碼而學到的。
檔案佈局¶
重要
除非另有說明,否則所有數值都以小端位元組序編碼。如果您在接下來看到諸如 uint16_t
或 uint64_t
之類的類型,請始終假定它是小端序!
MSF 容器¶
PDB 檔案是一種 MSF (多串流格式) 檔案。MSF 檔案是「檔案中的檔案系統」。它包含多個串流 (又稱檔案),可以表示任意資料,這些串流被劃分為區塊,這些區塊不一定在 MSF 容器檔案中連續佈局。此外,MSF 包含一個串流目錄 (又稱 MFT),用於描述串流 (檔案) 在 MSF 中的佈局方式。
有關 MSF 容器格式、串流目錄和區塊佈局的更多資訊,請參閱 MSF 檔案格式。
串流¶
PDB 格式包含許多串流,用於描述程式的各種資訊,例如類型、符號、原始碼檔案和編譯單元 (例如,物件檔案),以及一些額外的串流,其中包含雜湊表,偵錯工具和其他工具使用這些雜湊表來按名稱快速查找記錄和類型,以及有關程式編譯方式的各種其他資訊,例如使用的特定工具鏈等等。PDB 檔案中包含的串流摘要如下
名稱 |
串流索引 |
內容 |
---|---|---|
舊目錄 |
|
|
PDB 串流 |
|
|
TPI 串流 |
|
|
DBI 串流 |
|
|
IPI 串流 |
|
|
/LinkInfo |
|
|
/src/headerblock |
|
|
/names |
|
|
模組資訊串流 |
|
|
公用串流 |
|
|
全域串流 |
|
|
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 類型記錄 的頁面。