3

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

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

  2. 二进制中的地址与其源中的行号有什么关系,那么 addr2line 可以做这种映射吗?

4

1 回答 1

5

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

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

您可以使用strip(1)实用程序从某些 ELF可执行文件中删除调试信息(和其他符号表等)。

于 2017-01-01T18:02:35.723 回答