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

How addr2line can locate the source file and the line of code?

addr2line 将地址转换为文件名和行号。刚开始调试,对addr2line有一些疑问

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

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

一般来说,addr2lineELF executables or shared libraries with debug information. That debug information is emitted by the compiler when you pass -g (or -g2, etc...) to GCC. It notably provides a mapping between source code location (name of source file, line number, column number) and functions, variable names, call stack frame organization, etc etc... The debug information is today in DWARF format (and is also processed by the gdb debugger, the libbacktrace library 上效果最好,等等...)。请注意,调试信息包含源文件路径(而不是源文件本身)。

实际上,您可以(而且通常应该)将 -g(或 -g2)调试选项传递给 GCC even with optimization 标志,例如 -O2。在那种情况下,调试信息的精确度会稍差一些,但实际上仍然可用。在某些情况下,堆栈帧可能会消失(内联函数调用、尾调用优化......)。

您可以使用 strip(1) utility to remove debug information (and other symbol tables, etc) from some ELF executable.