我有Android应用程序,大量使用ffmpeg移植到android。它的工作原理相当不错的大多数设备,但在崩溃的Galaxy Tab 10:本机代码崩溃(android)?
06-20 13:16:36.136 505-561/? D/CrashAnrDetector﹕ Build: samsung/espresso10rfxx/espresso10rf:4.2.2/JDQ39/P5100XXDMJ2:user/release-keys
Hardware: piranha
Revision: 9
Bootloader: unknown
Radio: unknown
Kernel: Linux version 3.0.31-1919150 ([email protected]) (gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202)) #1 SMP PREEMPT Fri Oct 18 15:31:19 KST 2013
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'samsung/espresso10rfxx/espresso10rf:4.2.2/JDQ39/P5100XXDMJ2:user/release-keys'
Revision: '9'
pid: 22003, tid: 22003, name: om.company.project >>> com.company.project <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
r0 00000027 r1 deadbaad r2 401b5258 r3 00000000
r4 00000000 r5 bebb936c r6 00000004 r7 40d63400
r8 00000000 r9 409d81b0 sl 4000c0d8 fp 00000001
ip 62675144 sp bebb9368 lr 4018854d pc 40184be2 cpsr 60000030
d0 65706d666662696c d1 732e6e6f656e2d67
d2 732e30323763692e d3 2f322d6c6f6f6863
d4 ff00edc0e4c09680 d5 000c000c000c000c
d6 03fc0378033000e0 d7 3f8000003f800000
d8 41c0000000000000 d9 000000a13f000000
d10 0000000000000000 d11 0000000000000000
d12 0000000000000000 d13 0000000000000000
d14 0000000000000000 d15 0000000000000000
d16 00ffffffffffffff d17 004c481a004aca6e
d18 004f4372004dc5c6 d19 00523eca0050c11e
d20 00f5403e00ef803c d21 0101404100fb403f
d22 0000004400000042 d23 0000004700000045
d24 010d404401074042 d25 0119404701134045
d26 0000004300000041 d27 0000004600000044
d28 00f5400000ef8000 d29 0101400000fb4000
d30 0000000100000001 d31 0000000100000001
scr 60000010
backtrace:
#00 pc 0001abe2 /system/lib/libc.so
#01 pc 00018208 /system/lib/libc.so (abort+4)
#02 pc 0066b8e0 /data/app-lib/com.company.project-2/libffmpeg-neon.so
#03 pc 000032b3 /system/bin/linker
#04 pc 0000510b /system/bin/linker
#05 pc 0004f973 /system/lib/libdvm.so (dvmLoadNativeCode(char const*, Object*, char**)+186)
#06 pc 0006681d /system/lib/libdvm.so
#07 pc 000276e0 /system/lib/libdvm.so
#08 pc 0002b5c4 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
#09 pc 0005fc79 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+272)
#10 pc 0005fca3 /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+20)
#11 pc 0006ad49 /system/lib/libdvm.so (dvmInitClass+1036)
#12 pc 000225dc /system/lib/libdvm.so (dvmAsmSisterStart+412)
#13 pc 0002b5c4 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
#14 pc 0005ff4f /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+374)
#15 pc 00067879 /system/lib/libdvm.so
#16 pc 000276e0 /system/lib/libdvm.so
#17 pc 0002b5c4 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
#18 pc 0005fc79 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+272)
#19 pc 00049a43 /system/lib/libdvm.so
#20 pc 00047f43 /system/lib/libandroid_runtime.so
#21 pc 000492df /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+390)
#22 pc 00000db7 /system/bin/app_process
#23 pc 0001287f /system/lib/libc.so (__libc_init+38)
#24 pc 00000ae8 /system/bin/app_process
stack:
bebb9328 f930001d
bebb932c 5f7a1cc8
bebb9330 4015bcf8 /system/bin/linker
bebb9334 4015bf40 /system/bin/linker
bebb9338 4015c4f4
bebb933c 4015b0ac /system/bin/linker
bebb9340 401b2254 /system/lib/libc.so
bebb9344 401b21b4 /system/lib/libc.so
bebb9348 00000000
bebb934c 4018854d /system/lib/libc.so (_fwalk+32)
bebb9350 00000001
bebb9354 bebb936c [stack]
bebb9358 00000004
bebb935c 40d63400 [heap]
bebb9360 df0027ad
bebb
由于没有应用符号在输出(无我的JNI代码的方法)如何我明白了什么问题?它是否缺少.so lib应该在加载libffmpeg.so之前加载?
好吧,这可以帮助。由于在堆栈跟踪中没有我的方法,我怎么理解我应该检查什么?根据我的经验,信号11(SIGSEGV)意味着我尝试访问空指针。 – 4ntoine
您可以在/data/app-lib/com.company.project-2/libffmpeg-neon.so,0066b8e0处获取代码地址,然后在编译器吐出的符号表中查找它以将其映射到一个函数。有时候这有帮助。否则,您需要检查所有到库中的Java对象,以确保它们不被引用计数递增。如果失败了,并且你有多线程(特别是C中的多线程),那么它可能存在。如果可以避免的话,确保没有Java对象跨越C中的线程边界,如果他们这样做,请小心引用计数。 –
当你不知道出发点时,确实很难解决这个问题。我该如何做“,并在编译器吐出的符号表中查找它以将其映射到函数中。”请一步一步来。我无法调试代码,只记录 – 4ntoine