首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Linux中使用addr2line命令?

如何在Linux中使用addr2line命令?
EN

Stack Overflow用户
提问于 2011-10-04 13:28:08
回答 4查看 124.8K关注 0票数 56

我试图在Unix中使用addr2line命令,但每次它都提供与?:0相同的输出。我以addr2line -e a.out 0x4005BDC的身份下达命令。在使用a.out工具运行这个valgrind可执行文件以查找内存泄漏时,我获得了这个地址。我还用-g选项编译了源代码。

EN

回答 4

Stack Overflow用户

发布于 2011-10-04 13:45:13

您还可以使用gdb代替addr2line来检查内存地址。在gdb中加载可执行文件,并打印存储在地址中的符号的名称。16检查文号表

代码语言:javascript
复制
(gdb) info symbol 0x4005BDC 
票数 36
EN

Stack Overflow用户

发布于 2011-10-04 15:35:49

您需要为addr2line指定一个偏移量,而不是虚拟地址(VA)。假设您关闭了地址空间随机化,您可以使用一个完整的VA,但是在大多数现代OSes中,地址空间是随机的,用于一个新的过程。

给定VA 0x4005BDC,请在内存中查找进程或库的基本地址。通过在程序运行时检查/proc/<PID>/maps文件来做到这一点。感兴趣的是进程的text段,它可以通过权限r-xp和程序或库的名称来标识。

假设基础VA是0x0x4005000。然后,您会发现提供的VA和基本VA:0xbdc之间的差别。然后,提供给add2line:

代码语言:javascript
复制
addr2line -e a.out -j .text 0xbdc

看看能不能给你电话号码。

票数 26
EN

Stack Overflow用户

发布于 2011-10-04 13:40:21

你就是这么用的。但是,您拥有的地址有可能与源代码中的某些内容不直接对应。

例如:

代码语言:javascript
复制
$ 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

在我的例子中,0x400534main的地址。0x400408也是a.out中的一个有效函数地址,但是它是GCC生成/导入的一段代码,没有调试信息。(在本例中,是__libc_csu_init。您可以使用readelf -a your_exe查看可执行文件的布局。)

其他情况下,addr2line将失败的情况是,您是否包含一个没有调试信息的库。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7648642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档