Как вручную сопоставить адрес Android SIGSEGV с файлом карты компоновщика?

В моем приложении 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

Кажется, мне не хватает фактического адреса, которое мое приложение было загружено в память. если бы я знал, что вычту адрес загрузки из регистра ПК (счетчика программ), чтобы точно определить местоположение кода сбоя.

Существует ли интуитивно понятный метод для ручного сопоставления абсолютного адреса сбоя, найденного в регистре ПК, с записью в файле карты компоновщика?

4

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]