Android 打印 SO 库的异常日志

开发过程中遇到了闪退问题,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)。

  1. 安装NDK 可以使用Android studio 直接安装 选择一个ndk的版本。安装目录在/Users/你的用户名/Library/Android/sdk/ndk/<版本号>/ndk-stack

  2. 配置 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

  3. 使用 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库 报错信息方式。

相关推荐
找藉口是失败者的习惯3 小时前
深入理解 Android 无障碍服务
android
summerkissyou19873 小时前
Android-SurfaceView-打开车机SurfaceFlinger和HWC的日志
android
Fate_I_C3 小时前
Android函数式编程代码规范文档
android·代码规范
安卓蓝牙Vincent3 小时前
Android BLE SDK 设计手册(一):一次参数改动,让我重新设计了整套架构
android·架构
angerdream3 小时前
Android手把手编写儿童手机远程监控App之广播开机自启动
android·android studio
su_ym81103 小时前
Android SELinux
android·selinux
阿巴斯甜4 小时前
Android中项目架构:
android
程序员陆业聪5 小时前
线上监控与防劣化:让启动优化成果不再回退 | Android启动优化系列(五·完结)
android
程序员陆业聪5 小时前
首帧渲染优化:从白屏到内容可见的最后一公里
android