美文网首页Android开发Android开发经验谈Android技术知识
一个优秀的JNI崩溃(ndk crash)日志解析脚本

一个优秀的JNI崩溃(ndk crash)日志解析脚本

作者: ReadyShow | 来源:发表于2020-03-30 23:04 被阅读0次

    准备一段崩溃

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


      AndroidStudio引导创建C++项目
    2. 打开CPP文件,制造一个空指针异常


      C++空指针异常
    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 
    
    ndk-stack解析后的日志

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

    以下为python脚本:

    #!/usr/bin/env python
    # coding=utf-8
    import os
    
    # 配置addr2line工具的位置
    addr2lineFilePath = '/Users/jian/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-addr2line'
    # 配置符号表so,也就是没有压缩过的so,体积比较大的so
    symbolFilePath = 'libflash-downloader-lib.so'
    # 崩溃的日志
    crashFilePath = 'NdkCrash.log'
    
    command_line_header = addr2lineFilePath + ' -e ' + symbolFilePath + ' '
    
    print('开始解析\n', end='')
    
    with open(crashFilePath, 'r') as file:
        keyString = " pc "
        for line in file:
            # 是否包含关键字:pc
            begin = line.find(keyString) + len(keyString)
            # 是否包含关键字,关键字之前是否有#
            if begin < 0 or line[:begin].find('#') < 0:
                print(line, end='')
                continue
            end = line[begin:].find(' ') + begin
            # 补充空格
            print(' ' * begin, end='')
            print('\u001b[1;36m ' + '↱' + line[begin:end] + '⇨', end='')
            # 解析调用栈
            command = command_line_header + line[begin:end]
            f = os.popen(command)
            print('\u001b[31m' + f.read() + ' \u001b[0m ', end='')
            f.close()
            print(line, end='')
    
    

    运行的效果

    效果

    相关文章

      网友评论

        本文标题:一个优秀的JNI崩溃(ndk crash)日志解析脚本

        本文链接:https://www.haomeiwen.com/subject/fbiyactx.html