Android NDK开发崩溃 signal 11 (SIGSEGV), code 1 (SEGV_MAPERR),解决方法
<h3 id="一前言">一.前言</h3><p>在NDK开发的过程中,如果遇到应用Crash,JNI层的报错信息并不像java层那样可以看到详细的错误信息和错误位置,如果要想定位到错误位置,需要借助NDK的一些工具进行地址转换,本文中用addr2line(NDK的工具)来捕捉错误信息</p>
<h3 id="二分析">二.分析</h3>
<p>以下是我的报错信息</p>
<pre><code>signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
Cause: null pointer dereference
r000000000r1e4a9b9dcr20000ffffr3bf1acf00
r4bf1acf00r5bd10da00r6bd10da20r700000004
r8bda55fe0r900000000r10 bd10dbccr11 bbdc3858
ipe4dfdfe4spbbdc3698lre4dfcd83pcbee6ec34
backtrace:
#00 pc 00011c34/data/app/com.raypai.splitassist-dqx6PtGtLxCC3HigSgunAA==/lib/arm/libusb100.so
#01 pc 0000d200/data/app/com.raypai.splitassist-dqx6PtGtLxCC3HigSgunAA==/lib/arm/libusb100.so
#02 pc 0000cb60/data/app/com.raypai.splitassist-dqx6PtGtLxCC3HigSgunAA==/lib/arm/libusb100.so (libusb_handle_events_timeout_completed+968)
#03 pc 0000d3cc/data/app/com.raypai.splitassist-dqx6PtGtLxCC3HigSgunAA==/lib/arm/libusb100.so (libusb_handle_events+52)
#04 pc 00012c20/data/app/com.raypai.splitassist-dqx6PtGtLxCC3HigSgunAA==/lib/arm/libuvc.so (_uvc_handle_events+136)
#05 pc 00065ac7/system/lib/libc.so (__pthread_start(void*)+22)
#06 pc 0001e9ad/system/lib/libc.so (__start_thread+32)
</code></pre>
<p>读取其中的关键信息</p>
<p>1.错误代号:Fatal signal 11 (SIGSEGV), code 1,一般都是空指针错误</p>
<p>2.错误发生所在的so文件:libusb100.so</p>
<p>3.错误发生的内存地址:00011c34,不能直接看到源代码发生错误的位置,所以需要用addr2line工具来定位</p>
<p>tip: 1,注意调试文件的位置在obj目录下,并非libs目录下生成的so文件</p>
<h3 id="三利用addr2line定位错误">三.利用addr2line定位错误</h3>
<ol>
<li>其中-C -f :表示打印错误行数所在的函数名称,-e:表示打印错误地址的对应路径及行数</li>
<li>Enter执行,得到结果如下</li>
</ol>
<pre><code>addr2line -i -C -f -e libusb100.so 00011c34
handle_iso_completion
libusb/os/android_usbfs.c:2729
reap_for_handle
libusb/os/android_usbfs.c:2932
op_handle_events
libusb/os/android_usbfs.c:2990
</code></pre>
<p>到这里就可以明确地看到出错误发生在源代码的哪一行了</p>
<p>### 四.后记</p>
<p>通过上面的定位,问题在libusb/os/android_usbfs.c文件中的handle_iso_completion 函数,2729行。</p>
<pre><code>if (urb == tpriv->iso_urbs) {
urb_idx = i + 1;
break;
}
</code></pre>
<p>这里tpriv->iso_urbs会有为NULL的时候。从而导致了空指针。<br>
修改方法如下:</p>
<pre><code>if (tpriv->iso_urbs != NULL && urb == tpriv->iso_urbs) {
urb_idx = i + 1;
break;
}
</code></pre><br><br>
来源:https://www.cnblogs.com/rocket-ban/p/14717425.html
頁:
[1]