1

我正在使用 GCC ARM 交叉编译器 ( arm-none-eabi-*) 并且正在使用专有调试器。调试器可以突出显示选定源代码行的结果程序集。使用 nm 和 objdump,我可以看到二进制文件有多个.debug_*部分。很明显可以得出结论,调试器正在使用这些部分中包含的信息将源代码行映射到反汇编(反之亦然)。但我想怎么做。我想知道这些部分包含哪些信息,它们是如何相关的,以及如何理解它们。简而言之,如果我要编写一个调试器(或者至少是一个可以显示这些映射的工具:源到反汇编,以及每个源行的反汇编行数),我将如何阅读这些部分并使用它们. 假设零编译优化。

大概有一些文档描述了这些部分的格式?

4

1 回答 1

1

.debug_* 部分包含 DWARF 调试标准描述的格式的数据。该标准有一个网站,您可以在其中下载标准规范:http ://www.dwarfstd.org/

有可用于解析存储格式的库(高度压缩以节省空间),其中一个是 libdwarf,可在此处获得:http ://reality.sgiweb.org/davea/dwarf.html

简而言之,不同的部分包含源程序的不同方面,以及它们如何映射到目标机器架构(代码和数据地址)。在编译过程中通常会丢失的信息由调试信息条目树表示,它们是具有标识标签和各种属性的结构。例如,变量声明的 DIE 由带有DW_TAG_variable标签的 DIE 表示,并且可以具有以下属性:名称、声明它的文件/行/列、目标文件中的内存位置等。

.debug_info 和 .debug_abbrev 部分一起代表调试信息条目树。.debug_line 部分包含允许调试器重建完整的表将源代码行映射到目标代码地址的信息(并包含其他信息,例如源代码行是否是语句的开头,是否是语句的开头基本块等)。

其他部分包含调用框架信息,以及用于按名称快速查找可变 DIE 和类型的加速查找表等。这一切都在标准中描述。

于 2012-04-14T14:24:57.117 回答