[关闭]
@Rays 2017-08-23T08:28:00.000000Z 字数 1504 阅读 1954

LLVM构建了PDB文档,并提供了PDB与YAML的转换工具

语言开发


摘要: LLVM现在可以生成PDB文件,这使得使用Windows调试工具成为可能。此外,LLVM团队还构建了PDB格式的文档,并创建了从YAML生成PDB的分析工具。

作者: Jonathan Allen

正文:

要使用上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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注