Как получить имена стека трассировки C ++ функций в Android - PullRequest
0 голосов
/ 29 февраля 2012

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

I/DEBUG   (   31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (   31): Build fingerprint: 'generic/sdk/generic:2.3/GRH55/79397:eng/test-keys'
I/DEBUG   (   31): pid: 378, tid: 386  >>> com.example.gltest <<<
I/DEBUG   (   31): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG   (   31):  r0 001dbdc0  r1 00000001  r2 00000000  r3 00000000
I/DEBUG   (   31):  r4 00000000  r5 40a40000  r6 4051a480  r7 42ddbee8
I/DEBUG   (   31):  r8 43661b24  r9 42ddbed0  10 42ddbebc  fp 41e462d8
I/DEBUG   (   31):  ip 00000001  sp 436619d0  lr 83a12f5d  pc 8383deb4  cpsr 20000010
I/DEBUG   (   31):          #00  pc 0003deb4  /data/data/com.example.gltest/lib/libnativemaprender.so
I/DEBUG   (   31):          #01  pc 00039b76  /data/data/com.example.gltest/lib/libnativemaprender.so
I/DEBUG   (   31):          #02  pc 00017d34  /system/lib/libdvm.so

Как вы можете видеть в последних 3 строках, библиотека вашего приложения находится там: ibnativemaprender.so

и только если ваша библиотека появится там, приложение addr2line будет работать

но в моем следе у меня есть это:

I/DEBUG   (16251):          #00  pc 000161c0  /system/lib/libc.so 
I/DEBUG   (16251):          #01  lr afd196f1  /system/lib/libc.so

и моя библиотека там не будет показана позже:

/DEBUG   (16251): stack: 
I/DEBUG   (16251):     46f0c818  afd426a4     
I/DEBUG   (16251):     46f0c81c  000b7290     
I/DEBUG   (16251):     46f0c820  00000afa    
I/DEBUG   (16251):     46f0c824  afd187b9  /system/lib/libc.so    
I/DEBUG   (16251):     46f0c828  afd42644     
I/DEBUG   (16251):     46f0c82c  afd467c4     
I/DEBUG   (16251):     46f0c830  00000000     
I/DEBUG   (16251):     46f0c834  afd196f1  /system/lib/libc.so   
I/DEBUG   (16251):     46f0c838  00000001     
I/DEBUG   (16251):     46f0c83c  46f0c86c     
I/DEBUG   (16251):     46f0c840  81b6a4a0  /data/data/com.android.ANMP/lib/mylib.so

так есть ли инструмент, который может мне помочь? или другой способ использовать addr2line?

Ответы [ 3 ]

1 голос
/ 29 февраля 2012

Нет, не совсем. Для этого вам нужно выполнить поиск вручную.

Вручную, есть три варианта:

  • Добавьте отладочные отпечатки, чтобы узнать, где и когда это произойдет

  • Используйте IDA pro (это очень дорогой инструмент), загрузите в него свою библиотеку и найдите адрес 81b6a4a0, попробуйте выяснить, какая это функция. Если вы компилируете символы отладки, это должно быть достаточно просто.

  • Найдите базовый адрес вашей библиотеки, используйте objdump (из цепочки инструментов NDK), чтобы найти, что находится в адресе 81b6a4a0 (после удаления из него базового адреса).

В обоих случаях, если вы не нашли ничего полезного, извлеките libc.so и libdvm.so из устройства, используя adb и попробуйте чтобы найти функции, которые появляются в трассировке стека, затем проверьте, где вы вызываете эти функции в своем коде.

0 голосов
/ 29 февраля 2012

Вы можете использовать GDB для получения трассировки стека.Если у вас есть рутированный телефон или вы используете эмулятор, вы можете включить дамп ядра.Затем вы можете использовать GDB для проверки дампов ядра.

См. Этот вопрос для настройки GDB в Eclipse:

android, как использовать ndk gdb с чистым собственным исполняемым файлом

0 голосов
/ 29 февраля 2012

взгляните на это . Я еще не нашел время, чтобы попробовать, так что скажите, сработало ли у вас

...