使用 addr2line 工具解析backtrace

Coredump 是分析Android native exception kernel exception的利器,coredump中文名是核心转储,大概可以理解为当系统或者某个进程发生异常无法挽救时,系统机制把这块出问题的内存取出来打包成核心转储供给系统异常工程师离线分析用。有了coredump不但可以定位具体出异常的代码所在文件行数,还可以离线调试,一步步还原问题现场,抓出导致异常真凶. 但是很多时候由于系统挂得太突然或者某些原因来不及打包coredump,导致无法获取到核心转储,只留下一堆backtrace的残余信息供分析,这种缺少调试信息的问题通常调试难度比较大,而这个时候GNU tools工具家族的addr2line工具就可以发挥作用了,addr2line工具可以根据内存地址加上对于库的符号库文件解析即可“翻译”出具体的代码位置,帮助从log转换到源代码层面分析崩溃的原因。

如下某崩溃进程的backtrace:

 1 Revision: ‘0‘
 2 ABI: ‘arm64‘
 3 pid: 24377, tid: 24377, name: gx_fpd  >>> /system/bin/gx_fpd <<<
 4 signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
 5     x0   0000000000000000  x1   0000000000005f39  x2   0000000000000006  x3   0000000000000000
 6     x4   0000000000000000  x5   0000000000000001  x6   0000000000000000  x7   0000000000000000
 7     x8   0000000000000083  x9   0000007fb4eec110  x10  0000000000000002  x11  0000000000000003
 8     x12  0000000000000000  x13  0000000000000043  x14  0000007fcc97a768  x15  0000000000000000
 9     x16  0000007fb4b866a8  x17  0000007fb4b48b6c  x18  0000000000000002  x19  0000007fb4f670a8
10     x20  0000007fb4f66fe8  x21  000000000000000b  x22  0000000000000006  x23  0000005582219f90
11     x24  0000007fcc97ac90  x25  0000007fb4e04d18  x26  0000000000000000  x27  0000000000000000
12     x28  0000000000000000  x29  0000007fcc97ab60  x30  0000007fb4b46308
13     sp   0000007fcc97ab60  pc   0000007fb4b48b74  pstate 0000000020000000
14     v0   2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e  v1   006370692e67756265642e6f6e6e6974
15     v2   636f69203a4457540000000000000031  v3   80000000000000000000000000000000
16     v4   00000000000000008020080280200800  v5   00000000400000000000040000000000
17     v6   00000000000000000000000000000000  v7   80200802802008028020080280200802
18     v8   00000000000000000000000000000000  v9   00000000000000000000000000000000
19     v10  00000000000000000000000000000000  v11  00000000000000000000000000000000
20     v12  00000000000000000000000000000000  v13  00000000000000000000000000000000
21     v14  00000000000000000000000000000000  v15  00000000000000000000000000000000
22     v16  40100401401004014010040140100401  v17  00000000a00aa0080000aaa880400400
23     v18  00000000000000008020080280200800  v19  0833083a082f08240828083c082e0832
24     v20  0c950c920c9a0c950c960c950c970c9a  v21  000000000000000000000055822a6c18
25     v22  083a083e083408380834083b084f084b  v23  0c950c960c960c930c970c8d0c930c9a
26     v24  000000000000000000000055822a6c08  v25  085908470837083f083e083f08410843
27     v26  0c950c930c920c940c950c960c920c97  v27  000000000000000000000055822a6bf8
28     v28  0862084c084e083b084608350826082e  v29  0c920c960c930c950c920c970c900c98
29     v30  000000000000000000000055822a6be8  v31  0838083c0850085a08410851082f0846
30     fpsr 00000000  fpcr 00000000
31
32 backtrace:
33     #00 pc 000000000006ab74  /system/lib64/libc.so (tgkill+8)
34     #01 pc 0000000000068304  /system/lib64/libc.so (pthread_kill+68)
35     #02 pc 00000000000212f8  /system/lib64/libc.so (raise+28)
36     #03 pc 000000000001ba98  /system/lib64/libc.so (abort+60)
37     #04 pc 000000000002e104  /system/lib64/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+216)
38     #05 pc 0000000000004c5c  /system/bin/gx_fpd (main+236)
39     #06 pc 0000000000019794  /system/lib64/libc.so (__libc_init+100)
40     #07 pc 0000000000004d78  /system/bin/gx_fpd

从发现异常的信号 signal 6 (SIGABRT) 看第一猜测就是发生了NULL内存范围,被MMU拦截了,ARM异常处理报出 data abort异常所致。 这里很重要一点是要知道具体backtrace代表的源代码是什么,

也就是从backtrace 信息翻译成具体的源代码级分析,而addr2line工具则提供了此功能。

用法:

一定要用带sysmbol目录下的库addr2line -e  <带符号库>  <内存地址>

解析如下:

 1 ./aarch64-linux-android-addr2line -e symbols/system/lib64/libc.so 000000000006ab74
 2 bionic/libc/arch-arm64/syscalls/tgkill.S:9
 3 ./aarch64-linux-android-addr2line -e symbols/system/lib64/libc.so 0000000000068304
 4 bionic/libc/bionic/pthread_kill.cpp:45 (discriminator 1)
 5 ./aarch64-linux-android-addr2line -e symbols/system/lib64/libc.so 00000000000212f8
 6 bionic/libc/bionic/raise.cpp:34 (discriminator 1)
 7 ./aarch64-linux-android-addr2line -e symbols/system/lib64/libc.so 000000000001ba98
 8 bionic/libc/bionic/abort.cpp:47
 9 ./aarch64-linux-android-addr2line -e symbols/system/lib64/libbinder.so 000000000002e104
10 frameworks/native/libs/binder/IPCThreadState.cpp:608

==》

1 backtrace:
2     #00 pc 000000000006ab74  /system/lib64/libc.so (tgkill+8)    tgkill.S:9
3     #01 pc 0000000000068304  /system/lib64/libc.so (pthread_kill+68)  pthread_kill.cpp:45
4     #02 pc 00000000000212f8  /system/lib64/libc.so (raise+28)  raise.cpp:34
5     #03 pc 000000000001ba98  /system/lib64/libc.so (abort+60)  abort.cpp:47
6     #04 pc 000000000002e104  /system/lib64/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+216) IPCThreadState.cpp:608
7     #05 pc 0000000000004c5c  /system/bin/gx_fpd (main+236)
8     #06 pc 0000000000019794  /system/lib64/libc.so (__libc_init+100)
9     #07 pc 0000000000004d78  /system/bin/gx_fpd

这里注意下,因为gx_fpd 是第三方库,不带symbol,所以无法解析出具体代码位置。
然后我们可以看下发生异常的代码,IPCThreadState.cpp:608

 1 void IPCThreadState::joinThreadPool(bool isMain)
 2 {
 3     LOG_THREADPOOL("**** THREAD %p (PID %d) IS JOINING THE THREAD POOL\n", (void*)pthread_self(), getpid());
 4
 5     mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);
 6
 7     // This thread may have been spawned by a thread that was in the background
 8     // scheduling group, so first we will make sure it is in the foreground
 9     // one to avoid performing an initial transaction in the background.
10     set_sched_policy(mMyThreadId, SP_FOREGROUND);
11
12     status_t result;
13     do {
14         processPendingDerefs();
15         // now get the next command to be processed, waiting if necessary
16         result = getAndExecuteCommand();
17
18         if (result < NO_ERROR && result != TIMED_OUT && result != -ECONNREFUSED && result != -EBADF) {
19             ALOGE("getAndExecuteCommand(fd=%d) returned unexpected error %d, aborting",
20                   mProcess->mDriverFD, result);
21             abort();
22         }

上面代码可以出,这个abort不是发生NULL指针所致(上面开始猜错了o(╯□╰)o),而是result异常人为的加了abort()动作陷阱所致, 这里就需要分析这个result为什么会异常导致跑到这个陷阱中了,

而这块属于binder通信的核心代码,所以需要对binder的原理深入理解以及其代码非常的熟悉才能从容的调试分析找出答案.

时间: 2024-07-29 07:30:49

使用 addr2line 工具解析backtrace的相关文章

Xcode7.3工具解析App崩溃日志(.crash文件)

Xcode7.3工具解析App崩溃日志(.crash文件) 原文链接:http://blog.csdn.net/u011056605 开发的App或者游戏提交审核后,偶尔会收到测试反馈的消息,说应用崩溃了,bug偶尔出现,难以找到确定的重现方法. 怎么办?可以分析崩溃文件啊,也就是app崩溃后,自动保存在设备本地的.crash文件. 获得崩溃日志的方式,在 获取设备上的调试信息与崩溃日志分析 中有说. 在环境ok的情况下,xcode中是可以自动解析.crash文件的.旧版本的xcode甚至可以导

最终版-perl工具解析数据库的报告文件0120

********************需要根据自己的实际环境修改哦**************************** ******************** 1. 收集awr报告样本   awrreport.sql --该脚本请用具有 dba 权限的用户执行,普通用户没有权限访问数据库的基表 conn &usr/ &pass @ &oracle_sid set linesize 1200 ;set pagesize 0;set long 99999;set heading

js之第三方工具解析JSON

1.JSON 仅仅是一种文本字符串.它被存储在 responseText 属性中 为了读取存储在 responseText 属性中的 JSON 数据,须要依据 JavaScript 的 eval 函数.函数 eval 会把一个字符串当作它的參数. 然后这个字符串会被当作 JavaScript 代码来运行.由于 JSON 的字符串就是由 JavaScript 代码构成的,所以它本身是可运行的 比如例如以下方式: String json = "{username:'一叶扁舟',age:22}&quo

超级狗 加密工具解析(正式版)

超级狗 加密工具全面解析 SuperDog 一.超级狗工具开发套件: 1.超级狗工具的简介. 2.超级狗开发套件(光盘). ①.超级狗工具使用手册(PDF). ②.Android.Linux.Windows 平台的安装包(PDF). 3.一个开发主狗和用户狗. 二.安装开发软件: 读取光盘中文件,选择适用平台的安装包进行安装即可(一键式安装程序). 安装目录: 发布说明   (PDF) 开发商指南(PDF) 1.DRM工具 ①.超级狗DRM打包工具 2.软件保护工具 ①.超级狗编程工具 ②.超级

使用Tika、Luke工具解析多种类型(word、pdf、txt 等)索引文件

Tika 是2008年才产生的apache的一个项目,主要用于打开各种不同类型的文档,获取其文本信息.可以解析多种类型(word.pdf.txt .html等)文件! 甚至可以通过解析url,获取其网页信息.最后把其文本信息提起出来.这方面Tika有点像Jsoup..一般情况下,直接对word.pdf等文件直接创建索引是不对的,用luke工具查看之后,出现一大推乱七八糟的term.这个时候就可以用Tika 去在对其创建索引之前,转化处理其文本信息. package hhc; import jav

nali工具解析ip来源

一.背景 日常运维中,我们经常需要解析各服务访问的ip来源,或查找定位ip访问来来源,今天介绍的是一款开源的查询工具nali,他可以利用纯真ip数据库来查询. 二.安装 1.下载并编译安装 wget https://qqwry.googlecode.com/files/nali-0.2.tar.gz    #不能访问或失效请移步到https://pan.baidu.com/s/1eS276kq  tar xvf nali-0.2.tar.gz cd nali-0.2 make make inst

5分钟让你学会用最高效的工具解析所有Json

如果你是一个Android开发工程师,学会解析Json字符串是你的必修课,本篇文章主要以实例的方式手把手教你怎么做,花五分钟时间阅读本篇文章你就可以学会解析所有的Json字符串啦. 准备: json字符串 fastjson HiJson格式化json工具 开始教程: fastjson: 常用工作中解析json的工具类有谷歌的GSON,jackson,fastjson,这里就不做一一比较了,博主告诉大家,fastjson就是最高效最好用的,选它就没错了.FastJson出自阿里工程师之手,是一个J

gson终结者—使用gson工具解析json字符串

昨天加了一天的班,在"高人"指点下解决了一个重大的问题--使用gson解析特别复杂的json字符串,哎,不总结总觉得少了点什么,睡不着.现将代码及相关说明附上: 1.使用的jar包为gson-2.2.2.jar,其下载地址为:http://download.csdn.net/download/wangshuxuncom/8162997

转载:移动应用加密工具解析

移动互联网的普及,越来越多的移动应用陷入安全门,各种信息泄露.盗号风波层出不穷.越来越多的黑客盯上了移动应用,而SD 卡中以明文存放的个人信息,数据库中未加密存储的用户名和密码,收集的分析并以明文方式发到远程服务器,这些情况都使得黑客攻击更容易. 正确使用Cryptography 工具,能保护我们的敏感数据,确保隐私和数据完整.另一方面,加密难用且容易误用.这里给大家推荐下目前移动应用适用的加密工具. Bouncy Castle Legion of the Bouncy Castle是一个来自澳