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