Android NDK&JNI开发之Native崩溃日志分析方法
<p>在进行Android NDK开发的时候, 因为代码编写导致崩溃的问题时有发生,但是问题在于,Native层的崩溃日志,如果只看LogCat输出的内容,我们会发现,根本无法进行分析和处理,因为日志内容中都是一大堆的内存地址信息。</p><h3>原始错误日志:</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.149</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
<span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.150</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/DEBUG: Build fingerprint: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">HONOR/LLD-AL00/HWLLD-H:9/HONORLLD-AL00/9.1.0.140C00:user/release-keys</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.150</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/DEBUG: Revision: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.150</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/DEBUG: ABI: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">arm</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.150</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/DEBUG: Happend: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Thu Aug 20 18:04:01 2020</span>
<span style="color: rgba(128, 0, 0, 1)">'
</span><span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.151</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/<span style="color: rgba(0, 0, 0, 1)">DEBUG: SYSVMTYPE: Art
APPVMTYPE: Art
</span><span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.151</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/DEBUG: pid: <span style="color: rgba(128, 0, 128, 1)">26194</span>, tid: <span style="color: rgba(128, 0, 128, 1)">27088</span>, name: Thread-<span style="color: rgba(128, 0, 128, 1)">1682</span>>>> com.renhui.maomaomedia <<<
<span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.151</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/DEBUG: signal <span style="color: rgba(128, 0, 128, 1)">11</span> (SIGSEGV), code <span style="color: rgba(128, 0, 128, 1)">1</span> (SEGV_MAPERR), fault addr <span style="color: rgba(128, 0, 128, 1)">0x0</span>
<span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.151</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/DEBUG: Cause: <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)"> pointer dereference
</span><span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.151</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/DEBUG: r0c8da4000r1<span style="color: rgba(128, 0, 128, 1)">00000000</span>r2eed3a564r3<span style="color: rgba(128, 0, 128, 1)">40000000</span>
<span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.151</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/<span style="color: rgba(0, 0, 0, 1)">DEBUG: r4c58858f0r5c5885970r6c5885970r7c5885940
</span><span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.151</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/DEBUG: r8<span style="color: rgba(128, 0, 128, 1)">00006652</span><span style="color: rgba(0, 0, 0, 1)">r9000069cdr10 c92a626dr11 c8da4000
</span><span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.151</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/<span style="color: rgba(0, 0, 0, 1)">DEBUG: ipc954dfa8spc58858f0lrc92a641bpcc92a62a4
</span><span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.153</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/<span style="color: rgba(0, 0, 0, 1)">DEBUG: backtrace:
</span><span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.153</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/DEBUG: #<span style="color: rgba(128, 0, 128, 1)">00</span> pc 000192a4/data/app/com.renhui.maomaomedia-HZzt4BSwxxXs-qqIDrrlng==/lib/arm/libmedia-editor-lib.so (VideoHandler::decodeVideo()+<span style="color: rgba(128, 0, 128, 1)">28</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.153</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/DEBUG: #<span style="color: rgba(128, 0, 128, 1)">01</span> pc 0001927b/data/app/com.renhui.maomaomedia-HZzt4BSwxxXs-qqIDrrlng==/lib/arm/libmedia-editor-lib.so (decodeVideoT(<span style="color: rgba(0, 0, 255, 1)">void</span>*)+<span style="color: rgba(128, 0, 128, 1)">14</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.153</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/DEBUG: #<span style="color: rgba(128, 0, 128, 1)">02</span> pc 00065ac7/system/lib/libc.so (__pthread_start(<span style="color: rgba(0, 0, 255, 1)">void</span>*)+<span style="color: rgba(128, 0, 128, 1)">22</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(128, 0, 128, 1)">2020</span>-<span style="color: rgba(128, 0, 128, 1)">08</span>-<span style="color: rgba(128, 0, 128, 1)">20</span> <span style="color: rgba(128, 0, 128, 1)">18</span>:<span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">01.153</span> <span style="color: rgba(128, 0, 128, 1)">27129</span>-<span style="color: rgba(128, 0, 128, 1)">27129</span>/? A/DEBUG: #<span style="color: rgba(128, 0, 128, 1)">03</span> pc 0001e9ad/system/lib/libc.so (__start_thread+<span style="color: rgba(128, 0, 128, 1)">32</span>)</pre>
</div>
<h3>Native日志分析方式:</h3>
<p>将LogCat输出的Native崩溃日志,拷贝到crash.log(注意:最好以星号这行开始),并复制到build目录下的cmake编译后的so文件目录下,需要注意的是编译目录armeabi要和crash.log对应,cmake\debug\obj\arm-XXX目录下要有so文件,这个是编译的时候生成的。</p>
<p>例如,我们运行的so文件是armeabi-v7a下的,那么拷贝到此下面,执行如下命令:</p>
<div class="cnblogs_code">
<pre>ndk-stack -<span style="color: rgba(0, 0, 0, 1)">sym C:\Users\maomao\Desktop\WukongMemo\MaoMaoMedia\player\build\intermediates\cmake\debug\obj\armeabi</span>-v7a -dump crash.log</pre>
</div>
<p>然后我们就能看到带文件名、函数名和行号的log日志了,进而我们就可以进一步排查和修复问题了。</p>
<div class="cnblogs_code">
<pre>C:\Users\maomao\Desktop\WukongMemo\MaoMaoMedia\player\build\intermediates\cmake\debug\obj>ndk-stack -<span style="color: rgba(0, 0, 0, 1)">sym C:\Users\maomao\Desktop\WukongMemo\MaoMaoMedia\player\build\intermed
iates\cmake\debug\obj\armeabi</span>-v7a -<span style="color: rgba(0, 0, 0, 1)">dump crash.log
</span>********** Crash dump: **********<span style="color: rgba(0, 0, 0, 1)">
Build fingerprint: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">HONOR/LLD-AL00/HWLLD-H:9/HONORLLD-AL00/9.1.0.140C00:user/release-keys</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
#</span><span style="color: rgba(128, 0, 128, 1)">00</span> <span style="color: rgba(128, 0, 128, 1)">0x000192a4</span> /data/app/com.renhui.maomaomedia-HZzt4BSwxxXs-qqIDrrlng==/lib/arm/libmedia-editor-lib.so (VideoHandler::decodeVideo()+<span style="color: rgba(128, 0, 128, 1)">28</span><span style="color: rgba(0, 0, 0, 1)">)
VideoHandler::decodeVideo()
C:\Users\maomao\Desktop\WukongMemo\MaoMaoMedia\player\.cxx\cmake\deb
ug\armeabi</span>-v7a\../../../../src/main/cpp/player\VideoHandler.cpp:<span style="color: rgba(128, 0, 128, 1)">59</span>:<span style="color: rgba(128, 0, 128, 1)">27</span><span style="color: rgba(0, 0, 0, 1)">
#</span><span style="color: rgba(128, 0, 128, 1)">01</span> <span style="color: rgba(128, 0, 128, 1)">0x0001927b</span> /data/app/com.renhui.maomaomedia-HZzt4BSwxxXs-qqIDrrlng==/lib/arm/libmedia-editor-lib.so (decodeVideoT(<span style="color: rgba(0, 0, 255, 1)">void</span>*)+<span style="color: rgba(128, 0, 128, 1)">14</span><span style="color: rgba(0, 0, 0, 1)">)
decodeVideoT(</span><span style="color: rgba(0, 0, 255, 1)">void</span>*<span style="color: rgba(0, 0, 0, 1)">)
C:\Users\maomao\Desktop\WukongMemo\MaoMaoMedia\player\.cxx\cmake\deb
ug\armeabi</span>-v7a\../../../../src/main/cpp/player\VideoHandler.cpp:<span style="color: rgba(128, 0, 128, 1)">20</span>:<span style="color: rgba(128, 0, 128, 1)">19</span><span style="color: rgba(0, 0, 0, 1)">
#</span><span style="color: rgba(128, 0, 128, 1)">02</span> <span style="color: rgba(128, 0, 128, 1)">0x00065ac7</span> /system/lib/libc.so (__pthread_start(<span style="color: rgba(0, 0, 255, 1)">void</span>*)+<span style="color: rgba(128, 0, 128, 1)">22</span><span style="color: rgba(0, 0, 0, 1)">)
#</span><span style="color: rgba(128, 0, 128, 1)">03</span> <span style="color: rgba(128, 0, 128, 1)">0x0001e9ad</span> /system/lib/libc.so (__start_thread+<span style="color: rgba(128, 0, 128, 1)">32</span><span style="color: rgba(0, 0, 0, 1)">)
Crash dump </span><span style="color: rgba(0, 0, 255, 1)">is</span> completed</pre>
</div>
<h3>注意事项:</h3>
<p><span style="color: rgba(255, 0, 0, 1)">必须将 Logcat 设置为 No Filter 才能看到全部错误信息,否则只看到 signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) 。</span></p>
<p><span style="color: rgba(255, 0, 0, 1)">简化方式,cd到build\intermediates\cmake\debug目录下,输入如下命令:</span></p>
<div class="cnblogs_code">
<pre>ndk-stack -sym obj/armeabi-v7a -dump obj/armeabi-v7a/crash.log</pre>
</div>
<p> </p><br><br>
来源:https://www.cnblogs.com/renhui/p/13536720.html
頁:
[1]