当前位置: 代码迷 >> 综合 >> JNI崩溃(ndk crash)日志,快速解析脚本
  详细解决方案

JNI崩溃(ndk crash)日志,快速解析脚本

热度:57   发布时间:2023-12-11 21:30:58.0

准备一段崩溃

  1. 我们在打开AndroidStudio后,会引导你创建一个C++项目。

     

  2. 打开CPP文件,制造一个空指针异常

     

  1. 运行程序将得到如下崩溃:

 

01-09 16:59:55.648 30208 30208 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-09 16:59:55.648 30208 30208 F DEBUG   : Build fingerprint: 'HUAWEI/EVR-AN00/HWEVR:9/HUAWEIEVR-AN00/9.1.1.205C00:user/release-keys'
01-09 16:59:55.648 30208 30208 F DEBUG   : Revision: '0'
01-09 16:59:55.648 30208 30208 F DEBUG   : ABI: 'arm64'
01-09 16:59:55.648 30208 30208 F DEBUG   : Happend: 'Thu Jan  9 16:59:55 2020
01-09 16:59:55.648 30208 30208 F DEBUG   : '
01-09 16:59:55.648 30208 30208 F DEBUG   : SYSVMTYPE: Maple
01-09 16:59:55.648 30208 30208 F DEBUG   : APPVMTYPE: Art
01-09 16:59:55.648 30208 30208 F DEBUG   : pid: 30173, tid: 30173, name: loud.faster.cpp  >>> com.cloud.faster.cpp <<<
01-09 16:59:55.648 30208 30208 F DEBUG   : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
01-09 16:59:55.648 30208 30208 F DEBUG   :     x0  0000000000000000  x1  00000000000075dd  x2  0000000000000006  x3  0000000000000008
01-09 16:59:55.648 30208 30208 F DEBUG   :     x4  fefefefeff27feff  x5  fefefefeff27feff  x6  fefefefeff27feff  x7  7f7f7f7f7f7f7f7f
01-09 16:59:55.648 30208 30208 F DEBUG   :     x8  0000000000000083  x9  41c3e0e68b74670c  x10 0000000000000000  x11 fffffffc7ffffbdf
01-09 16:59:55.648 30208 30208 F DEBUG   :     x12 0000000000000001  x13 ffffffffffffffff  x14 0000000000000000  x15 ffffffffffffffff
01-09 16:59:55.648 30208 30208 F DEBUG   :     x16 000000754fd302c0  x17 000000754fc6ee34  x18 00000074af139153  x19 00000000000075dd
01-09 16:59:55.648 30208 30208 F DEBUG   :     x20 00000000000075dd  x21 00000074ae43b000  x22 00000074c2c1f460  x23 00000074af119c3c
01-09 16:59:55.648 30208 30208 F DEBUG   :     x24 0000000000000004  x25 0000007551a8f5e0  x26 00000074cb215ca0  x27 0000000000000001
01-09 16:59:55.648 30208 30208 F DEBUG   :     x28 0000007fe5dbfa60  x29 0000007fe5dbf880
01-09 16:59:55.648 30208 30208 F DEBUG   :     sp  0000007fe5dbf840  lr  000000754fc63960  pc  000000754fc63988
01-09 16:59:55.754 30208 30208 F DEBUG   :
01-09 16:59:55.754 30208 30208 F DEBUG   : backtrace:
01-09 16:59:55.754 30208 30208 F DEBUG   :     #00 pc 0000000000022988  /system/lib64/libc.so (abort+116)
01-09 16:59:55.754 30208 30208 F DEBUG   :     #01 pc 000000000000d458  /data/app/com.cloud.faster.cpp-RKZrBztu4KB6hTWVqP32sQ==/lib/arm64/libnative-lib.so (__gnu_cxx::__verbose_terminate_handler()+348)
01-09 16:59:55.754 30208 30208 F DEBUG   :     #02 pc 0000000000007974  /data/app/com.cloud.faster.cpp-RKZrBztu4KB6hTWVqP32sQ==/lib/arm64/libnative-lib.so (__cxxabiv1::__terminate(void (*)())+8)
01-09 16:59:55.754 30208 30208 F DEBUG   :     #03 pc 00000000000079e0  /data/app/com.cloud.faster.cpp-RKZrBztu4KB6hTWVqP32sQ==/lib/arm64/libnative-lib.so (std::terminate()+12)
01-09 16:59:55.754 30208 30208 F DEBUG   :     #04 pc 0000000000007b1c  /data/app/com.cloud.faster.cpp-RKZrBztu4KB6hTWVqP32sQ==/lib/arm64/libnative-lib.so (__cxa_throw+136)
01-09 16:59:55.754 30208 30208 F DEBUG   :     #05 pc 000000000000d604  /data/app/com.cloud.faster.cpp-RKZrBztu4KB6hTWVqP32sQ==/lib/arm64/libnative-lib.so
01-09 16:59:55.754 30208 30208 F DEBUG   :     #06 pc 0000000000008334  /data/app/com.cloud.faster.cpp-RKZrBztu4KB6hTWVqP32sQ==/lib/arm64/libnative-lib.so
01-09 16:59:55.754 30208 30208 F DEBUG   :     #07 pc 0000000000006e3c  /data/app/com.cloud.faster.cpp-RKZrBztu4KB6hTWVqP32sQ==/lib/arm64/libnative-lib.so (Java_com_cloud_faster_cpp_MainActivity_stringFromJNI+60)

初级工具ndk-stack:

ndk-stack是ndk开发工具包下提供的好用工具,能结合崩溃日志给出详细分析
基础用法: ndk-stack -sym 带有符号表的so所在的目录 -dump 崩溃日志
比如

 

 ~/Library/Android/sdk/ndk/android-ndk-r16b/ndk-stack -sym app/build/intermediates/cmake/debug/obj/arm64-v8a -dump crash.log 

 

使用addr2line,解析出映射的符号表

以下为python脚本:

 

#!/usr/bin/env python
# coding=utf-8
import os# 配置addr2line工具的位置
# addr2lineFilePath = '/Users/a/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-addr2line'
# addr2lineFilePath = '/Users/a/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-addr2line'
# addr2lineFilePath = '/Users/a/Library/Android/sdk/ndk/android-ndk-r18b/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-addr2line'
addr2lineFilePath = '/Users/a/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-addr2line'
# 配置符号表so,也就是没有裁剪过的so,体积比较大的so
# symbolFilePath = '/Users/a/Downloads/AndroidJNI-2.0.1.72/jni/arm64-v8a/libflash-downloader-lib.so'
symbolFilePath = '/Users/a/Android/network-toolkit-http/platform/Android/src/main/jniLibs/arm64-v8a/libaliplayer.so'
# 崩溃的日志
crashFilePath = 'NdkCrash.log'command_line_header = addr2lineFilePath + ' -e ' + symbolFilePath + ' 'print('addr2lineTools:%s' % addr2lineFilePath)print('SoSymbolFile:%s' % symbolFilePath)print('开始解析')fullOutPrint = ''
with open(crashFilePath, 'r') as file:keyString = " pc "for line in file:if line.find('\n') < 0:line += '\n'print(line, end='')# 是否包含关键字:pcbegin = line.find(keyString) + len(keyString)# 是否包含关键字,关键字之前是否有#if begin < 0 or line[:begin].find('#') < 0:continueend = line[begin:].find(' ') + begin########################### 堆栈信息:# 补充空格spaceCount = begin-7if spaceCount < 0:spaceCount = 0info = (' ' * spaceCount)# 绿色的堆栈idinfo += ('\u001b[1;36m' + '????? ?' + line[begin:end] + '?')# 解析调用栈command = command_line_header + line[begin:end]f = os.popen(command)read = f.read()f.close()read = read.strip('\n')info += ('\u001b[31m' + read + '\u001b[0m')if not info.endswith('\n'):info += '\n'print(info, end='')# fullOutPrint += outPrint# print(fullOutPrint)

运行的效果

 

  相关解决方案