ndk错误日志

资料:
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 [-dump ]

  -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 后边就是错误的代码指针了。


image.png

下边就是如何根据指针获取代码拉

在我们解压出的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

....省略

你可能感兴趣的:(ndk错误日志)