2016-07-12 1 views
0

Я вижу некоторые сбои в моей консоли разработчика из сторонней разделяемой библиотеки, которую я использую.Как найти инструкцию от сторонней общей библиотеки, вызвавшей сбои в работе андроида?

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
Build fingerprint: 'Sony/D2406/D2406:4.4.4/18.3.1.C.1.17/7nt3bg:user/release-keys' 
Revision: '0' 
pid: 6736, tid: 6794, name: Main Thread >>> com.mytest.app <<< 
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000012 
r0 00000000 r1 64c3b3f4 r2 00000001 r3 00000000 
r4 ffffb194 r5 64bb9660 r6 64c3b3f4 r7 64c3d848 
r8 ffffbb78 r9 ffffb214 sl 64d92bcc fp 64d93bd4 
ip 64bbb3ac sp 64d92bc0 lr 641c029f pc 641c02f8 cpsr 40070030 
d0 0000000700000007 d1 4000000040000000 
d2 000000003f47ae40 d3 0000000000000000 
d4 fe8000003f000001 d5 000122e800000000 
d6 0000000000000000 d7 00000000000022ec 
d8 0000000000000000 d9 0000000000000000 
d10 0000000000000000 d11 0000000000000000 
d12 0000000000000000 d13 0000000000000000 
d14 0000000000000000 d15 0000000000000000 
d16 3f14f8b588e30000 d17 c01dc3a2163fdd66 
d18 3f8000003f800000 d19 0000000100000000 
d20 0000000700000001 d21 000000004036ee50 
d22 0000000064d94b04 d23 403294d140368de8 
d24 3f80000000000000 d25 3f8000003f800000 
d26 c0000000c0000000 d27 0000000000000000 
d28 0000000000000000 d29 3f80000000000000 
d30 0000000000000000 d31 0000000000000000 
scr 6000009f 

backtrace: 
#00 pc 001452f8 /data/app-lib/com.mytest.app-1/libcode.so 
#01 pc 0014529b /data/app-lib/com.mytest.app-1/libcode.so 

code around pc: 
641c02d8 f8da6048 b11005cc 68496801 f8df4788 
641c02e8 22015a9c 4a98f8df 447d2300 68005960 
641c02f8 1012f9b0 50e4f20d e5fcf544 1005f859 
641c0308 68896848 d00c4288 d0192800 51e4f20d 
641c0318 e61af544 0a6cf8df f8594478 68400000 
641c0328 f8dfe00f 44780a64 0000f859 51e4f20d 
641c0338 e110f54e 4604e00c 05e0f8da ba38f00b 
641c0348 f8df2000 30141a48 f8594479 60481001 
641c0358 05e0f8da 6801b110 47886849 5a30f8df 
641c0368 23012201 5960447d f9b06800 f50d1012 
641c0378 f54460bf f859e5c0 68481005 42886889 
641c0388 2800d00c f50dd019 f54461bf f8dfe5de 
641c0398 44780a04 0000f859 e00f6840 09f8f8df 
641c03a8 f8594478 f50d0000 f54e61bf e00ce0d4 
641c03b8 f8da4604 f00b05f4 2000b9fb 19dcf8df 
641c03c8 44793014 1001f859 f8da6048 b11005f4 

code around lr: 
641c027c f50d7901 f54460ba f859e63c 68481005 
641c028c 42886889 2800d00c f50dd019 f54461ba 
641c029c f8dfe65a 44780ad8 0000f859 e00f6840 
641c02ac 0accf8df f8594478 f50d0000 f54e61ba 
641c02bc e00ce150 f8da4604 f00b05cc 2000ba77 
641c02cc 1ab0f8df 44793014 1001f859 f8da6048 
641c02dc b11005cc 68496801 f8df4788 22015a9c 
641c02ec 4a98f8df 447d2300 68005960 1012f9b0 
641c02fc 50e4f20d e5fcf544 1005f859 68896848 
641c030c d00c4288 d0192800 51e4f20d e61af544 
641c031c 0a6cf8df f8594478 68400000 f8dfe00f 
641c032c 44780a64 0000f859 51e4f20d e110f54e 
641c033c 4604e00c 05e0f8da ba38f00b f8df2000 
641c034c 30141a48 f8594479 60481001 05e0f8da 
641c035c 6801b110 47886849 5a30f8df 23012201 
641c036c 5960447d f9b06800 f50d1012 f54460bf 

The lib для arm-v7 abi. Можно ли узнать, какая команда вызвала сбой, когда я декомпилирую общую библиотеку или objdump с помощью (arm-linux-androideabi-objdump.exe), где я могу видеть экспортированные методы и инструкции. Как я могу связать адрес pc в дампе сбоя с инструкцией. У меня нет доступа к исходному коду только для этого файла.

ответ

0

Возможно ли это? Конечно, просто разобрать файл .so. Обычно может потребоваться некоторое время, чтобы выработать адрес загрузки во время загрузки по сравнению с адресами по умолчанию в ELF, но здесь, где дамп говорит 641c02f8, у вас есть обратная линия, которая помогает вам «pc 001452f8», подразумевая нагрузку смещение 6407b000 и сохранение беспокойства.

Несоблюдение этого, конечно же, у вас также есть свалка оскорбительного кода! Это не займет много усилий, чтобы хлюпать, что обратно в сырой двоичный файл и заставить его через дизассемблер, таким образом:

Disassembly of section .data: 

00000000 <.data>: 
     ... 
2d8: 6048   str  r0, [r1, #4] 
2da: f8da 05cc  ldr.w r0, [sl, #1484] ; 0x5cc 
2de: b110   cbz  r0, 0x2e6 
2e0: 6801   ldr  r1, [r0, #0] 
2e2: 6849   ldr  r1, [r1, #4] 
2e4: 4788   blx  r1 
2e6: f8df 5a9c  ldr.w r5, [pc, #2716] ; 0xd84 
2ea: 2201   movs r2, #1 
2ec: f8df 4a98  ldr.w r4, [pc, #2712] ; 0xd88 
2f0: 2300   movs r3, #0 
2f2: 447d   add  r5, pc 
2f4: 5960   ldr  r0, [r4, r5] 
2f6: 6800   ldr  r0, [r0, #0] 
2f8: f9b0 1012  ldrsh.w r1, [r0, #18] 

(я усечен адрес, чтобы избежать нелепого бинарные 1,6 Гбайта)

По внешнему виду, он преследует пару указателей, чтобы найти некоторую структуру, из которой можно загрузить подписанное 16-битное значение, но указатель структуры, который он нашел (r0), явно NULL.

+0

Можете ли вы объяснить мне, как именно вы получили код в своем посте? а также то, что адрес рядом с инструкцией по сборке представляет [img] (https://i.gyazo.com/ac344e6e303a6c1f26a81c7697755a6b.png)? они увеличиваются на 2, поэтому я предполагаю, что это какой-то порядок обучения, не должен ли ПК (001452f8) быть одним из этих чисел? – user2341944

+0

Я понимаю это больше. «code around pc» в основном показывает инструкции. Я смог найти эту цепочку обучения, и теперь я знаю, где произошла ошибка. Адрес компьютера 001252f8 «backtrace» - это только 641c02f8 - (адрес загрузки во время выполнения), которые являются этими инструкциями (1012f9b0 50e4f20d ...), но что в случае, когда у меня нет части «code around pc» только «backtrace», как бы я идти о нахождении линии в dissembler? – user2341944

+0

Я предполагаю, что адрес, указанный в backtrace, является исходным объектным файлом VMA, поскольку он явно не является фактическим адресом времени выполнения (это означает, что отладчик или что-то другое, генерирующее backtrace, знает, где каждый раздел был перемещен в в адресном пространстве процесса - вы сами это видите, проверяя/proc//maps во время его работы). Поэтому он должен быть таким же простым, как разборка .so и поиск этого адреса. – Notlikethat

Смежные вопросы