在Android上调试Opus崩溃
我一直在尝试在我的Android应用程序中实现Opus编解码器,但我不明白为什么它会崩溃。该应用程序正确地实现了其他编解码器(如iLBC),因此我知道java音频实现是可靠的。Java代码获取一帧音频,将其传递给JNI进行编码/解码,然后接收音频 我首先假设JNI实现不正确。在Android上调试Opus崩溃,android,java-native-interface,opus,Android,Java Native Interface,Opus,我一直在尝试在我的Android应用程序中实现Opus编解码器,但我不明白为什么它会崩溃。该应用程序正确地实现了其他编解码器(如iLBC),因此我知道java音频实现是可靠的。Java代码获取一帧音频,将其传递给JNI进行编码/解码,然后接收音频 我首先假设JNI实现不正确。 然而: 1) 编码器/解码器的创建没有错误 // Encoder/Decoder states are global OpusEncoder *enc; OpusDecoder *dec; jint Java_org_s
然而: 1) 编码器/解码器的创建没有错误
// Encoder/Decoder states are global
OpusEncoder *enc;
OpusDecoder *dec;
jint Java_org_sipdroid_codecs_Opus_encoderCreate(
JNIEnv *env, jobject obj, jint sampleRate, jint channels, jint application)
{
int err;
enc = opus_encoder_create(sampleRate, channels, OPUS_APPLICATION_VOIP, &err);
return (jint)err; // returns OPUS_OK
}
2) 数据以与其他编解码器相同的方式传递,并且似乎功能正常(无奇数返回值):
运行应用程序时,Opus将处理几帧音频(在不崩溃的情况下调用编码/解码),然后应用程序将抛出segfault。以下是JNI stacktrace的一部分:
07-24 16:09:41.642: A/dalvikvm(32168): @@@ ABORTING: DALVIK: HEAP MEMORY CORRUPTION IN mspace_malloc addr=0x0
07-24 16:09:41.642: A/libc(32168): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 32498 (Thread-1674)
07-24 16:09:41.742: I/DEBUG(19804): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
07-24 16:09:41.742: I/DEBUG(19804): Build fingerprint: 'lge/g2_vzw/g2:4.4.2/KOT49I.VS98024A/VS98024A.1394607468:user/release-keys'
07-24 16:09:41.742: I/DEBUG(19804): Revision: '10'
07-24 16:09:41.742: I/DEBUG(19804): pid: 32168, tid: 32498, name: Thread-1674
07-24 16:09:41.742: I/DEBUG(19804): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
07-24 16:09:41.782: I/Vold(263): [LGE][VOLD][NetlinkHandler.cpp][onEvent()] subsys:cpu, action:0
07-24 16:09:41.822: I/DEBUG(19804): r0 00000051 r1 bb8d8cdb r2 bb8d8cdb r3 deadbaad
07-24 16:09:41.822: I/DEBUG(19804): r4 00000000 r5 00000013 r6 42c86ec8 r7 00000001
07-24 16:09:41.822: I/DEBUG(19804): r8 00000094 r9 417b3d50 sl 6202ae68 fp 00000000
07-24 16:09:41.822: I/DEBUG(19804): ip 00000003 sp 6291ab10 lr 41761d75 pc 41761d76 cpsr 600f0030
07-24 16:09:41.822: I/DEBUG(19804): d0 000000000000000f d1 0000000000000000
07-24 16:09:41.822: I/DEBUG(19804): d2 0000000000000000 d3 0000000000000000
07-24 16:09:41.822: I/DEBUG(19804): d4 c6d70e48453e7e94 d5 4020000000000000
07-24 16:09:41.822: I/DEBUG(19804): d6 4024000000000000 d7 0000000000000000
07-24 16:09:41.822: I/DEBUG(19804): d8 0000000000000000 d9 4487000043160000
07-24 16:09:41.822: I/DEBUG(19804): d10 0000000044de0000 d11 0000000000000000
07-24 16:09:41.822: I/DEBUG(19804): d12 0000000000000000 d13 0000000000000000
07-24 16:09:41.822: I/DEBUG(19804): d14 0000000000000000 d15 0000000000000000
07-24 16:09:41.822: I/DEBUG(19804): d16 4d454d2050414548 d17 52524f432059524f
07-24 16:09:41.822: I/DEBUG(19804): d18 00640069006f0072 d19 00640065006d002e
07-24 16:09:41.822: I/DEBUG(19804): d20 0053002e00610069 d21 0061006500720074
07-24 16:09:41.822: I/DEBUG(19804): d22 006e006f0043006d d23 0065006d00750073
07-24 16:09:41.822: I/DEBUG(19804): d24 3fa2d5157e3a5749 d25 bfa2d5157c96b856
07-24 16:09:41.822: I/DEBUG(19804): d26 3dea39ef35793c76 d27 4000000000000000
07-24 16:09:41.822: I/DEBUG(19804): d28 40026143afbf1f95 d29 3fcfa6de9c5a51ea
07-24 16:09:41.822: I/DEBUG(19804): d30 3ff0000000000000 d31 3ff61a4bb8e2a975
07-24 16:09:41.822: I/DEBUG(19804): scr 88000012
07-24 16:09:41.822: I/DEBUG(19804): backtrace:
07-24 16:09:41.822: I/DEBUG(19804): #00 pc 00072d76 /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): #01 pc 00074981 /system/lib/libdvm.so (mspace_malloc+4172)
07-24 16:09:41.822: I/DEBUG(19804): #02 pc 0007530d /system/lib/libdvm.so (mspace_calloc+44)
07-24 16:09:41.822: I/DEBUG(19804): #03 pc 00076375 /system/lib/libdvm.so (dvmHeapSourceAlloc(unsigned int)+128)
07-24 16:09:41.822: I/DEBUG(19804): #04 pc 0002cbc4 /system/lib/libdvm.so (dvmMalloc(unsigned int, int)+64)
07-24 16:09:41.822: I/DEBUG(19804): #05 pc 0006c22b /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): #06 pc 00024834 /system/lib/libdvm.so (dvmAsmSisterStart+500)
07-24 16:09:41.822: I/DEBUG(19804): #07 pc 00030ec8 /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
07-24 16:09:41.822: I/DEBUG(19804): #08 pc 0002e560 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
07-24 16:09:41.822: I/DEBUG(19804): #09 pc 00063795 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+336)
07-24 16:09:41.822: I/DEBUG(19804): #10 pc 000637b9 /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+20)
07-24 16:09:41.822: I/DEBUG(19804): #11 pc 0005848f /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): #12 pc 0000d2e0 /system/lib/libc.so (__thread_entry+72)
07-24 16:09:41.822: I/DEBUG(19804): #13 pc 0000d478 /system/lib/libc.so (pthread_create+240)
07-24 16:09:41.822: I/DEBUG(19804): stack:
07-24 16:09:41.822: I/DEBUG(19804): 6291aad0 400b0394
07-24 16:09:41.822: I/DEBUG(19804): 6291aad4 442cbb38 /dev/ashmem/dalvik- heap (deleted)
07-24 16:09:41.822: I/DEBUG(19804): 6291aad8 400b0394
07-24 16:09:41.822: I/DEBUG(19804): 6291aadc bb8d8cdb
07-24 16:09:41.822: I/DEBUG(19804): 6291aae0 000000a0
07-24 16:09:41.822: I/DEBUG(19804): 6291aae4 57b56d40 /dev/ashmem/dalvik- LinearAlloc (deleted)
07-24 16:09:41.822: I/DEBUG(19804): 6291aae8 62025008
07-24 16:09:41.822: I/DEBUG(19804): 6291aaec 00000004
07-24 16:09:41.822: I/DEBUG(19804): 6291aaf0 6202af78
07-24 16:09:41.822: I/DEBUG(19804): 6291aaf4 bb8d8cdb
07-24 16:09:41.822: I/DEBUG(19804): 6291aaf8 00000000
07-24 16:09:41.822: I/DEBUG(19804): 6291aafc 00000013
07-24 16:09:41.822: I/DEBUG(19804): 6291ab00 42c86ec8 /dev/ashmem/dalvik- heap (deleted)
07-24 16:09:41.822: I/DEBUG(19804): 6291ab04 41761d75 /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): 6291ab08 417a0151 /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): 6291ab0c 417a0178 /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): #00 6291ab10 417a876c /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): 6291ab14 00000000
07-24 16:09:41.822: I/DEBUG(19804): 6291ab18 42817008 /dev/ashmem/dalvik- heap (deleted)
07-24 16:09:41.822: I/DEBUG(19804): 6291ab1c 41763985 /system/lib/libdvm.so (mspace_malloc+4176)
07-24 16:09:41.822: I/DEBUG(19804): #01 6291ab20 00000000
07-24 16:09:41.822: I/DEBUG(19804): 6291ab24 00000094
07-24 16:09:41.822: I/DEBUG(19804): 6291ab28 00000094
07-24 16:09:41.822: I/DEBUG(19804): 6291ab2c 42817008 /dev/ashmem/dalvik- heap (deleted)
07-24 16:09:41.822: I/DEBUG(19804): 6291ab30 00000001
07-24 16:09:41.822: I/DEBUG(19804): 6291ab34 00000094
07-24 16:09:41.822: I/DEBUG(19804): 6291ab38 417b3d50 /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): 6291ab3c 6202ae68
07-24 16:09:41.822: I/DEBUG(19804): 6291ab40 00000000
07-24 16:09:41.822: I/DEBUG(19804): 6291ab44 41764311 /system/lib/libdvm.so (mspace_calloc+48)
07-24 16:09:41.822: I/DEBUG(19804): #02 6291ab48 ffffffff
07-24 16:09:41.822: I/DEBUG(19804): 6291ab4c 416ecc88
07-24 16:09:41.822: I/DEBUG(19804): 6291ab50 00000094
07-24 16:09:41.822: I/DEBUG(19804): 6291ab54 41765379 /system/lib/libdvm.so (dvmHeapSourceAlloc(unsigned int)+132)
07-24 16:09:41.842: I/DEBUG(19804): memory map around fault addr deadbaad:
07-24 16:09:41.842: I/DEBUG(19804): beebd000-beede000 rw- [stack]
07-24 16:09:41.842: I/DEBUG(19804): (no map for address)
07-24 16:09:41.842: I/DEBUG(19804): ffff0000-ffff1000 r-x [vectors]
看起来像
然后我又看了一遍《藏书集》。我最初下载了源代码,并使用Android NDK和我的Android.mk编译了它。
汇编是成功的。我玩了一会儿旗子,但没用
这里会发生什么?DEADBAAD是删除指针时Java写入内存的值。这意味着您正在访问C中不再有效的某个值。确保在不复制数据的情况下不保留数组,在不增加全局引用计数的情况下不保留java对象,并且正确分配和释放数组和字符串。看起来,增加我传递给JNI的缓冲区大小似乎缓解了问题——目前,至少仍在调查这个问题。
07-24 16:09:41.642: A/dalvikvm(32168): @@@ ABORTING: DALVIK: HEAP MEMORY CORRUPTION IN mspace_malloc addr=0x0
07-24 16:09:41.642: A/libc(32168): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 32498 (Thread-1674)
07-24 16:09:41.742: I/DEBUG(19804): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
07-24 16:09:41.742: I/DEBUG(19804): Build fingerprint: 'lge/g2_vzw/g2:4.4.2/KOT49I.VS98024A/VS98024A.1394607468:user/release-keys'
07-24 16:09:41.742: I/DEBUG(19804): Revision: '10'
07-24 16:09:41.742: I/DEBUG(19804): pid: 32168, tid: 32498, name: Thread-1674
07-24 16:09:41.742: I/DEBUG(19804): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
07-24 16:09:41.782: I/Vold(263): [LGE][VOLD][NetlinkHandler.cpp][onEvent()] subsys:cpu, action:0
07-24 16:09:41.822: I/DEBUG(19804): r0 00000051 r1 bb8d8cdb r2 bb8d8cdb r3 deadbaad
07-24 16:09:41.822: I/DEBUG(19804): r4 00000000 r5 00000013 r6 42c86ec8 r7 00000001
07-24 16:09:41.822: I/DEBUG(19804): r8 00000094 r9 417b3d50 sl 6202ae68 fp 00000000
07-24 16:09:41.822: I/DEBUG(19804): ip 00000003 sp 6291ab10 lr 41761d75 pc 41761d76 cpsr 600f0030
07-24 16:09:41.822: I/DEBUG(19804): d0 000000000000000f d1 0000000000000000
07-24 16:09:41.822: I/DEBUG(19804): d2 0000000000000000 d3 0000000000000000
07-24 16:09:41.822: I/DEBUG(19804): d4 c6d70e48453e7e94 d5 4020000000000000
07-24 16:09:41.822: I/DEBUG(19804): d6 4024000000000000 d7 0000000000000000
07-24 16:09:41.822: I/DEBUG(19804): d8 0000000000000000 d9 4487000043160000
07-24 16:09:41.822: I/DEBUG(19804): d10 0000000044de0000 d11 0000000000000000
07-24 16:09:41.822: I/DEBUG(19804): d12 0000000000000000 d13 0000000000000000
07-24 16:09:41.822: I/DEBUG(19804): d14 0000000000000000 d15 0000000000000000
07-24 16:09:41.822: I/DEBUG(19804): d16 4d454d2050414548 d17 52524f432059524f
07-24 16:09:41.822: I/DEBUG(19804): d18 00640069006f0072 d19 00640065006d002e
07-24 16:09:41.822: I/DEBUG(19804): d20 0053002e00610069 d21 0061006500720074
07-24 16:09:41.822: I/DEBUG(19804): d22 006e006f0043006d d23 0065006d00750073
07-24 16:09:41.822: I/DEBUG(19804): d24 3fa2d5157e3a5749 d25 bfa2d5157c96b856
07-24 16:09:41.822: I/DEBUG(19804): d26 3dea39ef35793c76 d27 4000000000000000
07-24 16:09:41.822: I/DEBUG(19804): d28 40026143afbf1f95 d29 3fcfa6de9c5a51ea
07-24 16:09:41.822: I/DEBUG(19804): d30 3ff0000000000000 d31 3ff61a4bb8e2a975
07-24 16:09:41.822: I/DEBUG(19804): scr 88000012
07-24 16:09:41.822: I/DEBUG(19804): backtrace:
07-24 16:09:41.822: I/DEBUG(19804): #00 pc 00072d76 /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): #01 pc 00074981 /system/lib/libdvm.so (mspace_malloc+4172)
07-24 16:09:41.822: I/DEBUG(19804): #02 pc 0007530d /system/lib/libdvm.so (mspace_calloc+44)
07-24 16:09:41.822: I/DEBUG(19804): #03 pc 00076375 /system/lib/libdvm.so (dvmHeapSourceAlloc(unsigned int)+128)
07-24 16:09:41.822: I/DEBUG(19804): #04 pc 0002cbc4 /system/lib/libdvm.so (dvmMalloc(unsigned int, int)+64)
07-24 16:09:41.822: I/DEBUG(19804): #05 pc 0006c22b /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): #06 pc 00024834 /system/lib/libdvm.so (dvmAsmSisterStart+500)
07-24 16:09:41.822: I/DEBUG(19804): #07 pc 00030ec8 /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
07-24 16:09:41.822: I/DEBUG(19804): #08 pc 0002e560 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
07-24 16:09:41.822: I/DEBUG(19804): #09 pc 00063795 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+336)
07-24 16:09:41.822: I/DEBUG(19804): #10 pc 000637b9 /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+20)
07-24 16:09:41.822: I/DEBUG(19804): #11 pc 0005848f /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): #12 pc 0000d2e0 /system/lib/libc.so (__thread_entry+72)
07-24 16:09:41.822: I/DEBUG(19804): #13 pc 0000d478 /system/lib/libc.so (pthread_create+240)
07-24 16:09:41.822: I/DEBUG(19804): stack:
07-24 16:09:41.822: I/DEBUG(19804): 6291aad0 400b0394
07-24 16:09:41.822: I/DEBUG(19804): 6291aad4 442cbb38 /dev/ashmem/dalvik- heap (deleted)
07-24 16:09:41.822: I/DEBUG(19804): 6291aad8 400b0394
07-24 16:09:41.822: I/DEBUG(19804): 6291aadc bb8d8cdb
07-24 16:09:41.822: I/DEBUG(19804): 6291aae0 000000a0
07-24 16:09:41.822: I/DEBUG(19804): 6291aae4 57b56d40 /dev/ashmem/dalvik- LinearAlloc (deleted)
07-24 16:09:41.822: I/DEBUG(19804): 6291aae8 62025008
07-24 16:09:41.822: I/DEBUG(19804): 6291aaec 00000004
07-24 16:09:41.822: I/DEBUG(19804): 6291aaf0 6202af78
07-24 16:09:41.822: I/DEBUG(19804): 6291aaf4 bb8d8cdb
07-24 16:09:41.822: I/DEBUG(19804): 6291aaf8 00000000
07-24 16:09:41.822: I/DEBUG(19804): 6291aafc 00000013
07-24 16:09:41.822: I/DEBUG(19804): 6291ab00 42c86ec8 /dev/ashmem/dalvik- heap (deleted)
07-24 16:09:41.822: I/DEBUG(19804): 6291ab04 41761d75 /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): 6291ab08 417a0151 /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): 6291ab0c 417a0178 /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): #00 6291ab10 417a876c /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): 6291ab14 00000000
07-24 16:09:41.822: I/DEBUG(19804): 6291ab18 42817008 /dev/ashmem/dalvik- heap (deleted)
07-24 16:09:41.822: I/DEBUG(19804): 6291ab1c 41763985 /system/lib/libdvm.so (mspace_malloc+4176)
07-24 16:09:41.822: I/DEBUG(19804): #01 6291ab20 00000000
07-24 16:09:41.822: I/DEBUG(19804): 6291ab24 00000094
07-24 16:09:41.822: I/DEBUG(19804): 6291ab28 00000094
07-24 16:09:41.822: I/DEBUG(19804): 6291ab2c 42817008 /dev/ashmem/dalvik- heap (deleted)
07-24 16:09:41.822: I/DEBUG(19804): 6291ab30 00000001
07-24 16:09:41.822: I/DEBUG(19804): 6291ab34 00000094
07-24 16:09:41.822: I/DEBUG(19804): 6291ab38 417b3d50 /system/lib/libdvm.so
07-24 16:09:41.822: I/DEBUG(19804): 6291ab3c 6202ae68
07-24 16:09:41.822: I/DEBUG(19804): 6291ab40 00000000
07-24 16:09:41.822: I/DEBUG(19804): 6291ab44 41764311 /system/lib/libdvm.so (mspace_calloc+48)
07-24 16:09:41.822: I/DEBUG(19804): #02 6291ab48 ffffffff
07-24 16:09:41.822: I/DEBUG(19804): 6291ab4c 416ecc88
07-24 16:09:41.822: I/DEBUG(19804): 6291ab50 00000094
07-24 16:09:41.822: I/DEBUG(19804): 6291ab54 41765379 /system/lib/libdvm.so (dvmHeapSourceAlloc(unsigned int)+132)
07-24 16:09:41.842: I/DEBUG(19804): memory map around fault addr deadbaad:
07-24 16:09:41.842: I/DEBUG(19804): beebd000-beede000 rw- [stack]
07-24 16:09:41.842: I/DEBUG(19804): (no map for address)
07-24 16:09:41.842: I/DEBUG(19804): ffff0000-ffff1000 r-x [vectors]