
对于Android Native开发的人员而言,可能经常会在开发过程及线上环境中遇到Native Crash的问题,对于这类native crash,我们一般都会直接addr2line,或使用ndk中附带的ndk-stack脚本分析。
但是ndk-stack是不会对build id不匹配的库进行分析的。
对于上述问题,即使build id不同,我们也是可以尝试性地进行分析的,大致流程如下:

基于此分析流程,我编写了一个AS插件:SmartNDKStack,功能如下:
大家若有需要,可以在插件市场搜索安装。现在可能会存在一些不足,如果出现问题,请把截图和现象描述发我:wangshengyang96@gmail.com

下面是原理描述。
写个demo触发crash
__attribute__((always_inline)) void realThrowFatal(){
raise(SIGABRT);
}
__attribute__((always_inline)) void throwFatal(){
realThrowFatal();
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_ndkdemo_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
throwFatal();
return env->NewStringUTF(hello.c_str());
}
运行看调用栈
2021-11-14 16:04:45.573 14705-14705/? A/DEBUG: #00 pc 00000000000c5008 /apex/com.android.runtime/lib64/bionic/libc.so (tgkill+8) (BuildId: e81bf516b888e895d4e757da439c8117)
2021-11-14 16:04:45.574 14705-14705/? A/DEBUG: #01 pc 000000000000f0c8 /data/app/~~NiGDTVWkvUzCYf_UpH7RdQ==/com.example.ndkdemo-dfk3WrVVoUG5N0jUHQiyyw==/lib/arm64/libndkdemo.so (Java_com_example_ndkdemo_MainActivity_stringFromJNI+52) (BuildId: 8c26841b3c32a89935d095d8e916180628bded7b)
2021-11-14 16:04:45.574 14705-14705/? A/DEBUG: #02 pc 000000000013ced4 /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+148) (BuildId: 9f1408149c58982ae91ee6377c202d2b)
...
图片版:

对于如上调用栈而言, #01是开发者最关注的地方,挂在了自己的库里。
这一行的关键信息解读结果如下:




作者:省油的灯 链接:https://juejin.cn/post/7030340152325046303
-- END --