符号级调试基础

符号级调试,依赖于编译器、链接器生成的调试信息,调试信息如何生成是由不同的调试信息标准确定的,如DWARF调试信息。DWARF现在被广泛使用,如go语言编译工具链也是生成DWARF调试信息,gdb、delve等都支持基于DWARF调试信息进行调试。

下面我们提到调试信息,如不特殊强调,均指DWARF调试信息。这些调试信息又可以细分为多种类型,如描述数据类型的,描述变量的,描述函数定义的,或者描述符号表、行号表、调用栈信息表的,等等。

此外,不同的编程语言也会有自己的取舍,一方面兼容现有二进制工具生成必要sections的同时,可能也会生成一些额外的sections方便自己支持其他特性。

比如go语言编译器、链接器会生成DWARF调试信息供调试器使用,也会生成.symtab供readelf等通用的二进制分析工具使用,另外,它还额外生成.gosymtab、.gopclntab用于go程序运行时跟踪调用栈信息,生成.note.go.buildid来保留go buildid信息,等等。

不管是.symtab中的符号信息,还是.debug_*调试符号信息,还是.note*自定义vendor信息,都使用了“符号”这个术语,明确它们的不同是很重要的。.symtab是给一些通用的二进制分析工具使用的,.debug_*符号信息是给调试器使用的,.note*给语言等vendor留作扩展使用的。它们的设计目标、要解决的问题是不同的,读者朋友不要混淆。

接下来先介绍一些符号级调试必须掌握的基础知识,我们将在第9章进入符号级调试开发。

results matching ""

    No results matching ""