2017-01-01 124 views
1

addr2line将地址转换为文件名和行号。我仍然是初学者在调试,并有一些关于addr2line的问题。addr2line如何定位源文件和代码行?

  1. 如果我调试了一定的.so(二进制)文件,该工具可以如何定位(从哪里可以得到它!) 它的源代码文件,如果源不存在呢?

  2. 二进制文件中的地址与源码中的行号码 之间的关系是什么,所以addr2line可以做这种映射吗?

回答

3

一般来说,addr2line效果最好的ELF可执行文件或调试信息的共享库。该调试信息由编译器在您pass -g(或-g2等)到GCC时发出。它特别提供了源代码位置(源文件的名称,行号,列号)和函数,变量名称,框架组织等等之间的映射......调试信息今天是DWARF格式(并且也由gdb debuggerlibbacktrace library等等)。请注意,调试信息包含源文件路径(不是源文件本身)。

在实践中,你可以(而且通常应该)通过-g(或-g2)调试选项GCC甚至optimization标志像-O2。在这种情况下,调试信息稍微不够精确,但实际上仍然可用。在某些情况下,堆栈帧可能会消失(内联函数调用,尾调用优化......)。

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

相关问题