Як використовувати addr2line в Android


78

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

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

Відповіді:


169

Скажімо, 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 з 2.3 AVD насправді можливо налагодити багатопотоковий код.


1
Чудово, Відмінно. Дякую за детальну відповідь. У мене це спрацювало на 100%. Дякую і голосую за вас.
Anil Arrabole

1
Блискуче, це спрацювало завдяки тобі - я насилу використовував .soфайл у libs, який, звісно, ​​видалений. Той, що objпрацює.
Нік

avdree - Я закликаю вас показати фактичний результат add2line у ​​цій інакше дуже хорошій відповіді.
Chris Markle

Просто коментар, утиліта addr2line може використовуватися з будь-яким (створеним GNU?) Двійковим файлом, що містить символи налагодження. Працює і для робочого столу, і для вбудованих цілей :)
Мортен Йенсен,

2
Я хотів би звернути вашу увагу на другу примітку: Використовуйте файл .so у розділі obj / local / <abi> . Рятувальник
fillobotto

48

Зараз це простіше зробити (ndk-r7). Перевірте команду ndk-stack. Документи знаходяться у you_android_ndk_path / docs / NDK-STACK.html


1
Я спробував першу відповідь від svdree і не зміг отримати хороший результат. Я спробував цей, і він показав мені точний рядок, на який мій код падав! Дякую Байроне!
alk3ovation

Набагато простіше, ніж колись addr2line!
Джош

1
Я б дуже хотів посилання / ресурс, якщо б ви могли його розмістити.
Ехтеш Чоудхурі,

Це справді добре! (ndk-stack.html) [ developer.android.com/ndk/guides/ndk-stack.html]
Аадішрі,

2
"каталог, що містить символічні версії спільних бібліотек вашої програми." Як ми можемо знайти спільну бібліотеку для програми xamarin form android
Джордж Томас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.