Android JNI 实践基础(三) - 符号表分析NE crash

ndk 异常日志

模拟一个空指针的场景

arduino 复制代码
void crash() {
    int *p = nullptr;
    *p = 1;
    printf("p:%d \n", p);
}


extern "C"
JNIEXPORT void JNICALL
Java_com_example_ndktest_JNIDynamicLoad_sayHello(JNIEnv *env, jobject thiz) {
    crash();
}

我们在android studio 里看到的崩溃日志是

这里其实有一个技巧,java引发的crash 通常 会有dialog提示,而ne 引发的崩溃 则不会dialog提示,通常表现就是 直接进程退出了

碰到这种情况 我们第一时间应该用命令去查看对应的崩溃信息,as 这个ide里其实过滤掉了很多信息,对ne的查看其实不太方便

adb logcat以后 可以看出来 ne的崩溃信息 主要是三块

信号处理, 寄存器信息,以及 调用堆栈

符号表

ndk 其实本身build 是自带版本号的,多数情况下,我们不会修改这个版本号,下面的链接 可以查看你agp版本中自带的ndk版本号

developer.android.com/studio/proj...

像我这个demo工程就是agp8.1的版本

Library/Android/sdk/ndk/25.1.8937393

这个就是我们的ndk目录了

我们可以 找到我们的addr2line工具

Library/Android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/darwin-x86_64/bin

找到这个目录以后 我们就可以根据崩溃堆栈来定位到到底是哪行代码出的错了

./llvm-addr2line -e /app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libdynamic-lib.so 00000000000189e0

最后一个参数 就是我们刚才崩溃堆栈中最顶部的那行

执行结果如下:

再看一下 果然是我们代码出错的地方

这里要注意了 strip过的so文件是没有符号表的

可以对比一下下面有没有符号表的体积差别

ndk-stack 命令

前面一小节的addr2line 在使用起来稍微有点麻烦

developer.android.com/ndk/guides/...

更推荐用ndk-stack 来解决

这个命令其实就在 Library/Android/sdk/ndk/25.1.8937393 下,其实内置的就是addr2line ,只不过用起来更方便了

./ndk-stack -sym /app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a -dump /Users/11097719/Downloads/ne.txt

大家可以自行试一下 命令的执行结果

其他常用命令

readelf可以获取到 更多符号表的信息

./llvm-readelf -sW NdkTest/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libdynamic-lib.so > elfinfo.txt

objdump 也是常用命令之一,可以方便的查看 动态库依赖的信息

./llvm-objdump -p /app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libdynamic-lib.so

如何搜索代码所在的so文件

比如你怎么知道要引用哪个so文件呢?例如我想调用某个系统的c代码,我搜索到以后 mk文件中怎么知道要链接哪个动态库?

最重要的就是查看Android.bp文件 这里面有重要的信息

我们可以去 cs.android.com/ 查看源码

比如你知道你要使用bitmap.h中的代码

那就直接查找bitmap.cpp的实现 都有哪里在用

相关推荐
Digitally8 小时前
如何用5种实用方法将电脑上的音乐传输到安卓手机
android·智能手机·电脑
HahaGiver6669 小时前
Unity与Android原生交互开发入门篇 - 打开Unity游戏的设置
android·unity·交互
2501_915909069 小时前
WebView 调试工具全解析,解决“看不见的移动端问题”
android·ios·小程序·https·uni-app·iphone·webview
IT乐手11 小时前
android 下载管理工具类
android
2501_9151063212 小时前
App 怎么上架 iOS?从准备资料到开心上架(Appuploader)免 Mac 上传的完整实战流程指南
android·macos·ios·小程序·uni-app·iphone·webview
科技峰行者13 小时前
安卓16提前发布能否改写移动生态格局
android
蒲公英少年带我飞13 小时前
Android NDK 编译 protobuf
android
沐怡旸13 小时前
【底层机制】ART虚拟机深度解析:Android运行时的架构革命
android·面试
小禾青青13 小时前
uniapp安卓打包遇到报错:Uncaught SyntaxError: Invalid regular expression: /[\p{L}\p{N}]/
android·uni-app
studyForMokey14 小时前
【Kotlin内联函数】
android·开发语言·kotlin