Android 具有有限堆栈跟踪的SIGSEGV错误

Android 具有有限堆栈跟踪的SIGSEGV错误,android,android-ndk,segmentation-fault,Android,Android Ndk,Segmentation Fault,我正在尝试本机缓冲从OpenSL ES API检索的音频。 为此,我在我的C文件中实现了一个简单的队列,它保存缓冲数据。 然后,如果有足够的缓冲数据(至少3个缓冲音频帧,1个帧=30毫秒音频),我将使用本机pthread将缓冲数据传递到Java层 然而,当本机线程正在等待来自OpenSL ES API的数据时,我收到一条SIGSEGV错误消息,其中包含本机stacktrace。但是,我看不出错误发生在哪里,因为stacktrace是非常无用的。。。。这是因为不显示程序计数器,只显示寄存器 08-

我正在尝试本机缓冲从OpenSL ES API检索的音频。 为此,我在我的C文件中实现了一个简单的队列,它保存缓冲数据。 然后,如果有足够的缓冲数据(至少3个缓冲音频帧,1个帧=30毫秒音频),我将使用本机pthread将缓冲数据传递到Java层

然而,当本机线程正在等待来自OpenSL ES API的数据时,我收到一条SIGSEGV错误消息,其中包含本机stacktrace。但是,我看不出错误发生在哪里,因为stacktrace是非常无用的。。。。这是因为不显示程序计数器,只显示寄存器

08-30 14:09:51.148: INFO/DEBUG(21802): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
08-30 14:09:51.148: INFO/DEBUG(21802): Build fingerprint: 'samsung/GT-I9000/GT-I9000:2.3.2/GINGERBREAD/XWJV1:user/release-keys'
08-30 14:09:51.148: INFO/DEBUG(21802): pid: 21803, tid: 21811  >>> w�� <<<
08-30 14:09:51.148: INFO/DEBUG(21802): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr fffc0000
08-30 14:09:51.148: INFO/DEBUG(21802):  r0 405329c0  r1 fffc0000  r2 000001a0  r3 00000000
08-30 14:09:51.148: INFO/DEBUG(21802):  r4 405329c0  r5 00000000  r6 002b5688  r7 000001e0
08-30 14:09:51.148: INFO/DEBUG(21802):  r8 84b00dc5  r9 00000000  10 00100000  fp 00000001
08-30 14:09:51.148: INFO/DEBUG(21802):  ip 822a5684  sp 46e6dea0  lr 8224b657  pc 8010dde8  cpsr 20000010
08-30 14:09:51.148: INFO/DEBUG(21802):  d0  697320657565757a  d1  6974696c69747565
08-30 14:09:51.148: INFO/DEBUG(21802):  d2  6f696475412f733a  d3  6f737365636f7220
08-30 14:09:51.148: INFO/DEBUG(21802):  d4  006c006c00690068  d5  006100650074002e
08-30 14:09:51.148: INFO/DEBUG(21802):  d6  006e0069006c006d  d7  00730075002e006b
08-30 14:09:51.148: INFO/DEBUG(21802):  d8  0000000000000000  d9  0000000000000000
08-30 14:09:51.148: INFO/DEBUG(21802):  d10 0000000000000000  d11 0000000000000000
08-30 14:09:51.148: INFO/DEBUG(21802):  d12 0000000000000000  d13 0000000000000000
08-30 14:09:51.148: INFO/DEBUG(21802):  d14 0000000000000000  d15 0000000000000000
08-30 14:09:51.148: INFO/DEBUG(21802):  d16 000000004052e0f8  d17 0000000000000000
08-30 14:09:51.148: INFO/DEBUG(21802):  d18 0000000000000000  d19 0000000000000000
08-30 14:09:51.148: INFO/DEBUG(21802):  d20 3fe0000000000000  d21 8000000000000000
08-30 14:09:51.148: INFO/DEBUG(21802):  d22 0000000000000000  d23 0000000000000000
08-30 14:09:51.148: INFO/DEBUG(21802):  d24 0000000000000000  d25 3ff0000000000000
08-30 14:09:51.148: INFO/DEBUG(21802):  d26 0000000000000000  d27 3ff0000000000000
08-30 14:09:51.148: INFO/DEBUG(21802):  d28 0000000000000000  d29 4000000000000000
08-30 14:09:51.148: INFO/DEBUG(21802):  d30 0000000000000000  d31 3fe0000000000000
08-30 14:09:51.148: INFO/DEBUG(21802):  scr 60000012
08-30 14:09:51.148:信息/调试(21802):************************************
08-30 14:09:51.148:INFO/DEBUG(21802):构建指纹:“三星/GT-I9000/GT-I9000:2.3.2/姜饼/XWJV1:用户/释放密钥”

08-30 14:09:51.148:信息/调试(21802):pid:21803,tid:21811>>>w�� 这个问题显然是因为我没有正确地同步对缓冲区的访问,我使用缓冲区将数据从OpenSL ES回调传递到我自己的线程。正确同步访问后,错误消失。

程序计数器就在“pc”-0x8010DDE8旁边,出于某种原因,它不是真正的程序计数器。。。它通常在以后的一系列程序计数器中显示,从这些计数器中,您可以沿着引发异常的路径。。。我确实试着把那台电脑翻译成一些有意义的东西,但是addr2line工具不能与之配合使用。它发布了
0
。您可能需要将前3位数字归零才能获得有效值。i、 e.0x0000dde8-但我已经有一段时间没有玩过这种东西了!你有没有考虑过读这篇文章:考虑并完成。。。然而,这证实了我在第一条评论中所说的,真正的程序计数器没有显示。。。它应该在寄存器之后显示。。。
/* autogenerated by gensyscalls.py */
#include <sys/linux-syscalls.h>

    .text
    .type fchownat, #function
    .globl fchownat
    .align 4
    .fnstart

fchownat:
    mov     ip, sp
    .save   {r4, r5, r6, r7}
    stmfd   sp!, {r4, r5, r6, r7}
    ldmfd   ip, {r4, r5, r6}
    ldr     r7, =__NR_fchownat
    swi     #0
    ldmfd   sp!, {r4, r5, r6, r7}
    movs    r0, r0
    bxpl    lr
    b       __set_syscall_errno
    .fnend