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 类型记录 的页面。