如何在 Linux 中使用 addr2line 命令?
- 2024-10-24 08:51:00
- admin 原创
- 72
问题描述:
我尝试在 Unix 中使用 addr2line 命令,但每次它都给出与 ??:0 相同的输出。我给出的命令为addr2line -e a.out 0x4005BDC
。我在使用工具运行此 a.out 可执行valgrind
文件以查找内存泄漏时获得了此地址。我还使用选项编译了源代码-g
。
解决方案 1:
您还可以使用 gdb 代替 addr2line 来检查内存地址。在 gdb 中加载可执行文件并打印存储在该地址的符号的名称。16检查符号表。
(gdb) info symbol 0x4005BDC
解决方案 2:
您需要指定addr2line 的偏移量,而不是虚拟地址 (VA)。如果您关闭了地址空间随机化,则可以使用完整的 VA,但在大多数现代操作系统中,地址空间对于新进程都是随机的。
根据 valgrind 提供的 VA 0x4005BDC
,找到内存中进程或库的基地址。通过/proc/<PID>/maps
在程序运行时检查文件来执行此操作。感兴趣的行是text
进程的段,可通过权限r-xp
和程序或库的名称来识别。
假设基础 VA 是0x0x4005000
。然后,您将找到 valgrind 提供的 VA 与基础 VA 之间的差异:0xbdc
。然后,将其提供给 add2line:
addr2line -e a.out -j .text 0xbdc
看看是否可以得到您的线路号码。
解决方案 3:
这正是您的使用方式。不过,您拥有的地址可能并不直接对应于源代码中的某些内容。
例如:
$ cat t.c
#include <stdio.h>
int main()
{
printf("hello
");
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
会失败是因为您包含了一个没有调试信息的库。
解决方案 4:
尝试添加-f
显示函数名称的选项:
addr2line -f -e a.out 0x4005BDC
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD