【问题标题】:SIGSEGV error with limited stacktrace具有有限堆栈跟踪的 SIGSEGV 错误
【发布时间】:2011-08-30 12:44:05
【问题描述】:

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

但是,当本机线程等待来自 OpenSL ES API 的数据时,我收到一条带有本机堆栈跟踪的 SIGSEGV 错误消息。但是,我看不到错误发生在哪里,因为堆栈跟踪非常无用......这是因为程序计数器没有显示,只有寄存器。

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

这是整个堆栈跟踪...如果有人能指出我可以从哪里开始调试此错误?我知道 NDK 提供的 addr2line 实用程序,但是没有程序计数器,我无法确定错误发生在哪里...

更新

根据@http://groups.google.com/group/android-ndk/browse_thread/thread/d7fe50f356f50896# 给出的建议,我已经能够进一步调查该问题。在 libOpenSLES.so 和 libc.so 上使用 Addr2Line 工具后,我对 libc.so 很感兴趣。但是,有问题的文件是由 python 自动生成的,并且是用 Assembly 编写的。然而,它是一个系统调用。我说的文件是fchownat.S:

/* 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

有人知道它为什么会在这里崩溃吗?更好的是,有人可以解释它的实际作用吗?根据我的发现,这是一个更改文件所有权的系统调用......但我无法从代码中理解这一点......我的组装技能一点也不可怕......

【问题讨论】:

  • 程序计数器就在 'pc' 旁边 - 0x8010dde8
  • 由于某种原因,这不是真正的程序计数器...它通常稍后显示在一系列程序计数器中,您可以从中找到引发异常的路径。 .. 我确实尝试将那台电脑翻译成合理的东西,但 addr2line 工具无法使用它。它发布?? ??:0
  • 您可能需要将前 3 位数字清零以获得有效值。即 0x0000dde8 - 但我有一段时间没玩过这个东西了!
  • 你有没有考虑阅读这个:bootloader.wikidot.com/linux:android:crashlog
  • 已考虑并完成...但是,这证实了我在第一条评论中所说的话,没有显示真正的程序计数器...它应该在寄存器之后显示...

标签: android android-ndk segmentation-fault


【解决方案1】:

这个问题显然是由于我没有正确同步对缓冲区的访问,我使用该缓冲区将数据从 OpenSL ES 回调传递到我自己的线程。正确同步访问后,错误消失。

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多