Как использовать addr2line в Android

Я застрял в своем приложении, так как не могу его отлаживать, так как оно многопоточное и вылетает с ошибкой SIGSEGV. Я получаю много информации от LogCat, который дает мне адреса в моей родной библиотеке. Было бы полезно, если бы я мог преобразовать эти адреса в свой код.

Кто-нибудь знает, как использовать addr2line, который поставляется с android-ndk?


person Anil Arrabole    schedule 15.03.2011    source источник


Ответы (2)


Предположим, что logcat показывает вам следующий журнал сбоев (это из одного из моих проектов):

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 строки; это ваш стек вызовов. 'pc' - это счетчик программы, а pc для кадра стека #00 дает вам адрес, по которому произошел сбой. Это номер для передачи в addr2line.

Я использую NDK r5, поэтому исполняемый файл, который я использую, находится по адресу $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin; убедитесь, что это в вашем $PATH. Используемая команда выглядит так

arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libXXX.so <address>

Или, для случая выше:

arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libnativemaprender.so 0003deb4

Что дает вам место крушения.

Примечание:

  • Флаг -C предназначен для упрощения кода C++.
  • Используйте файл .so в каталоге obj/local/armeabi, поскольку это неразрезанная версия.

Кроме того, при использовании NDK r5 с AVD версии 2.3 действительно возможна отладка многопоточного кода.

person svdree    schedule 15.03.2011
comment
Отлично, отлично. Спасибо за подробный ответ. Мне помогло на 100%. Спасибо и голосую за вас. - person Anil Arrabole; 15.03.2011
comment
Великолепно, благодаря вам это заработало - я изо всех сил пытался использовать файл .so в libs, который, конечно же, лишен. Тот что в obj работает. - person Nick; 18.07.2011
comment
avdree - я бы посоветовал вам показать фактический вывод add2line в этом очень хорошем ответе. - person Chris Markle; 28.07.2011
comment
Просто комментарий: утилиту addr2line можно использовать с любым (созданным GNU?) двоичным файлом, содержащим символы отладки. Работает и для настольных компьютеров, и для встроенных целей :) - person Morten Jensen; 26.06.2012
comment
Я не использую никакую родную библиотеку, кроме android-support-v4.. Так что возможно ли, что я могу использовать инструмент addr2line, чтобы получить номер строки сбоя в java-файле.. Я добавил подробности на [stackoverflow.com/q/30093772/1994950].. - person Kushal; 07.05.2015
comment
В журналах моего проекта указано #00 pc 0025e520 [куча] #01 pc 0002230f /system/lib/libbinder.so (android::Parcel::freeDataNoInit()+22) #02 pc 00022371 /system/lib/libbinder.so (android ::Parcel::~Parcel()+4) какой адрес я предполагаю предоставить для этих файлов системы/библиотек, таких как obj/local/armeabi/libnativemaprender.so - person Mahendra Chhimwal; 08.07.2016
comment
Я хотел обратить ваше внимание на второе примечание: Используйте файл .so в каталоге obj/local/‹abi›. Спасатель - person fillobotto; 03.03.2017
comment
arm-linux-androideabi-addr2line: 'obj/local/armeabi/libart.so': Почему нет такого файла? - person Angelina; 23.01.2019

Сейчас есть более простой способ сделать это (ndk-r7). Проверьте команду ndk-stack. Документы находятся в you_android_ndk_path/docs/NDK-STACK.html.

person Byron    schedule 07.02.2012
comment
Я попробовал первый ответ svdree и не смог получить хороший результат. Я попробовал этот, и он показал мне точную строку, на которой мой код терпел крах! Спасибо Байрон! - person alk3ovation; 22.06.2012
comment
Гораздо проще, чем раньше addr2line! - person Josh; 30.11.2012
comment
Я бы очень хотел ссылку/ресурс, если бы вы могли его разместить. - person Ehtesh Choudhury; 26.04.2013
comment
Это действительно хорошо! (ndk-stack.html)[developer.android.com/ndk/guides /ndk-стек.html] - person Aadishri; 09.07.2015
comment
каталог, содержащий символические версии общих библиотек вашего приложения. Как мы можем найти общую библиотеку для приложения xamarinforms для Android - person George Thomas; 28.02.2018