使用addr2line命令解析native backtrace

本文介绍了如何利用addr2line工具将Android系统的native backtrace转换为源代码文件和行号,以定位错误发生的位置。在面对backtrace中的地址时,通过找到对应的symbols信息,使用addr2line命令并提供pc指针地址,可以获取到相应的函数名和代码位置。正确使用addr2line的前提是库文件与backtrace中的库匹配,因为每次构建库的符号表都会发生变化。

addr2line是GNU Binary Utilities中的一个工具,用于将地址转换成文件名/行号对。

当有如下backtrace时:

"Binder:1478_1F" prio=5 tid=198 Native
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x160d0ab8 self=0x73e4694000
  | sysTid=12070 nice=0 cgrp=default sched=0/0 handle=0x73e257c4f0
  | state=S schedstat=( 341174881580 240306689036 1103729 

addr2line 是一个用于将程序地址转换为文件名和行号的工具,在调试程序时非常有用,它可以帮助开发者定位程序崩溃或出错的具体位置。 ### 基本语法 ```plaintext addr2line [options] [address ...] ``` 其中,`[options]` 用于指定额外的选项,`[address ...]` 是要转换的一个或多个程序地址[^2]。 ### 常用选项 虽然未在给定引用中详细提及常用选项,但常见的选项有: - `-e <filename>`:指定要分析的可执行文件。 - `-f`:显示函数名。 - `-s`:只显示文件名,不显示完整路径。 ### 示例 以下是一个使用 addr2line 命令的示例代码: ```c #include <stdio.h> void function_name() { int* pointer = NULL; *pointer = 42; // 产生崩溃 } int main() { function_name(); return 0; } ``` 要使用 addr2line 分析这个程序,步骤如下: 1. 编译程序时带上 `-g` 选项以包含调试信息: ```bash gcc -g -o test test.c ``` 2. 运行程序,程序会崩溃,假设得到一个崩溃地址(实际调试中可以通过调试器或日志获取),例如 `0x0000000000400526`。 3. 使用 addr2line 转换地址: ```bash addr2line -e test -f -s 0x0000000000400526 ``` 输出可能如下: ```plaintext function_name test.c:4 ``` 这表明地址 `0x0000000000400526` 对应的函数是 `function_name`,位于 `test.c` 文件的第 4 行[^1]。 ### 原理 在可执行程序中都包含有调试信息,其中很重要的一份数据就是程序源程序的行号和编译后的机器代码之间的对应关系 LineNumberTable。DWARF 格式的 Line NumberTable 是一种高度压缩的数据,存储的是表格前后两行的差值,在解析调试信息时,需要按照规则在内存里重建 LineNumber Table 才能使用[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值