使用mk文件进行编译的时候,可以增加如下命令,也可以直接编译出strip的so
-fvisibility=hidden
===========================================================================
NE解析顾名思议就是堆栈解析,当然所有的前提就是需要保存一份带符号表、也就是未被strip的so,如果你只有strip之后的so,那就无能为力了,堆栈基本无法还原了。
一般有以下三种方式可以捕获和还原堆栈。
顾名思义,就是通过logcat进行捕获,我们通过Android Studio打开logcat,制造一个NE,只能看到很多类似#00 pc 00000000000161a0的符号,并没有一个可以直接阅读的日志,我们想通过logcat直接输出一份可以直接阅读的log。
可以使用Android/SDK/NDK下面提供的一个工具ndk-stack,它可以直接将NE输出的log解析为可阅读的日志。
ndk-stack一般是位于ndk的工具下面,Mac下的地址为
/Users/XXXX/Library/Android/sdk/ndk/21.3.6528147/ndk-stack
然后在该目录下执行控制台命令,或者在 Android Studio的terminal中执行也可
adb shell logcat | androidsdk绝对路径/ndk-stack -sym so所在目录
如此控制台在应用发生NE的时候便会输出如下日志,由日志可以看出,崩溃对应的so以及对应的方法名,如果有c的源码,那么就很容易定位问题。
promote:~ njvivo$ adb shell logcat | ndk-stack -sym libbreakpad-core.so
********** Crash dump: **********
Build fingerprint: ‘vivo/PD1809/PD1809:8.1.0/OPM1.171019.026/compil04252203:user/release-keys’
#00 0x00000000000161a0 /data/app/com.android.necase-lEp0warh8FqicyY1YqGXXA==/lib/arm64/libbreakpad-core.so (Java_com_online_breakpad_BreakpadInit_nUpdateLaunchInfo+16)
#01 0x00000000000090cc /data/app/com.android.necase-lEp0warh8FqicyY1