开发过程中遇到了闪退问题,Android studio 中没有错误日志输出。只有部分libc的报错日志。
js
A FORTIFY: vsprintf: prevented 2019-byte write into 512-byte buffer
A Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 9064 (example.xxx.dev), pid 9064 (example.xxx.xxx)
初步怀疑是调用SO 库的时候触发的异常,导致的闪退,如何排查SO库的错误日志和定位问题(需要用到 NDK)。
-
安装NDK 可以使用Android studio 直接安装 选择一个ndk的版本。安装目录在/Users/你的用户名/Library/Android/sdk/ndk/<版本号>/ndk-stack

-
配置 ndk 的环境变量
- 在终端里用文本编辑器打开
~/.zshrc文件:
open -e ~/.zshrc# 用文本编辑器打开,或者用 vim ~/.zshrc - 在文件末尾添加下面这几行。记得把
/Users/你的用户名/Library/Android/sdk换成你在第一步记下的 SDK 路径,NDK 的版本号也要换成你实际安装的版本。
js# Android NDK export ANDROID_NDK_HOME=/Users/你的用户名/Library/Android/sdk/ndk/<你的NDK版本号> export PATH=$PATH:$ANDROID_NDK_HOME-
保存文件并退出编辑器。
-
在终端里运行下面的命令,让刚才的配置立即生效:
source ~/.zshrc -
验证是否成功
ndk-stack
- 在终端里用文本编辑器打开
-
使用 ndk-stack 分析崩溃日志
你需要确保有一个包含未剥离(unstriped) 调试符号的
.so文件的目录。在用 Android Studio 进行 Debug 构建时,这些文件通常在这里:
app/build/intermediates/cmake/debug/obj/<abi>app/build/intermediates/cxx/Debug/<hash>/obj/<abi>
在终端里用 adb logcat 来实时解析崩溃日志
arduino
adb logcat | ndk-stack -sym /path/to/your/unstripped/symbols
或者,你也可以先把日志保存下来再分析
lua
adb logcat -d > crash.log
ndk-stack -sym /path/to/your/unstripped/symbols -dump crash.log
-
日志内容分析
adb logcat | ndk-stack -sym /Users/xxx/xxx/xxx/xxx/src/main/jniLibs/arm64-v8a -
结果查看
js
********** Crash dump: **********
Build fingerprint: 'HONOR/MAA-AN00/HNMAA:15/HONORMAA-AN00/9.0.0.187C00E186R3P5:user/release-keys'
Abort message: 'FORTIFY: vsprintf: prevented 2019-byte write into 512-byte buffer'
#00 0x000000000005dd74 /apex/com.android.runtime/lib64/bionic/libc.so (abort+168) (BuildId: dab5250ce65b5876abcacb0e098e06e5)
#01 0x0000000000061bd8 /apex/com.android.runtime/lib64/bionic/libc.so (__fortify_fatal(char const*, ...)+128) (BuildId: dab5250ce65b5876abcacb0e098e06e5)
#02 0x0000000000099f88 /apex/com.android.runtime/lib64/bionic/libc.so (__vsprintf_chk+144) (BuildId: dab5250ce65b5876abcacb0e098e06e5)
#03 0x00000000000026f0 /data/app/~~QdOHQ6CSVhLcLEkvXoPbKw==/com.example.xxx.dev-xxeMHmk9_3MG3PNLcT2nug==/lib/arm64/libDKDSDK.so (native_print+208) (BuildId: cd504e2dfeb1355864a40c55a1dedf13b9126c3e)
vsprintf(char*, char const* pass_object_size1, __va_list)
/Users/xxx/Library/Android/sdk/ndk/22.0.7026061/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/stdio.h:57:12
native_print
/Users/xxx/ASProject/moss_android_kit/DKDSDK/src/main/cpp/libdknative.c:90:5
#04 0x0000000000005e24 /data/app/~~QdOHQ6CSVhLcLEkvXoPbKw==/com.example.xxx.dev-xxeMHmk9_3MG3PNLcT2nug==/lib/arm64/libDKDSDK.so (Java_com_xxx_dkdsdk_DKDNative_getDeviceOEMCertBegin+476) (BuildId: cd504e2dfeb1355864a40c55a1dedf13b9126c3e)
printHexDump
/Users/xxx/xxx/xxx/xxx/src/main/cpp/libdknative.c:103:5
Java_com_xxx_dkdsdk_DKDNative_getDeviceOEMCertBegin
/Users/xxx/ASProject/moss_android_kit/DKDSDK/src/main/cpp/libdknative.c:1421:5
#05 0x3131303730313030 <unknown>
Crash dump is completed
********** Crash dump: **********
Build fingerprint: 'HONOR/MAA-AN00/HNMAA:15/HONORMAA-AN00/9.0.0.187C00E186R3P5:user/release-keys'
Abort message: 'FORTIFY: vsprintf: prevented 2019-byte write into 512-byte buffer'
#00 0x000000000005dd74 /apex/com.android.runtime/lib64/bionic/libc.so (abort+168) (BuildId: dab5250ce65b5876abcacb0e098e06e5)
#01 0x0000000000061bd8 /apex/com.android.runtime/lib64/bionic/libc.so (__fortify_fatal(char const*, ...)+128) (BuildId: dab5250ce65b5876abcacb0e098e06e5)
#02 0x0000000000099f88 /apex/com.android.runtime/lib64/bionic/libc.so (__vsprintf_chk+144) (BuildId: dab5250ce65b5876abcacb0e098e06e5)
#03 0x00000000000026f0 /data/app/~~UJkXCCWHFz4bR--LqAqgMQ==/com.example.xxx.dev-yr91SuSNkOQR5vrhKEX50g==/lib/arm64/libDKDSDK.so (native_print+208) (BuildId: cd504e2dfeb1355864a40c55a1dedf13b9126c3e)
vsprintf(char*, char const* pass_object_size1, __va_list)
/Users/xxx/Library/Android/sdk/ndk/22.0.7026061/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/bits/fortify/stdio.h:57:12
native_print
/Users/xxx/xxx/xxx/xxx/src/main/cpp/libdknative.c:90:5
#04 0x0000000000005e24 /data/app/~~UJkXCCWHFz4bR--LqAqgMQ==/com.example.xxx-yr91SuSNkOQR5vrhKEX50g==/lib/arm64/libDKDSDK.so (Java_com_xxx_dkdsdk_DKDNative_getDeviceOEMCertBegin+476) (BuildId: cd504e2dfeb1355864a40c55a1dedf13b9126c3e)
printHexDump
/Users/xxx/xxx/xxx/xxx/src/main/cpp/libdknative.c:103:5
Java_com_xxx_dkdsdk_DKDNative_getDeviceOEMCertBegin
/Users/xxx/xxx/xxx/xxx/src/main/cpp/libdknative.c:1421:5
#05 0x3030303030303030 <unknown>
Crash dump is completed
从打印的日志可以分析报错调用链。
js
Java_xxx_xxx_dkdsdk_DKDNative_getDeviceOEMCertBegin-> printHexDump->native_print-> vsprintf(char*, char const* pass_object_size1, __va_list)
找到问题和原因 vsprintf: prevented 2019-byte write into 512-byte buffer
综上就是Android 中查看SO库 报错信息方式。