PDB 檔案格式

簡介

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

同時,LLVM 長期以來一直能夠從任何平台交叉編譯到任何平台,我們希望在這裡也是如此。因此,我們有必要在位元組級別了解 PDB 檔案格式,以便我們可以完全自己生成 PDB 檔案。

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

我們要向微軟表示衷心的感謝,沒有他們,我們就無法取得今天的成就。本手冊中包含的許多知識都是通過閱讀微軟在其 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 雜湊資料流的索引

/連結資訊

  • 包含在 PDB 資料流已命名資料流映射中

  • 未知

/src/標題區塊

  • 包含在 PDB 資料流已命名資料流映射中

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

/名稱

  • 包含在 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 類型記錄頁面。