Android native crash debug

本文详细介绍了如何通过adb工具查看crash信息,解读tombstone文件,并利用addr2line工具解析地址以定位到源代码行。此外,还推荐了脚本工具stack辅助深度分析和lldb调试的方法,以及相关文档链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

查看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 <addr1> <addr2> ...

其中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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值