zoukankan      html  css  js  c++  java
  • Android NDK&JNI开发之Native崩溃日志分析方法

    在进行Android NDK开发的时候, 因为代码编写导致崩溃的问题时有发生,但是问题在于,Native层的崩溃日志,如果只看LogCat输出的内容,我们会发现,根本无法进行分析和处理,因为日志内容中都是一大堆的内存地址信息。

    原始错误日志:

    2020-08-20 18:04:01.149 27129-27129/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    2020-08-20 18:04:01.150 27129-27129/? A/DEBUG: Build fingerprint: 'HONOR/LLD-AL00/HWLLD-H:9/HONORLLD-AL00/9.1.0.140C00:user/release-keys'
    2020-08-20 18:04:01.150 27129-27129/? A/DEBUG: Revision: '0'
    2020-08-20 18:04:01.150 27129-27129/? A/DEBUG: ABI: 'arm'
    2020-08-20 18:04:01.150 27129-27129/? A/DEBUG: Happend: 'Thu Aug 20 18:04:01 2020
        '
    2020-08-20 18:04:01.151 27129-27129/? A/DEBUG: SYSVMTYPE: Art
        APPVMTYPE: Art
    2020-08-20 18:04:01.151 27129-27129/? A/DEBUG: pid: 26194, tid: 27088, name: Thread-1682  >>> com.renhui.maomaomedia <<<
    2020-08-20 18:04:01.151 27129-27129/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
    2020-08-20 18:04:01.151 27129-27129/? A/DEBUG: Cause: null pointer dereference
    2020-08-20 18:04:01.151 27129-27129/? A/DEBUG:     r0  c8da4000  r1  00000000  r2  eed3a564  r3  40000000
    2020-08-20 18:04:01.151 27129-27129/? A/DEBUG:     r4  c58858f0  r5  c5885970  r6  c5885970  r7  c5885940
    2020-08-20 18:04:01.151 27129-27129/? A/DEBUG:     r8  00006652  r9  000069cd  r10 c92a626d  r11 c8da4000
    2020-08-20 18:04:01.151 27129-27129/? A/DEBUG:     ip  c954dfa8  sp  c58858f0  lr  c92a641b  pc  c92a62a4
    2020-08-20 18:04:01.153 27129-27129/? A/DEBUG: backtrace:
    2020-08-20 18:04:01.153 27129-27129/? A/DEBUG:     #00 pc 000192a4  /data/app/com.renhui.maomaomedia-HZzt4BSwxxXs-qqIDrrlng==/lib/arm/libmedia-editor-lib.so (VideoHandler::decodeVideo()+28)
    2020-08-20 18:04:01.153 27129-27129/? A/DEBUG:     #01 pc 0001927b  /data/app/com.renhui.maomaomedia-HZzt4BSwxxXs-qqIDrrlng==/lib/arm/libmedia-editor-lib.so (decodeVideoT(void*)+14)
    2020-08-20 18:04:01.153 27129-27129/? A/DEBUG:     #02 pc 00065ac7  /system/lib/libc.so (__pthread_start(void*)+22)
    2020-08-20 18:04:01.153 27129-27129/? A/DEBUG:     #03 pc 0001e9ad  /system/lib/libc.so (__start_thread+32)

    Native日志分析方式:

    将LogCat输出的Native崩溃日志,拷贝到crash.log(注意:最好以星号这行开始),并复制到build目录下的cmake编译后的so文件目录下,需要注意的是编译目录armeabi要和crash.log对应,cmakedebugobjarm-XXX目录下要有so文件,这个是编译的时候生成的。

    例如,我们运行的so文件是armeabi-v7a下的,那么拷贝到此下面,执行如下命令:

    ndk-stack -sym C:UsersmaomaoDesktopWukongMemoMaoMaoMediaplayeruildintermediatescmakedebugobjarmeabi-v7a -dump crash.log

    然后我们就能看到带文件名、函数名和行号的log日志了,进而我们就可以进一步排查和修复问题了。

    C:UsersmaomaoDesktopWukongMemoMaoMaoMediaplayeruildintermediatescmakedebugobj>ndk-stack -sym C:UsersmaomaoDesktopWukongMemoMaoMaoMediaplayeruildintermed
    iatescmakedebugobjarmeabi-v7a -dump crash.log
    ********** Crash dump: **********
    Build fingerprint: 'HONOR/LLD-AL00/HWLLD-H:9/HONORLLD-AL00/9.1.0.140C00:user/release-keys'
    #00 0x000192a4 /data/app/com.renhui.maomaomedia-HZzt4BSwxxXs-qqIDrrlng==/lib/arm/libmedia-editor-lib.so (VideoHandler::decodeVideo()+28)
                                                                                                             VideoHandler::decodeVideo()
                                                                                                             C:UsersmaomaoDesktopWukongMemoMaoMaoMediaplayer.cxxcmakedeb
    ugarmeabi-v7a../../../../src/main/cpp/playerVideoHandler.cpp:59:27
    #01 0x0001927b /data/app/com.renhui.maomaomedia-HZzt4BSwxxXs-qqIDrrlng==/lib/arm/libmedia-editor-lib.so (decodeVideoT(void*)+14)
                                                                                                             decodeVideoT(void*)
                                                                                                             C:UsersmaomaoDesktopWukongMemoMaoMaoMediaplayer.cxxcmakedeb
    ugarmeabi-v7a../../../../src/main/cpp/playerVideoHandler.cpp:20:19
    #02 0x00065ac7 /system/lib/libc.so (__pthread_start(void*)+22)
    #03 0x0001e9ad /system/lib/libc.so (__start_thread+32)
    Crash dump is completed
  • 相关阅读:
    jsp有哪些内置对象?作用分别是什么?
    Servlet API中forward()与redirect()的区别?
    jsp和servlet的区别、共同点、各自应用的范围?
    Servlet的生命周期
    如何从CDN加载jQuery?
    什么是CDN?哪些是流行的jQuery CDN?使用CDN有什么好处?
    window.onload()函数和jQuery中的document.ready()有什么区别?
    jquery中$.get()提交和$.post()提交有区别吗?
    .JQuery有几种选择器?
    如何在JavaScript中每x秒调用一个函数
  • 原文地址:https://www.cnblogs.com/renhui/p/13536720.html
Copyright © 2011-2022 走看看