在平时工作中,很大程度上都是在debug。所以对debug工具的使用也需要好好做一下总结,平时用的少的东西还是比较容易遗忘。
除了在流程中埋log这种最常见的状况,还有就是针对anr、tombstone之类的进行分析。
这篇文章就主要分析一下tombstone分析中会用到的工具。
backtrace:
#00 pc 00014b04 /system/lib/libc.so (strlen+83)
#01 pc 0007a648 /system/lib/libmsc.so (JNI_IsrErrorCB(char const*, int, char const*, void*)+136)
#02 pc 00050e40 /system/lib/libmsc.so
#03 pc 0004933c /system/lib/libmsc.so
#04 pc 0002bb64 /system/lib/libmsc.so
#05 pc 000378c0 /system/lib/libmsc.so
#06 pc 0002bd64 /system/lib/libmsc.so
#07 pc 0002b340 /system/lib/libmsc.so
#08 pc 0002bf84 /system/lib/libmsc.so
#09 pc 00026058 /system/lib/libmsc.so (lua_pcallk+116)
#10 pc 0004b4d0 /system/lib/libmsc.so (luacRPCFuncProto_Invoke+396)
#11 pc 0004a8c8 /system/lib/libmsc.so
#12 pc 00013e50 /system/lib/libmsc.so
#13 pc 00016fdb /system/lib/libc.so (__pthread_start(void*)+30)
#14 pc 00014f23 /system/lib/libc.so (__start_thread+6)
比如上面这样的状况,打印出了崩溃前的堆栈调用关系,因为都是被unstrip了的so库,所以需要找到编译过程中没有被去掉符号的版本。
随便找一个系统中的sharelib,看看mm时候的输出log
target Symbolic: libinputservice (out/target/product/XXX/symbols/system/lib64/libinputservice.so)
target Strip: libinputservice (out/target/product/XXX/obj/lib/libinputservice.so)
Install: out/target/product/XXX/system/lib64/libinputservice.so
所以带有符号链接的库都在out/target/product/XXX/symbols下
./gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line
./gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-addr2line
在android源码中的prebuilt目录下有如上两个addr2line的工具,在gcc工具链中。
addr2line的目的就是将可执行镜像中的地址转化为对应的函数名,给开发人员来debug
一般的addr2line的使用方法:
Usage: addr2line –aCfe libs $(trace_address)
这样就能查找到挂掉的函数的地址
/********************************************************************************************************/
有时候没有出现程序挂掉产生tombstone的情况,或许就是某个native的程序卡住,导致上层的apk出现anr。但是卡住不一定会崩溃,这时候想要知道是程序是卡在哪里,就可以使用debuggerd
shell@walnut:/system/bin # debuggerd 3134
Sending request to dump task 3134.
Tombstone written to: /data/tombstones/tombstone_04
在设备的终端中输入debuggerd PID,然后就会新产生一个tombstone文件供分析
注意:针对编译出来是64位的bin档,要获取它的墓碑文件,就需要使用64位的debuggerd(debuggerd64),需要查看这个bin档的Android.mk来判断到底是32或者64(这个在之后会写的编译系统中会有描述)