Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-07-02:Android Native Crash问题如何分析定位?

Shanlovana opened this issue · comments

2019-07-02:Android Native Crash问题如何分析定位?

1 利用breakpad,dump Native崩溃时日志信息,
2 利用addr2line跟ndk-strace等工具 根据崩溃日志偏移量定位具体源码位置
3 根据信号提示进行具体处理。
此步骤的难点在于1:
Native Crash的时候整个app的状态是极其不稳定的,很可能由于保存日志(或者上报日志)等操作引起其他异常,所以此时最好fork一个子进程来保存当前进程的日志。
这个问题 崩溃优化的相关问题可以看看张绍文大佬极客时间的专栏,讲的非常细致。
我这个回答也是从中归纳了一点点皮毛

commented

adb logcat | [your path]/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi

日志解析命令

ndk-stack

  此命令即可以即时定位也可以将日志文件输出到某个路径后再定位,两者的区别在于后者比较灵活,可以再次分析,可查看文件名、方法名和行号

addr2line

  根据名称的理解,意思是将地址转换成行号,没错,确实是这样的,日志文件中只有内存地址,对我们来说毫无意义,因此,我们要使用此命令将内存地址转换成我们能够看得懂的信息,如文件名、行号,缺陷是此命令不提供方法名

objdump

  将so文件转换成asm(汇编)文件,在asm文件中通过内存地址即可找到发生问题的方法名

线上分析

  上面的这些命令只能够进行本地分析,如果说用户的手机发生了native crash怎么办呢?这种情况我们需要集成收集BUG的相关SDK ,如Testin,集成后,如果有客户发生错误,我们就可以在Testin后台查看定位信息了

两种方式

1、单个查找
  • 在日志文件中根据包名查找指针地址
  • 使用addr2line将地址解析成具体的行号
2、全部查找
  • 直接使用ndk-stack命令即可

参考链接

Android Native crash日志分析