Android开发中不可避免会遇到ANR的情况,如果是Java层发生了ANR,我相信这个日志很好分析,这篇文章主要介绍一下如果是C/C++层发生了ANR,该如何去处理和分析。
先说一下主要的步骤
1、拿到ANR日志,如果保存的有发版时的debugso或者是用debug的so运行时发生的问题,可以直接使用addr2line导出堆栈信息,否则就得尝试用debug的so复现。因为debug的so会保存符号表信息,所以体积比release的so会大很多。
2、导出堆栈之后能定位到发生问题的具体代码行,但是一定要用编译so时对应的代码去看,否则看到的行肯定是错误的,如果通过调用关系和发生问题的代码行可以分析出问题,那么直接修改就可以了,如果分析不出来,那么就需要在C/C++代码中增加日志,复现问题,结合日志和anr信息共同确定问题
具体的操作
1、addr2line
这个工具是分析NDK层出现ANR必须使用的工具,只要你的电脑上装了NDK,里边自带的有这个工具,具体目录是android-ndk-r12b/toolchains/cpu架构/prebuit/bin/****_addr2line,里边分不同的CPU架构.
如果是arm64v8a的架构,选择第一种,armeabi或者armv7a的选择第二种,依次此类推
使用也比较简单,addr2line -e ****.so 005478f32a
多个行号用空格分开,如下所示:
2、日志分析,首先要看ANR发生的时间,还有进程号等信息,多进程环境下尤其要注意。
如果想从大量日志中筛选出来需要的进程信息,可以用下边的命令,比如筛选出进程号为7754的进程打印的日志信息。
grep '.' main_log_5__2019_0130_194243|grep -E '7754' >7754.txt