addr2line工具使用

2 篇文章 0 订阅
1 篇文章 0 订阅

addr2line工具是一个可以将指令的地址和可执行映像转换为文件名、函数名和源代码行数的工具。这在内核执行过程中出现崩溃时,可用于快速定位出出错的位置,进而找出代码的bug。

用法

addr2line [-a| --addresses ] [-b bfdname | --target=bfdname] [-C | --demangle[=style]] [-e filename | --exe=filename] [-f | --function] [-s | --basename] [-i | --inlines] [-p | --pretty-print] [-j | --section=name] [-H | --help] [-V | --version] [addr addr ...]

参数

-a --addresses:在函数名、文件和行号信息之前,显示地址,以十六进制形式。
-b --target=<bfdname>:指定目标文件的格式为bfdname。
-e --exe=<executable>:指定需要转换地址的可执行文件名。
-i --inlines : 如果需要转换的地址是一个内联函数,则输出的信息包括其最近范围内的一个非内联函数的信息。
-j --section=<name>:给出的地址代表指定section的偏移,而非绝对地址。
-p --pretty-print:使得该函数的输出信息更加人性化:每一个地址的信息占一行。
-s --basenames:仅仅显示每个文件名的基址(即不显示文件的具体路径,只显示文件名)。
-f --functions:在显示文件名、行号输出信息的同时显示函数名信息。
-C --demangle[=style]:将低级别的符号名解码为用户级别的名字。
-h --help:输出帮助信息。
-v --version:输出版本号。

具体操作方法:

1. 准备一个elf文件,如zephyr.elf;

2. 将zephyr.elf反汇编为asm: objdump -D  -m arm zephyr.elf >zephyr.elf.asm;

3.使用readelf -w zephyr.elf | grep "advance Address"搜索出zephyr.elf文件中地址号与代码行对应关系:
  Special opcode 7: advance Address by 0 to 0x1032ad4 and Line by 2 to 28
  Special opcode 33: advance Address by 4 to 0x1032ad8 and Line by 0 to 28
  Special opcode 39: advance Address by 4 to 0x1032adc and Line by 6 to 149
  Special opcode 23: advance Address by 2 to 0x1032ade and Line by 4 to 153
  Special opcode 15: advance Address by 2 to 0x1032ae0 and Line by -4 to 149
  Special opcode 20: advance Address by 2 to 0x1032ae2 and Line by 1 to 150
  Special opcode 22: advance Address by 2 to 0x1032ae4 and Line by 3 to 153
  Special opcode 30: advance Address by 4 to 0x1032ae8 and Line by -3 to 150
  Special opcode 20: advance Address by 2 to 0x1032aea and Line by 1 to 151
  Special opcode 21: advance Address by 2 to 0x1032aec and Line by 2 to 153
  Special opcode 17: advance Address by 2 to 0x1032aee and Line by -2 to 151
  Special opcode 20: advance Address by 2 to 0x1032af0 and Line by 1 to 152
  Special opcode 34: advance Address by 4 to 0x1032af4 and Line by 1 to 153
  Special opcode 35: advance Address by 4 to 0x1032af8 and Line by 2 to 155
  Special opcode 13: advance Address by 0 to 0x1032af8 and Line by 8 to 163
  Special opcode 48: advance Address by 6 to 0x1032afe and Line by 1 to 164
  Special opcode 14: advance Address by 2 to 0x1032b00 and Line by -5 to 159

选取一行进行地址与代码行及函数名文件名映射:

addr2line 1032ad4 -e zephyr.elf -f -s -C或者addr2line 0x1032ad4 -e zephyr.elf -f -s -C回车执行结果如下:

serialize_raw_is_checksum_ok
serialize_raw.h:28

至此可以看到在zephyr.elf文件中地址0x1032ad4所对应的函数为serialize_raw_is_checksum_ok,在serialize_raw.h头文件的第28行处!

此时如果当系统运行时报出0x1032ad4地址错误,则可以立即定位出是serialize_raw.h头文件的第28行的serialize_raw_is_checksum_ok出现了问题!

验证:

调出zephyr.elf所在工程原文件,果然搜索到serialize_raw.h第28行,其内容为:

原理

addr2line如何找到的这一行呢在可执行程序中都包含有调试信息(所以编译的时候需要加-g选项),其中很重要的一份数据就是程序源程序的行号和编译后的机器代码之间的对应关系Line Number Table。Line Number Table存储在可执行程序的.debug_line域。
使用如下命令
readelf -w elf_file | grep "advance Address"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值