PDB 檔案格式

簡介

PDB (程式資料庫) 是由 Microsoft 發明的一種檔案格式,其中包含可供偵錯工具和其他工具使用的偵錯資訊。由於 Windows 上存在官方支援的 API,即使使用者不了解檔案格式的內部結構,也能從 PDB 查詢偵錯資訊,因此已為 Windows 建構了一個龐大的工具生態系統來使用此格式。為了使 Clang 能夠產生可與這些工具互通操作的程式,我們必須自行產生 PDB 檔案。

同時,LLVM 在能夠從任何平台交叉編譯到任何平台方面,有著悠久的歷史,我們希望在這裡也能實現同樣的目標。因此,我們有必要在位元組層級理解 PDB 檔案格式,以便完全獨立地產生 PDB 檔案。

本手冊描述了我們今天對 PDB 檔案格式的了解。包括檔案的佈局、其中包含的各種串流、串流中個別記錄的格式等等。

我們衷心感謝 Microsoft,沒有他們,我們就不會有今天的成就。本手冊中包含的許多知識是透過閱讀 Microsoft 在其 GitHub 儲存庫 上發布的程式碼而學到的。

檔案佈局

重要

除非另有說明,否則所有數值都以小端位元組序編碼。如果您在接下來看到諸如 uint16_tuint64_t 之類的類型,請始終假定它是小端序!

MSF 容器

PDB 檔案是一種 MSF (多串流格式) 檔案。MSF 檔案是「檔案中的檔案系統」。它包含多個串流 (又稱檔案),可以表示任意資料,這些串流被劃分為區塊,這些區塊不一定在 MSF 容器檔案中連續佈局。此外,MSF 包含一個串流目錄 (又稱 MFT),用於描述串流 (檔案) 在 MSF 中的佈局方式。

有關 MSF 容器格式、串流目錄和區塊佈局的更多資訊,請參閱 MSF 檔案格式

串流

PDB 格式包含許多串流,用於描述程式的各種資訊,例如類型、符號、原始碼檔案和編譯單元 (例如,物件檔案),以及一些額外的串流,其中包含雜湊表,偵錯工具和其他工具使用這些雜湊表來按名稱快速查找記錄和類型,以及有關程式編譯方式的各種其他資訊,例如使用的特定工具鏈等等。PDB 檔案中包含的串流摘要如下

名稱

串流索引

內容

舊目錄

  • 固定串流索引 0

  • 先前的 MSF 串流目錄

PDB 串流

  • 固定串流索引 1

  • 基本檔案資訊

  • 將 EXE 與此 PDB 匹配的欄位

  • 具名串流到串流索引的映射

TPI 串流

  • 固定串流索引 2

  • CodeView 類型記錄

  • TPI 雜湊串流的索引

DBI 串流

  • 固定串流索引 3

  • 模組/編譯單元資訊

  • 個別模組串流的索引

  • 公用/全域串流的索引

  • 區段貢獻資訊

  • 原始碼檔案資訊

  • 包含 FPO/PGO 資料的串流參考

IPI 串流

  • 固定串流索引 4

  • CodeView 類型記錄

  • IPI 雜湊串流的索引

/LinkInfo

  • 包含在 PDB 串流具名串流映射中

  • 未知

/src/headerblock

  • 包含在 PDB 串流具名串流映射中

  • 嵌入式原始碼檔案內容摘要 (例如 natvis 檔案)

/names

  • 包含在 PDB 串流具名串流映射中

  • 用於字串去重複的 PDB 全域字串表

模組資訊串流

  • 包含在 DBI 串流中

  • 每個編譯單元一個

  • 此模組的 CodeView 符號記錄

  • 行號資訊

公用串流

  • 包含在 DBI 串流中

  • 公用 (匯出) 符號記錄

  • 公用雜湊串流的索引

全域串流

  • 包含在 DBI 串流中

  • 單一組合符號表

  • 全域雜湊串流的索引

TPI 雜湊串流

  • 包含在 TPI 串流中

  • 用於按名稱查找 TPI 記錄的雜湊表

IPI 雜湊串流

  • 包含在 IPI 串流中

  • 用於按名稱查找 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 類型記錄 的頁面。