addr2line
将地址转换为文件名和行号。我仍然是调试的初学者,并且对 addr2line 有一些疑问。
如果正在调试某个 .so(二进制)文件,该工具如何定位其源代码文件(从哪里可以得到它!),如果源不存在怎么办?
二进制中的地址与其源中的行号有什么关系,那么 addr2line 可以做这种映射吗?
一般来说,在ELF可执行文件或带有调试信息的共享库addr2line
上效果最好。当您将(或等...)传递给GCC时,编译器会发出该调试信息。它特别提供了源代码位置(源文件名、行号、列号)和函数、变量名、调用堆栈框架组织等之间的映射......调试信息今天是DWARF格式(并且也经过处理由调试器、库等...)。请注意,调试信息包含源文件路径(而不是源文件本身)。-g
-g2
gdb
libbacktrace
在实践中,您可以(并且经常应该)将-g
(或-g2
)调试选项传递给GCC ,即使带有-O2
. 在这种情况下,调试信息会稍微不那么精确,但实际上仍然可用。在某些情况下,堆栈帧可能会消失(内联函数调用、尾调用优化......)。
您可以使用strip(1)实用程序从某些 ELF可执行文件中删除调试信息(和其他符号表等)。