我正在尝试在Unix中使用addr2line命令,但每次输出都是??:0。我使用的命令是addr2line -e a.out 0x4005BDC
。我在运行这个a.out可执行文件时使用了valgrind
工具来查找内存泄漏时得到了这个地址。我还使用了-g
选项编译源代码。
你也可以使用gdb而不是addr2line来检查内存地址。在gdb中加载可执行文件并打印储存在该地址的符号的名称。16 检查符号表。
(gdb) info symbol 0x4005BDC
addr2line -e a.out -j .text 0xbdc
再看看这是否能给你提供行号。
这就是正确使用它的方式。但是有可能你所拥有的地址并没有直接对应于你的源代码。
例如:
$ cat t.c
#include <stdio.h>
int main()
{
printf("hello\n");
return 0;
}
$ gcc -g t.c
$ addr2line -e a.out 0x400534
/tmp/t.c:3
$ addr2line -e a.out 0x400550
??:0
0x400534
是我这个程序中 main
函数的地址。在 a.out
中,0x400408
也是一个有效的函数地址,但它是由 GCC 生成或导入的一段代码,没有调试信息(在这种情况下,是 __libc_csu_init
)。你可以使用 readelf -a your_exe
命令查看可执行文件的布局。
另外,当你包含没有调试信息的库时,addr2line
也会失败。
-f
选项以显示函数名称:
尝试添加-f
选项以显示函数名称:
addr2line -f -e a.out 0x4005BDC