В моем приложении 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
Кажется, мне не хватает фактического адреса, которое мое приложение было загружено в память. если бы я знал, что вычту адрес загрузки из регистра ПК (счетчика программ), чтобы точно определить местоположение кода сбоя.
Существует ли интуитивно понятный метод для ручного сопоставления абсолютного адреса сбоя, найденного в регистре ПК, с записью в файле карты компоновщика?
Задача ещё не решена.