要使用上 Windows 平台提供的丰富工具,需要 LLVM 等编译器编写者可以生成 PDB 格式的文件。PDB,即程序调试数据库(Program Debug Database),是一种字符数据库,它描述了 Windows 平台上编译的代码。由于 PDF 文件中包含了各种类型的记录,因此它使得调试器等工具可以实现被编译代码和源代码间的映射。
出于提高性能的考虑,PDB 中的记录数据是高度索引的。问题也正部分源于此,LLVM 的 Windows 团队成员 Zach Turner 给出了如下介绍:
CodeView 是 Microsoft 在上世纪八十年代创立的一种调试信息格式。但是出于种种原因,其它的调试器另外开发了一种称为 DWARF 的独立格式。DWARF 格式最终成为了标准,当前得到了很多编译器和编程语言的支持。类似于 DWARD,CodeView 定义了一系列记录,描述了源代码行和代码地址间的映射,以及程序所使用的类型和符号。调试器进而使用这些信息,让用户可以实现通过函数名设置断点、显示变量的值等调试功能。但是 CodeView 的文档并不完整,而且最新的官方文档也是 20 年前的。尽管一些记录的格式并未发生变化,但是其它不少记录的格式已经进化了,并引入了全新记录。这些记录的文档并不存在。
[……]
(PDB 中)包括了 CodeView,此外还包括了很多其它的内容,以允许使用各种方式索引 CodeView 记录。这使得 PDB 可以支持通过名字和地址对类型和符号的快速查找、对于单个输入文件建立类似于“数据表”的功能,以及其它多种功能,这些功能虽然对用户是不可见的,但是它们在很大程度上实现了 Windows 上所提供的无与伦比的调试体验。
Microsoft 提供了一些操作 PDB 文件的工具和 SDK,但是并未提供任何可以生成 PDB 文件的工具。即便是这些工具,也需要使用一些专用库,因为开源 PDB 代码甚至从未得以编译。
根据由 Microsoft 上传的部分代码,LLVM 团队构建了自己的 PDB 生成器。虽然该生成器依然被认为是处于“试用版的质量”,但是它支持应用使用 CLANG 和 LLVM 后端编译,可以开始与 Windows 工具合作工作。Turner 继续指出:
我们希望用户能尝试使用该工具,并在我们的软件缺陷跟踪网站上报告问题。但是开始时,你需要下载用于 Windows 平台 Clang 的最新快照。
作为 LLVM 团队支持 PDB 格式的探索性工作的一部分, LLVM 构建了 PDB 格式的文档。虽然这些文档并非十分完善,但是对于查看这一从前并不可用的复杂格式,上述文档提供了一个重要的窗口。
作为文档的辅助工具,LLVM 团队还构建了一个称为 llvm-pdbutil 的工具。该工具的功能之一就是支持在 YAML 和 PDB 间的双向转换。(在此对不了解 YAML 的读者做一个简介。 YAML 是一种人们可阅读的格式,它使用的是空格而非大括号。YAML 可能是在 API 文档语言 RAML 所用的格式中最广为人知的。)
需指出的是,现实中存在着两种 PDB 格式。除了我们上面介绍的 PDB 完整版,还有一种称为 Portable PDB 的格式,该格式针对.NET Core 应用。为方便阅读, Portable PDB 的文档使用了开源库。
查看英文原文: LLVM has Documented the PDB Format, Complete with PDB to YAML Conversion
评论