目录
查看crash信息
adb logcat
/data/tombstones/
debugger
分析stack信息
addr2line工具
脚本工具stack
参考文档:
adb logcat中的crash信息中会指明tombstones 文件名:
Tombstone written to: /data/tombstones/tombstone_06
tombstone是程序发生crash时打印的stack信息, 如果要实时打印某个进程的stack信息,如果某个时刻程序出现异常尤其是卡死不动的时候, 这个命令会非常有用:
adb shell ps -A |grep surf
system 20225 1 2469536 45520 do_epoll_wait 0 S surfaceflingeradb shell debuggerd -b 20225
debugger 会打印pid下各个thread的stack信息, 类似于, tombstone文件中也会有类似信息。
"Signal Catcher" sysTid=2682
#00 pc 00000000000d11d8 /apex/com.android.runtime/lib64/bionic/libc.so (__rt_sigtimedwait+8) (BuildId: 21847aa9757f000b0461310a9f5e6e51)
#01 pc 000000000008fc20 /apex/com.android.runtime/lib64/bionic/libc.so (sigwait+68) (BuildId: 21847aa9757f000b0461310a9f5e6e51)
#02 pc 00000000004d93b8 /apex/com.android.runtime/lib64/libart.so (art::SignalCatcher::WaitForSignal(art::Thread*, art::SignalSet&)+392) (BuildId: 8fb5976d4465346647f3e5e5870bdc7a)
#03 pc 00000000004d8138 /apex/com.android.runtime/lib64/libart.so (art::SignalCatcher::Run(void*)+268) (BuildId: 8fb5976d4465346647f3e5e5870bdc7a)
#04 pc 00000000000e68a0 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+36) (BuildId: 21847aa9757f000b0461310a9f5e6e51)
#05 pc 0000000000084b6c /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: 21847aa9757f000b0461310a9f5e6e51)
如上stack 信息中其中的#00 pc后面的数字即为错误发生的地址,如00000000000d11d8,那么该地址对应的具体函数的那一行呢?可以使用工具addr2line来分析, 格式如下:
addr2line -C -f -e lib.so 地址1 地址2
addr2line在ndk中,可以在google官方下载,一般存储位置为, 注意要解析的lib是64位还是32位, 不同lib使用不同的addr2line。
64位:/Sdk/ndk/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-addr2line
32位: /Sdk/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-addr2line
如果本地有android 源码, 如64位系统,addr2line在以下地址也可以找到
cd prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin
然后运行命令:
./aarch64-linux-android-addr2line -f -C -e libxxx.so
...
其中libxxx.so 需要有符号表, 如果是自己编译的系统, 可在以下位置获取:
out/target/product/[productname]/symbols/system/lib/****.so
如果有相应的源码文件, 且编译时是unstripped binaries, 将stack 信息粘贴到脚本
development/scripts/stack中, 打印detail行号。
adb pull /data/tombstones/tombstone_06
python stack < tombstone_06
参考: https://www.jianshu.com/p/3eb6315cb710
https://lldb.llvm.org/use/tutorial.html
使用addr2line,第二个解决更具体: 介绍addr2line调试命令 - Gityuan博客 | 袁辉辉的技术博客
Android Native报错定位(addr2line工具的使用)_SuperDali的博客-CSDN博客_addr2line android
google: https://source.android.com/devices/tech/debug/index.html
debuggerd: https://source.android.com/devices/tech/debug/gdb