Android native crash debug

目录

查看crash信息

 adb logcat

/data/tombstones/

debugger

分析stack信息

addr2line工具

脚本工具stack

参考文档:


查看crash信息

  •  adb logcat

  • /data/tombstones/

adb logcat中的crash信息中会指明tombstones 文件名:

Tombstone written to: /data/tombstones/tombstone_06
  • debugger

tombstone是程序发生crash时打印的stack信息, 如果要实时打印某个进程的stack信息,如果某个时刻程序出现异常尤其是卡死不动的时候, 这个命令会非常有用:

adb shell ps -A |grep surf
system       20225     1 2469536  45520 do_epoll_wait       0 S surfaceflinger

adb 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信息

addr2line工具

 如上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

  • 脚本工具stack

如果有相应的源码文件, 且编译时是unstripped binaries, 将stack 信息粘贴到脚本

development/scripts/stack中, 打印detail行号。

adb pull /data/tombstones/tombstone_06

python stack < tombstone_06

使用lldb调试: 

参考: 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

你可能感兴趣的:(Andoid)