debug 工具使用合集(1)

在平时工作中,很大程度上都是在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(这个在之后会写的编译系统中会有描述)

    原文作者:Kelvin wu
    原文地址: https://zhuanlan.zhihu.com/p/21384648
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞