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 哈希流索引

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