我试图在Unix中使用addr2line命令,但每次它都提供与?:0相同的输出。我以addr2line -e a.out 0x4005BDC的身份下达命令。在使用a.out工具运行这个valgrind可执行文件以查找内存泄漏时,我获得了这个地址。我还用-g选项编译了源代码。
发布于 2011-10-04 13:45:13
您还可以使用gdb代替addr2line来检查内存地址。在gdb中加载可执行文件,并打印存储在地址中的符号的名称。16检查文号表。
(gdb) info symbol 0x4005BDC 发布于 2011-10-04 15:35:49
您需要为addr2line指定一个偏移量,而不是虚拟地址(VA)。假设您关闭了地址空间随机化,您可以使用一个完整的VA,但是在大多数现代OSes中,地址空间是随机的,用于一个新的过程。
给定VA 0x4005BDC,请在内存中查找进程或库的基本地址。通过在程序运行时检查/proc/<PID>/maps文件来做到这一点。感兴趣的是进程的text段,它可以通过权限r-xp和程序或库的名称来标识。
假设基础VA是0x0x4005000。然后,您会发现提供的VA和基本VA:0xbdc之间的差别。然后,提供给add2line:
addr2line -e a.out -j .text 0xbdc看看能不能给你电话号码。
发布于 2011-10-04 13:40:21
你就是这么用的。但是,您拥有的地址有可能与源代码中的某些内容不直接对应。
例如:
$ 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的地址。0x400408也是a.out中的一个有效函数地址,但是它是GCC生成/导入的一段代码,没有调试信息。(在本例中,是__libc_csu_init。您可以使用readelf -a your_exe查看可执行文件的布局。)
其他情况下,addr2line将失败的情况是,您是否包含一个没有调试信息的库。
https://stackoverflow.com/questions/7648642
复制相似问题