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

相关推荐
笑一下蒜了.7 小时前
Linux 存储多路径访问手册|multipath.conf 各配置段详解
android·linux·运维
凡泰AI7 小时前
如何通过小程序多端框架,让一个小程序同时运行在iOS、安卓、鸿蒙以及PC客户端,实现一次开发多端运行的效果
android·ios·小程序
一笑的小酒馆8 小时前
Androidiot扫地机器人设备详情页地图加载慢卡顿优化方案
android
xixiaoyunya8 小时前
安卓远程管理电脑/NAS文件:从传统SMB方案到Web化私有云的选型与落地实践
android·电脑
Zhu75814 小时前
在k8s集群部署MySQL单实例,支持多个主流发行版
android·mysql·kubernetes
AFinalStone17 小时前
Android 7系统异常问题排查(四)Framework层(上)—System Server Watchdog
android·系统异常
宝杰X718 小时前
Android Room3 多平台数据库
android·数据库
huibin14785236921 小时前
热缓解学习记录
android·学习
小田的博客1 天前
SAP MM 供应商银行主数据更新报错!message R1228!
android·java·服务器
一笑的小酒馆1 天前
Android智能猫砂盆视频加载慢卡顿问题分析
android