本文针对Android应用开发和系统开发分别提供了三款native crash定位工具。
一.应用开发
下载地址:so_crash_analyse
1.模拟环境
- 本文使用Android Studio 4.1版本,按默认配置创建一个jni工程。
- 模拟native crash,修改natvie-lib.cpp
2.crash定位脚本演示
- 通过logcat查找tombstone
I/BootReceiver: Copying /data/tombstones/tombstone_02 to DropBox (SYSTEM_TOMBSTONE)
- 找到包含Library Symbols的共享库。如下:
- crash定位
比如使用的是32位库,就将armeabi-v7a文件夹拖动到脚本so_crash_analyse上,此时会提示输入tombstone编号,比如我们这个就输入02。分析结果中就能看到是哪一行代码导致的问题
3.脚本说明
首次使用时,需配置依赖环境。打开so_crash_analyse
- 指定ndk路径
- 指定notepad++路径,用于自动打开分析结果
二.系统开发
可使用源码目录提供的development/scripts/stack进行分析,这里不具体演示,简单说明下使用步骤。
- pull出tomebstone
- 到development/scripts/下,使用命令:
./stack tombstone文件名
三.ndk工具定位
从logcat中找到关键堆栈信息:
runtime.cc:655] native: #13 pc 0000fb65 /data/data/com.jidouauto.fast.gameshop/.jiagu/libjiaguv1.so (_JNIEnv::SetObjectArrayElement(_jobjectArray*, int, _jobject*)+42)
runtime.cc:655] native: #14 pc 0000ed29 /data/data/com.jidouauto.fast.gameshop/.jiagu/libjiaguv1.so (???)
runtime.cc:655] native: #15 pc 0000e5b3 /data/data/com.jidouauto.fast.gameshop/.jiagu/libjiaguv1.so (native_attach(_JNIEnv*, _jclass*, _jobject*)+86)
使用ndk工具addr2line查看出错的函数位置
1.找到带Library Symbols的共享库的路径为E:\code\jiagu\build\intermediates\cmake\debug\obj\armeabi-v7a
2.输入命令:
E:\as\sdk\ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-addr2line.exe -Cfe E:\code\Jiagu\jiagu\build\intermediates\cmake\debug\obj\armeabi-v7a\libjiagu.so 0000ed29
3.输出:
loadDex(_JNIEnv*, _jobject*, _jbyteArray*)
Jiagu/jiagu/src/main/cpp/jiagu.cpp:336