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

相关推荐
拥小抱2 小时前
Compose 知识点
android
文章永久免费只为良心2 小时前
Web应用安全与防护_第三章_日志文件包含_从一道 CTFshow 题目讲透「日志投毒型 LFI → RCE」:原理、时序陷阱与全变种攻防手册
android·网络安全·渗透测试·漏洞危害·漏洞描述·日志投毒·红队指南
AIsoft_86893 小时前
学术讲座录音如何整理?录音APP可行吗
android·iphone
Patrick在香港5 小时前
一个斜杠,把毫秒变成十几秒
android·数据库·python·性能优化·正则表达式·回溯·redos
海雅达手持终端PDA6 小时前
工业手持终端的“去手机化”演进:看海雅达如何以“同轴扫摄”终结工程妥协,重塑工业PDA新范式
android·物联网·智能手机·硬件工程·能源·制造·iot
booboosui7 小时前
删掉一个住在本机的 agent:8 处要清,顺序不能反
android
hcgeng8 小时前
Android获取崩溃日志
android
aqi008 小时前
AI编程让鸿蒙开发电子书APP更加快捷
android·华为·harmonyos·鸿蒙·harmony
GY-938 小时前
【Android】Android Studio 中的协程
android