Native Crash基本分析

字面意思:native程序发生crash,包括app jni里面代码报错,native层代码报错。

1.NE log图案介绍(tomstone)

@event log

am_crash: xxx (搜索am_crash看是否有crash)

@device.log(device log搜索DEBUG : pid

 1 04-16 11:18:00.323 26512 26512 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
 2 04-16 11:18:00.324 26512 26512 F DEBUG   : Build fingerprint: 'nubia/NX531J/NX531J:7.1.1/NMF26F/nubia04130311:user/release-keys'
 3 04-16 11:18:00.324 26512 26512 F DEBUG   : Revision: '0'
 4 04-16 11:18:00.324 26512 26512 F DEBUG   : ABI: 'arm'
 5 04-16 11:18:00.324 26512 26512 F DEBUG   : pid: 26452, tid: 26491, name: Thread-4  >>> com.willhua.opencvstudy <<<
 6 04-16 11:18:00.324 26512 26512 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc8080000
 7 04-16 11:18:00.324 26512 26512 F DEBUG   :     r0 c807a400  r1 c7e80000  r2 00000069  r3 00000069
 8 04-16 11:18:00.324 26512 26512 F DEBUG   :     r4 caa4ca9c  r5 007e9000  r6 00000964  r7 c69838f8
 9 04-16 11:18:00.324 26512 26512 F DEBUG   :     r8 00005c00  r9 00017002  sl 001fa400  fp cac6ec00
10 04-16 11:18:00.324 26512 26512 F DEBUG   :     ip e71aac64  sp c69838e8  lr caa8e949  pc caa8e97c  cpsr 800f0030
11 04-16 11:18:00.326 26512 26512 F DEBUG   : 
12 04-16 11:18:00.326 26512 26512 F DEBUG   : backtrace:
13 04-16 11:18:00.326 26512 26512 F DEBUG   :     #00 pc 0004097c  /data/app/com.willhua.opencvstudy-1/lib/arm/libOpenCV.so (_Z14darkGrayThreadPv+179)
14 04-16 11:18:00.326 26512 26512 F DEBUG   :     #01 pc 000475d3  /system/lib/libc.so (_ZL15__pthread_startPv+22)
15 04-16 11:18:00.326 26512 26512 F DEBUG   :     #02 pc 00019d3d  /system/lib/libc.so (__start_thread+6)


信息包括crash进程:com.willhua.opencvstudy 线程:Thread-4(pid tid 26452 26491)

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) //错误信号 signal11 code1
 
 

backtrace:表示发生错误的堆栈

备注:

扫描二维码关注公众号,回复: 1705611 查看本文章

常见信号:一般signal6 一般为硬件问题

2.分析工具使用

(1)addr2line

作用:把出错backtrace 解析出来文件和行数

格式:arm-linux_androideabi-addr2line -C -f -e sysbols/system/lib/xxx.so 0004097c

参数:arm-linux_androideabi-addr2line ndk里面工具,可以使用locate 搜索出

xxx.so:位于sysbols目录下,需要具有符号表,版本需要一致

0004097c:需要和backtrace里面的地址一下

(2)objdump

arm-linux_androideabi-objdump -dl xxx.so > xxx.txt

把库的汇编文件放在指定xxx.txt,搜索backtrace地址,通过汇编看是否有问题

(3)Coredump

1.arm-linux_androideabi-gdb app_process(sysbols/system/bin目录下) -c xxx.core(data/core目录下)

2.set solib-absolute-prefix symbols //加载symblos目录

3.set solib-search-path system/lib //加载sysblos文件的lib目录

4.symbol-file libcamera.so //加载具体的库,都是带有符号表的目录


gdb基本命令

bt  //check backtrace

f 2 //进入第n帧,bt之后会看到第几帧

p this //打印this值

p *this打印地址值

x/12x  0x111 //打印111地址附件的12个寄存器值 第一个x为命令  12代表个数 最后一个代表格式

info threads  //列出所有线程

info registers  //列出所有寄存器值

t  2  //选择第二个线程


3.分析步骤

(1)找到上述DEBUG内容位置,关键字am_crash DEBUG : pid

(2)查看进程是否有错误,搜索pid  tid看线程log

(3)查看是否有系统性能问题

(4)检查下1中的backtrace中的问题库,是否在最近有修改,或者有个类似的问题,可以加快时间

(5)使用addr2line工具,看下出问题的代码,看是否找出原因

(6)objdump汇编文件得到之后,根据寄存器的推是不是寄存器问题

(7)gdb工具,加载库之后,使用f bt 之类的命令查看线程信息  backtrace 寄存器值 内存值

(8)根据代码和上述结果分析









猜你喜欢

转载自blog.csdn.net/wd229047557/article/details/79490781