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

时间:2017-01-01 17:57:59

标签: linux debugging addr2line

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

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

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

1 个答案:

答案 0 :(得分:4)

通常,addr2line最适用于ELF可执行文件或带有调试信息的共享库。当您pass -g(或-g2等等)到GCC时,编译器会发出调试信息。它特别提供了源代码位置(源文件名,行号,列号)和函数,变量名,call stack帧组织等等之间的映射...调试信息今天在{{3}格式(也由DWARFgdb debugger等处理......)。请注意,调试信息包含源文件路径(不是源文件本身)。

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

您可以使用GCC实用程序从某些ELF optimization中删除调试信息(以及其他符号表等)。