我的Java应用程序有一个JNI层,用于与本机C ++库进行通信。当应用程序空闲大约三(3)分钟时,应用程序崩溃,LogCat显示以下堆栈跟踪:
07-13 13:21:35.876: A/libc(9889): Fatal signal 11 (SIGSEGV) at 0x606b0ba4 (code=1), thread 9889 (nc.myapp)
07-13 13:21:35.980: I/DEBUG(4710): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
07-13 13:21:35.980: I/DEBUG(4710): Build fingerprint: 'motorola/ghost_retail/ghost:4.4.3/KXA21.12-L1.21/23:user/release-keys'
07-13 13:21:35.981: I/DEBUG(4710): Revision: 'p300'
07-13 13:21:35.983: I/DEBUG(4710): pid: 9889, tid: 9889, name: nc.myapp >>> com.company.myapp <<<
07-13 13:21:35.984: I/DEBUG(4710): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 606b0ba4
07-13 13:21:36.093: I/DEBUG(4710): r0 00000001 r1 0018c020 r2 60b8ec1c r3 00001204
07-13 13:21:36.093: I/DEBUG(4710): r4 00000001 r5 60485008 r6 60b70ce8 r7 00000000
07-13 13:21:36.093: I/DEBUG(4710): r8 606b0cd6 r9 00000001 sl 60485010 fp 00000000
07-13 13:21:36.094: I/DEBUG(4710): ip 00000000 sp 606b0b98 lr 6099ed68 pc 6099ed74 cpsr 200d0010
07-13 13:21:36.094: I/DEBUG(4710): d0 0000000000000001 d1 0000001100000012
07-13 13:21:36.094: I/DEBUG(4710): d2 0000000000000000 d3 000000040000005c
07-13 13:21:36.094: I/DEBUG(4710): d4 0041002e00770065 d5 0061005300730062
07-13 13:21:36.094: I/DEBUG(4710): d6 0053006400650076 d7 0065007400610074
07-13 13:21:36.094: I/DEBUG(4710): d8 440b00000000022c d9 0000000042fe0000
07-13 13:21:36.095: I/DEBUG(4710): d10 0000000000000000 d11 0000000000000000
07-13 13:21:36.095: I/DEBUG(4710): d12 0000000000000000 d13 0000000000000000
07-13 13:21:36.095: I/DEBUG(4710): d14 0000000000000000 d15 0000000000000000
07-13 13:21:36.095: I/DEBUG(4710): d16 0074006900760069 d17 006e0061004d0079
07-13 13:21:36.095: I/DEBUG(4710): d18 0061006c006f0072 d19 007800690070002e
07-13 13:21:36.096: I/DEBUG(4710): d20 00690070006c0065 d21 0049002e00650070
07-13 13:21:36.096: I/DEBUG(4710): d22 0065007800690050 d23 007000690050006c
07-13 13:21:36.096: I/DEBUG(4710): d24 000e000d000c000b d25 0010000f000d000e
07-13 13:21:36.096: I/DEBUG(4710): d26 0000000000000000 d27 0000000000000000
07-13 13:21:36.097: I/DEBUG(4710): d28 0148014701450146 d29 0149014a014a0149
07-13 13:21:36.097: I/DEBUG(4710): d30 0010001000100010 d31 0000000000000000
07-13 13:21:36.097: I/DEBUG(4710): scr 20000013
07-13 13:21:36.098: I/DEBUG(4710): backtrace:
07-13 13:21:36.098: I/DEBUG(4710): #00 pc 000b1d74 /data/app-lib/com.company.myapp-1/libwrappersjni.so
07-13 13:21:36.098: I/DEBUG(4710): #01 pc 000b1d64 /data/app-lib/com.v-1/libwrappersjni.so
崩溃似乎表明崩溃发生在我的共享库libwrappersjni.so中。我有一个链接器映射文件,通过使用-XLinker和-Map gcc链接器选项进行创建。地图文件列出具有相对偏移的符号,例如:
.ARM.extab.text.Java_com_hyperlync_myapp_WrappersApi_logout
0x00224e1c 0xc ./obj/local/armeabi/objs/wrappersjni/jni_Wrappers.o
.ARM.extab.text.Java_com_hyperlync_myapp_WrappersApi_signout
0x00224e28 0xc ./obj/local/armeabi/objs/wrappersjni/jni_Wrappers.o
.ARM.extab.text.Java_com_hyperlync_myapp_WrappersApi_uploadFileInt
0x00224e34 0x20 ./obj/local/armeabi/objs/wrappersjni/jni_Wrappers.o
我似乎缺少的是我的应用程序加载到内存中的实际地址。如果我知道我会从pc(程序计数器)寄存器中减去加载地址,以确定崩溃代码的位置。
是否有直观的方法将pc寄存器中的绝对崩溃地址手动映射到链接器映射文件中的条目?