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

相关推荐
JohnnyDeng942 小时前
Android 包体积优化:R8/ProGuard 深度配置
android
qq_452396232 小时前
第六篇:《JMeter逻辑控制器:循环、条件和交替执行》
android·java·jmeter
cwzqf3 小时前
Jectpack Compose项目组件代码分享(1):分页加载组件
android
@北海怪兽4 小时前
SQL常见函数整理 _ STRING_AGG()
android·数据库·sql
鹏晨互联5 小时前
【Compose vs XML:边框内外间距的实现对比】
android·xml
Android系统攻城狮5 小时前
Android tinyalsa深度解析之pcm_plugin_write调用流程与实战(一百七十九)
android·pcm·tinyalsa·android16·音频进阶·android音频进阶
ID_180079054735 小时前
除了JSON,淘宝店铺商品API接口还支持哪些数据格式?
android·数据库
KillerNoBlood6 小时前
2026移动端跨平台开发面经总结
android·算法·flutter·ios·移动开发·鸿蒙·kmp
消失的旧时光-19436 小时前
Android / IoT 面试复盘总结:从 MQTT、TLS 到 JWT 权限体系(标准答案 + 工程理解 + 延伸知识链)
android·物联网·面试
林多7 小时前
【Android】 GPU过度绘制实现原理
android·gpu·性能·实现原理·过度绘制·overdraw