addr2line

addr2line是binutils工具集的一部分,用于将程序的指令地址转换为对应的函数名和源文件行号,便于调试。在嵌入式开发和C/C++程序调试中,addr2line能帮助开发者定位代码中的问题。通过选项如-f和-e,可以获取更详细的信息。在实际使用中,addr2line结合dmesg或调试信息,能够将地址转换为有意义的函数和源代码位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

binutils工具集之---addr2line

 

addr2line用于得到程序指令地址所对应的函数,以及函数所在的源文件名和行号。

在不少嵌入式开发环境中,编译器的名称往往不是gcc,而是想arm-rtems-gcc这样的,对于这种命名形式的编译器,读者通常可以找到arm-rtems-addr2line ,arm-rtems-objdump等相应名称的工具,这是GNU工具集的一种命名惯例。

本文并不是binutils工具集的完整参考手册,当需要得到更为详细的帮助信息时,可以参照对应工具的man和info信息。另一个更为简单的方法时运行相应的工具并指定--help参数,可以获得该工具的简单帮助信息。

用法:addr2line [选项] [地址]
将地址转换成文件名/行号对。
如果没有在命令行中给出地址,就从标准输入中读取它们
选项是:
@<file> 读取选项从 <file>
-a --addresses 显示地址
-b --target=<bfdname> 设置二进位文件格式
-e --exe=<executable><name> 设置输入文件名称(默认为 a.out)
-i --inlines 解开内联函数
-j --section=<name> 读取相对于段的偏移而非地址
-p --pretty-print 让输出对人类更可读
-s --basenames 去除目录名
-f --functions 显示函数名
-C --demangle[=style] 解码函数名
-h --help 显示本帮助

实战操练:

建立main.c文件如下:

输入:

gcc -g main.c -o app -Wall

一定要加-g选项,不然没有调试信息。

编译没有任何警告(作为gcc来说不应该啊^_^)

运行

显示段错误。使用dmesg(该命令可以参考https://linux.cn/article-3587-1.html)追踪:

注意最后一行 app 可执行文件的描述:segfault(段错误)ip为4004e6这就是程序执行出错的位置。这时,addr2line登场:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值