Android解读Native崩溃栈信息的方法详解,
投稿于 被查看 8258 次 评论:208
Android解读Native崩溃栈信息的方法详解,
目录
- Native 崩溃栈信息
- 符号表
- 最后
大部分的 Android
开发者使用的主要语言都是 Kotlin / Java
,他们的崩溃栈信息非常清晰,也非常好定位到问题,如果是线上的崩溃通常还会对类名进行混淆,还需要一个混淆文件对堆栈翻译一下就能够得到源码中的类名。
但是很多人对 C/C++
的崩溃栈就无能为力了,今天这篇文章就来扒一扒 Native
的崩溃栈信息。
Native 崩溃栈信息
我们经常能够看到有类似下面的 Native
崩溃信息:
Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 17356 (tMediaPlayerDec), pid 15253 (ediaplayer.demo) pid: 15253, tid: 17356, name: tMediaPlayerDec >>> com.tans.tmediaplayer.demo <<< #01 pc 000000000001bd2c /data/app/~~fIT1aTQ88Pxdg1-7Ax4AXQ==/com.tans.tmediaplayer.demo-8WVpgXB0od_2YBBfM4FnZQ==/lib/arm64/libtmediaplayer.so #02 pc 000000000001ba98 /data/app/~~fIT1aTQ88Pxdg1-7Ax4AXQ==/com.tans.tmediaplayer.demo-8WVpgXB0od_2YBBfM4FnZQ==/lib/arm64/libtmediaplayer.so #03 pc 000000000001b878 /data/app/~~fIT1aTQ88Pxdg1-7Ax4AXQ==/com.tans.tmediaplayer.demo-8WVpgXB0od_2YBBfM4FnZQ==/lib/arm64/libtmediaplayer.so #04 pc 000000000001b878 /data/app/~~fIT1aTQ88Pxdg1-7Ax4AXQ==/com.tans.tmediaplayer.demo-8WVpgXB0od_2YBBfM4FnZQ==/lib/arm64/libtmediaplayer.so #05 pc 000000000001b878 /data/app/~~fIT1aTQ88Pxdg1-7Ax4AXQ==/com.tans.tmediaplayer.demo-8WVpgXB0od_2YBBfM4FnZQ==/lib/arm64/libtmediaplayer.so #06 pc 000000000001b878 /data/app/~~fIT1aTQ88Pxdg1-7Ax4AXQ==/com.tans.tmediaplayer.demo-8WVpgXB0od_2YBBfM4FnZQ==/lib/arm64/libtmediaplayer.so #07 pc 000000000001b878 /data/app/~~fIT1aTQ88Pxdg1-7Ax4AXQ==/com.tans.tmediaplayer.demo-8WVpgXB0od_2YBBfM4FnZQ==/lib/arm64/libtmediaplayer.so #08 pc 000000000001cf08 /data/app/~~fIT1aTQ88Pxdg1-7Ax4AXQ==/com.tans.tmediaplayer.demo-8WVpgXB0od_2YBBfM4FnZQ==/lib/arm64/libtmediaplayer.so (Java_com_tans_tmediaplayer_tMediaPlayer_decodeNative+52) (BuildId: 58ab2061a06db613d9c3ca66a214872ad88636f7) #11 pc 000000000000952c [anon:dalvik-classes5.dex extracted in memory from /data/app/~~fIT1aTQ88Pxdg1-7Ax4AXQ==/com.tans.tmediaplayer.demo-8WVpgXB0od_2YBBfM4FnZQ==/base.apk!classes5.dex] (com.tans.tmediaplayer.tMediaPlayer.decodeNativeInternal$tmediaplayer_debug+0) #13 pc 00000000000057f6 [anon:dalvik-classes5.dex extracted in memory from /data/app/~~fIT1aTQ88Pxdg1-7Ax4AXQ==/com.tans.tmediaplayer.demo-8WVpgXB0od_2YBBfM4FnZQ==/base.apk!classes5.dex] (com.tans.tmediaplayer.tMediaPlayerDecoder$decoderHandler$2$1.dispatchMessage+850)
Native
中的崩溃是通过系统信号来实现的,比如我们上面的异常信号就是 SIGABRT
,Android
的进程在启动时就会添加一个 SignalCatcher
,来捕获信号,不同的信号有不同的处理方式,SIGABRT
就是会直接退出程序,也就是我们常说的崩溃,Android
中还有一个非常重要的信号就是 SIGQUIT
,在 Android
中表示发生了 ANR
,默认的处理逻辑是 dump
栈信息和内存 GC
相关的信息到本地文件。
好了这里说得有点远了,回到上面的问题,我们刚开始看到上面的数据可能有点懵逼,pc
后面有一串 16 进制的数字表示程序计数器的位置 (简单理解就是执行的机器码对应的位置),后面的文件表示崩溃的栈中相关的 .so
动态链接库。但是你又要说了,这一串地址谁能够看出什么问题啊?
用户评论