资料:
http://blog.csdn.net/tankai19880619/article/details/9004619
https://www.cnblogs.com/jhzhu/p/3801640.html
http://blog.csdn.net/haikuotiankong2016/article/details/53054083
addr2line 的使用是从一个stackover帖子上找到的,地址不见了。就不粘贴了。感谢
符号 | 解释 |
---|---|
rX(X=[0~9]) | 代表整数寄存器 |
dX(X=[0~31]) | 是浮点指针寄存器 |
fp (or r11) | 指向当前正在执行的函数的堆栈底. |
ip (or r12) | 一个寄存器, 我也没弄明白是干啥的. |
sp (or r13) | 当前正在执行的函数的堆栈顶.(跟fp相对应) |
lr (or r14) | link register. 简单来说, 当当前指令执行完了, |
下面来逐行解读:
1. ndk crash log以*** *** *** *** ***
开始.
2. 第一行Build fingerprint: 'google/razorg/deb:4.4.2/KOT49H/937116:user/release-keys'
指明了运行的Android版本, 如果您有多份crash dump的话这个信息就比较有用了.
3. 接着一行显示的是当前的线程id(pid)和进程id(tid). 如果当前崩溃的线程是主线程的话, pid和tid会是一样的~
4. 第四行, 显示的是unix信号. 这里的signal 11
, 即SIGSEGV
, 表示段错误, 是最常见的信号.(什么是unix信号, 什么是SIGSEGV
)
5. 接下来的部分是系统寄存器的dump信息.
符号 | 解释 |
---|---|
rX(X=[0~9]) | 代表整数寄存器 |
dX(X=[0~31]) | 是浮点指针寄存器 |
fp (or r11) | 指向当前正在执行的函数的堆栈底. |
ip (or r12) | 一个寄存器, 我也没弄明白是干啥的. |
sp (or r13) | 当前正在执行的函数的堆栈顶.(跟fp相对应) |
lr (or r14) | link register. 简单来说, 当当前指令执行完了, |
就会从这个寄存器获取地址, 来知道需要返回
到哪里继续执行. |
| pc (or r15) | program counter. 存放下一条指令的地址 |
| cpsr | Current Program Status Register. 表示当前
运行环境和状态的一些字节位. |
6. Crash dump还包含PC之前和之后的一些内存字段.
7. 最后, 是崩溃时的调用堆栈. 如果你执行的是debug版本, 还能还原一些c++代码.
利用ndk-stack定位崩溃代码
上面的一些信息能简单的帮你定位以下问题. 如果信息量还不够大的话, 那就还有最后一招: 还原历史.
Android NDK自从版本R6开始, 提供了一个工具ndk-stack( 在目录{ndk_root}/中 ). 这个工具能自动分析dump下来的crash log, 将崩溃时的调用内存地址和c++代码一行一行对应起来.
我们先看一下用法, 执行命令ndk-stack --help
Usage:
ndk-stack -sym
-sym Contains full path to the root directory for symbols.
-dump Contains full path to the file containing the crash dump.
This is an optional parameter. If ommited, ndk-stack will
read input data from stdin
-dump参数很容易理解, 即dump下来的log文本文件. ndk-stack会分析此文件.
-sym参数就是你android项目下,编译成功之后,obj目录下的文件.
在ndk解压出来的根目录下,就有一个ndk-stack.cmd的文件的,我们打开cmd,将目录切换到这个文件夹下。
-sym 后边传的就是so文件所在的目录,这个我们编译完的so都默认在objs目录下的。
-dump 后边跟的就是包含日志的txt文件,自己随便放到哪里都行。
执行命令后就会抽出我们需要的东西了,方便在几万行日志文件种查找ndk错误信息。
其中#00 pc 后边就是错误的代码指针了。
下边就是如何根据指针获取代码拉
在我们解压出的ndk如下目录下D:\android-ndk-r15c\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin
有一个arm-linux-androideabi-addr2line.exe的文件。 可能不同版本不一样,自己慢慢找。不过toolchains目录应该都有的吧
cmd窗口下把目录切换到exe文件所在的目录,然后执行如下的命令,-C -f -e 后边跟着so文件【如果不在这个目录下,提供完整路径。我偷懒了,直接把so文件复制过来了】 ,后边的address就是上边pc后跟着的地址
arm-linux-androideabi-addr2line -C -f -e libXXX.so
Note:
The -C flag is to demangle C++ code
Use the .so file under obj/local/armeabi, since this is the non-stripped version
命令参数可以打help查看,如下:
arm-linux-androideabi-addr2line -help
Usage: arm-linux-androideabi-addr2line [option(s)] [addr(s)]
Convert addresses into line number/file name pairs.
If no addresses are specified on the command line, they will be read from stdin
The options are:
@ Read options from
-a --addresses Show addresses
-b --target= Set the binary file format
-e --exe= Set the input file name (default is a.out)
-i --inlines Unwind inlined functions
-j --section= Read section-relative offsets instead of addresses
-p --pretty-print Make the output easier to read for humans
-s --basenames Strip directory names
-f --functions Show function names
-C --demangle[=style] Demangle function names
-h --help Display this information
-v --version Display the program's version
结果如下:
D:\android-ndk-r15c\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin>arm-linux-androideabi-addr2line -C -f -e libEML.so 0038bc58
std::basic_string, std::allocator >::operator=(wchar_t const*)
/home/hill/Development/android-ndk-r10d/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/basic_string.h:550
可以看到是ndk自带的basic_string.h文件里的550行。
顺道说下#00-->#XX 表面上看是从上往下的增长,其实它所显示的程序的执行流程,恰恰是从下往上的也就是实际的执行顺序是#XX-->#00
简单的举例如下 比如 #02 是个方法a,里边调用了方法b也就是#01 ,然后这个方法里有行代码#00挂了。就是这个意思。
所以啊,我们如果要确认下最初是哪里出的问题, 那就解析那个#xx最大的那个值对应的地址。
错入日志如下:
02-26 11:06:56.288 787 1718 F libc : Fatal signal 11 (SIGSEGV) at 0x0000000c (code=1), thread 1718 (Thread-194)
02-26 11:06:56.348 117 117 I DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
02-26 11:06:56.348 117 117 I DEBUG : Build fingerprint: 'Magellan/ma70_close/ma70_close:4.4.2/KVT49L/20180205:eng/test-keys'
02-26 11:06:56.348 117 117 I DEBUG : Revision: '0'
02-26 11:06:56.348 117 117 I DEBUG : pid: 787, tid: 1718, name: Thread-194 >>> com.magellangps.SmartGPS <<<
02-26 11:06:56.348 117 117 I DEBUG : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0000000c
02-26 11:06:56.548 117 117 I DEBUG : r0 00000000 r1 00000070 r2 00000001 r3 00000000
02-26 11:06:56.548 117 117 I DEBUG : r4 702c0268 r5 70193e90 r6 70193fa0 r7 70193fe0
02-26 11:06:56.548 117 117 I DEBUG : r8 00000000 r9 70194140 sl 00000000 fp 702c026c
02-26 11:06:56.548 117 117 I DEBUG : ip 0000170f sp 6f6ec5e0 lr 6ab1b625 pc 6ab3fc58 cpsr 60010030
02-26 11:06:56.548 117 117 I DEBUG : d0 3f80000040566630 d1 0000000040df1016
02-26 11:06:56.548 117 117 I DEBUG : d2 40410dcb5781c702 d3 c05d73833bad0d16
02-26 11:06:56.548 117 117 I DEBUG : d4 c1804374d4000000 d5 c044000000000000
02-26 11:06:56.548 117 117 I DEBUG : d6 3fe0000000000000 d7 40df101b0004fed8
02-26 11:06:56.548 117 117 I DEBUG : d8 bf8000003f2b851f d9 40f7d50000000000
02-26 11:06:56.548 117 117 I DEBUG : d10 0000000000000000 d11 0000000000000000
02-26 11:06:56.548 117 117 I DEBUG : d12 0000000000000000 d13 0000000000000000
02-26 11:06:56.548 117 117 I DEBUG : d14 0000000000000000 d15 0000000000000000
02-26 11:06:56.548 117 117 I DEBUG : d16 41b2d4adad922d0e d17 3f50624dd2f1a9fc
02-26 11:06:56.548 117 117 I DEBUG : d18 41cba7f001800000 d19 000a000000000000
02-26 11:06:56.548 117 117 I DEBUG : d20 200a000800000000 d21 00000000c0000001
02-26 11:06:56.548 117 117 I DEBUG : d22 0000018b000000c4 d23 be6777a5cffffffe
02-26 11:06:56.548 117 117 I DEBUG : d24 3f752e5494f56b6d d25 4000000000000000
02-26 11:06:56.548 117 117 I DEBUG : d26 3e6777a5d0000000 d27 3ff921fb60000000
02-26 11:06:56.548 117 117 I DEBUG : d28 3ce135bdb7962e48 d29 3ff921fb54442d18
02-26 11:06:56.548 117 117 I DEBUG : d30 bb593df2c4dc670f d31 3f811110896efbb2
02-26 11:06:56.548 117 117 I DEBUG : scr 28000013
02-26 11:06:56.548 117 117 I DEBUG :
02-26 11:06:56.548 117 117 I DEBUG : backtrace:
02-26 11:06:56.548 117 117 I DEBUG : #00 pc 0038bc58 /data/app-lib/com.magellangps.SmartGPS-1/libEML.so
02-26 11:06:56.548 117 117 I DEBUG : #01 pc 00367621 /data/app-lib/com.magellangps.SmartGPS-1/libEML.so
02-26 11:06:56.548 117 117 I DEBUG : #02 pc 0036a6fd /data/app-lib/com.magellangps.SmartGPS-1/libEML.so
02-26 11:06:56.548 117 117 I DEBUG : #03 pc 0036897b /data/app-lib/com.magellangps.SmartGPS-1/libEML.so
02-26 11:06:56.548 117 117 I DEBUG : #04 pc 0036474d /data/app-lib/com.magellangps.SmartGPS-1/libEML.so
02-26 11:06:56.548 117 117 I DEBUG : #05 pc 00364849 /data/app-lib/com.magellangps.SmartGPS-1/libEML.so
02-26 11:06:56.558 117 117 I DEBUG : #06 pc 00364941 /data/app-lib/com.magellangps.SmartGPS-1/libEML.so
02-26 11:06:56.558 117 117 I DEBUG : #07 pc 0031128b /data/app-lib/com.magellangps.SmartGPS-1/libEML.so
....省略