1

我试图通过尝试加载我使用 System.loadLibrary() 交叉编译的库来调试崩溃。我已经能够在运行 4.0.4 (ICS) 的任何设备上成功加载此库,但它在运行 4.1.1 (JB) 的所有设备上崩溃。在 libc 中运行到 pthread_create() 时似乎崩溃了:

10-01 14:25:34.173: D/dalvikvm(8215): Trying to load lib /data/data/com.gnychis.awmon/lib/libtshark.so 0x410fb430
10-01 14:25:34.181: A/libc(8215): Fatal signal 11 (SIGSEGV) at 0x5dfaa01c (code=2), thread 8232 (AsyncTask #1)
// And here is the end of the stack....
I/DEBUG   (  246):     #10  pc 0001263c  /system/lib/libc.so (pthread_create+180)

这是显示整个堆栈跟踪所涉及的更长的崩溃日志,您将看到它在 libc 和 pthread_create 处结束:

D/dalvikvm(26364): Trying to load lib /data/data/com.gnychis.awmon/lib/libtshark.so 0x410a5ee0
F/libc    (26364): Fatal signal 11 (SIGSEGV) at 0x5dff301c (code=2), thread 27345 (AsyncTask #1)
D/AndroidRuntime(27404): Calling main entry com.android.commands.am.Am
I/DEBUG   (  246): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (  246): Build fingerprint: 'd2uc-user 4.0.4 IMM76D I747UCALEM release-keys'
I/DEBUG   (  246): pid: 26364, tid: 27345, name: AsyncTask #1  >>> com.gnychis.awmon <<<
I/DEBUG   (  246): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 5dff301c
D/AndroidRuntime(27404): Shutting down VM
D/dalvikvm(27404): GC_CONCURRENT freed 99K, 88% free 498K/4096K, paused 1ms+1ms, total 7ms
I/AndroidRuntime(27404): NOTE: attach of thread 'Binder_3' failed
I/DEBUG   (  246):     r0 80000000  r1 02b1a000  r2 00000005  r3 5dff3000
I/DEBUG   (  246):     r4 40102894  r5 4010aaec  r6 00000000  r7 00000029
I/DEBUG   (  246):     r8 00000029  r9 5dff3000  sl 60871000  fp 02b1a000
I/DEBUG   (  246):     ip 00000005  sp 5d95ace0  lr 6004d1bb  pc 400ec6e0  cpsr 600d0030
I/DEBUG   (  246):     d0  61642f617461642f  d1  672e6d6f632f6174
I/DEBUG   (  246):     d2  612e73696863796e  d3  62696c2f6e6f6d77
I/DEBUG   (  246):     d4  00000000000e16f0  d5  000000000000695f
I/DEBUG   (  246):     d6  000000000002a715  d7  0000012f00000000
I/DEBUG   (  246):     d8  0000000000000000  d9  0000000000000000
I/DEBUG   (  246):     d10 0000000000000000  d11 0000000000000000
I/DEBUG   (  246):     d12 0000000000000000  d13 0000000000000000
I/DEBUG   (  246):     d14 0000000000000000  d15 0000000000000000
I/DEBUG   (  246):     d16 7420676e69797254  d17 6c2064616f6c206f
I/DEBUG   (  246):     d18 0063002f00610074  d19 0067002e006d006f
I/DEBUG   (  246):     d20 006800630079006e  d21 0061002e00730069
I/DEBUG   (  246):     d22 006e006f006d0077  d23 00620069006c002f
I/DEBUG   (  246):     d24 000000000000e16f  d25 0000000000000000
I/DEBUG   (  246):     d26 000000000000695f  d27 0000000000000000
I/DEBUG   (  246):     d28 000000000000695f  d29 0000000000000000
I/DEBUG   (  246):     d30 0000000500000005  d31 0000000500000005
I/DEBUG   (  246):     scr 60000012
I/DEBUG   (  246): 
I/DEBUG   (  246): backtrace:
I/DEBUG   (  246):     #00  pc 000046e0  /system/bin/linker
I/DEBUG   (  246):     #01  pc 00005b6f  /system/bin/linker
I/DEBUG   (  246):     #02  pc 0004f73b  /system/lib/libdvm.so (dvmLoadNativeCode(char const*, Object*, char**)+186)
I/DEBUG   (  246):     #03  pc 000662bd  /system/lib/libdvm.so
I/DEBUG   (  246):     #04  pc 000274e0  /system/lib/libdvm.so
I/DEBUG   (  246):     #05  pc 0002be08  /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+180)
I/DEBUG   (  246):     #06  pc 0005f9f5  /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+272)
I/DEBUG   (  246):     #07  pc 0005fa1f  /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+20)
I/DEBUG   (  246):     #08  pc 000545ab  /system/lib/libdvm.so
I/DEBUG   (  246):     #09  pc 00012ee4  /system/lib/libc.so (__thread_entry+48)
I/DEBUG   (  246):     #10  pc 0001263c  /system/lib/libc.so (pthread_create+180)

有趣的是,如果我在库上使用 arm-eabi-objdump,地址 1263c 似乎是它尝试执行 pthread_clone 时:

$ arm-eabi-objdump -S /tmp/libc.so | grep 1263c
1263c:       ebffed71        bl      dc08 <__pthread_clone>

有没有人知道为什么这不适用于 4.1.1?另外,为什么我的崩溃日志顶部的“构建指纹”显示:

Build fingerprint: 'd2uc-user 4.0.4'

这可能是为什么它不在 4.1.1 上运行的根本问题吗?我正在使用最新的 NDK (r8b),以 android-14 作为平台,带有 arm-eabi-4.4.3 工具链。

非常感谢任何帮助/指导。

编辑: 现在我的大部分崩溃似乎都发生在......我在这里丢失了一个符号还是什么?

D/dalvikvm(11194): Trying to load lib /data/data/com.gnychis.awmon/lib/libtshark.so 0x4130fac8
F/libc    (11194): Fatal signal 11 (SIGSEGV) at 0x5df6b01c (code=2), thread 11230 (AsyncTask #1)
I/DEBUG   ( 7539): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   ( 7539): Build fingerprint: 'd2uc-user 4.0.4 IMM76D I747UCALEM release-keys'
I/DEBUG   ( 7539): pid: 11194, tid: 11230, name: AsyncTask #1  >>> com.gnychis.awmon <<<
I/DEBUG   ( 7539): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 5df6b01c
I/DEBUG   ( 7539):     r0 80000000  r1 02b1b000  r2 00000005  r3 5df6b000
I/DEBUG   ( 7539):     r4 400e8894  r5 400f0aec  r6 00000000  r7 0000002a
I/DEBUG   ( 7539):     r8 0000002a  r9 5df6b000  sl 607ea000  fp 02b1b000
I/DEBUG   ( 7539):     ip 00000005  sp 5d8d2cd0  lr 5ffc5fff  pc 400d26e0  cpsr 600d0030
I/DEBUG   ( 7539):     d0  61642f617461642f  d1  672e6d6f632f6174
I/DEBUG   ( 7539):     d2  612e73696863796e  d3  62696c2f6e6f6d77
I/DEBUG   ( 7539):     d4  00000000000e16f0  d5  000000000000695f
I/DEBUG   ( 7539):     d6  000000000005a6e8  d7  0000012f00000000
I/DEBUG   ( 7539):     d8  0000000000000000  d9  0000000000000000
I/DEBUG   ( 7539):     d10 0000000000000000  d11 0000000000000000
I/DEBUG   ( 7539):     d12 0000000000000000  d13 0000000000000000
I/DEBUG   ( 7539):     d14 0000000000000000  d15 0000000000000000
I/DEBUG   ( 7539):     d16 7420676e69797254  d17 6c2064616f6c206f
I/DEBUG   ( 7539):     d18 00000000006f7478  d19 0067002e006d006f
I/DEBUG   ( 7539):     d20 006800630079006e  d21 0061002e00730069
I/DEBUG   ( 7539):     d22 006e006f006d0077  d23 00620069006c002f
I/DEBUG   ( 7539):     d24 000000000000e16f  d25 0000000000000000
I/DEBUG   ( 7539):     d26 000000000000695f  d27 0000000000000000
I/DEBUG   ( 7539):     d28 000000000000695f  d29 0000000000000000
I/DEBUG   ( 7539):     d30 0000000d0000000d  d31 0000000d0000000d
I/DEBUG   ( 7539):     scr 60000012
I/DEBUG   ( 7539): 
I/DEBUG   ( 7539): backtrace:
I/DEBUG   ( 7539):     #00  pc 000046e0  /system/bin/linker
I/DEBUG   ( 7539):     #01  pc 00005b6f  /system/bin/linker
I/DEBUG   ( 7539):     #02  pc 0004f73b  /system/lib/libdvm.so (dvmLoadNativeCode(char const*, Object*, char**)+186)
I/DEBUG   ( 7539):     #03  pc 000662bd  /system/lib/libdvm.so
I/DEBUG   ( 7539):     #04  pc 00027524  /system/lib/libdvm.so
I/DEBUG   ( 7539):     #05  pc 000fedd8  <unknown>
4

2 回答 2

0

请参阅Android JNI:调用 System.loadLibrary() 导致 SEGV。你的原生库有 JNI_OnLoad() 吗?如果此函数调用 JNI 函数,请尝试从主 (UI) 线程调用它。

于 2012-10-02T22:30:01.587 回答
0

原来我的工具链太旧了。我在 AOSP 项目中升级到了较新的 arm-eabi 工具链,现在库链接就好了!

于 2012-10-05T18:04:51.117 回答