字面意思: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:表示发生错误的堆栈
备注:
常见信号:一般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)根据代码和上述结果分析