addr2line 如何定位源文件和代码行?


addr2line

将地址转换为文件名和行号。我仍然是调试的初学者,并且对addr2line有一些疑问。

  1. 如果正在调试某个 .so(二进制)文件,该工具如何定位 它的源代码文件(从哪里可以得到它!),如果源代码不存在怎么办?

  2. 二进制中的地址和行之间的关系是什么 数字在其源中,那么addr2line可以做这种映射吗?

一般来说,addr2line在 ELF 可执行文件或带有调试信息的共享库上效果最好。当您将-g(或-g2等)传递给 GCC 时,编译器会发出该调试信息。它特别提供了源代码位置(源文件的名称、行号、列号)和函数、变量名、调用堆栈帧组织等之间的映射。调试信息现在采用 DWARF 格式(并且也由gdb调试器、libbacktrace库等处理......请注意,调试信息包含源文件路径(而不是源文件本身)。

在实践中,您可以(并且通常应该)将-g(或-g2)调试选项传递给GCC,即使使用-O2这样的优化标志。在这种情况下,调试信息稍微不那么精确,但实际上仍然可用。在某些情况下,堆栈帧可能会消失(内联函数调用、尾部调用优化等)。

你可以使用 strip(1) 工具从一些 ELF 可执行文件中删除调试信息 (和其他符号表等)。

相关内容

最新更新