Verwendung von addr2line in Android

78

Ich bin mit meiner App festgefahren, da ich nicht debuggen kann, da es sich um eine Multithread-App handelt, die mit dem Fehler SIGSEGV abstürzt. Ich erhalte viele Informationen von LogCat, die mir Adressen in meiner nativen Bibliothek geben. Es wäre hilfreich, wenn ich diese Adressen in meinen Code konvertieren könnte.

Hat jemand eine Idee, wie man addr2line benutzt, das mit android-ndk geliefert wird?

Anil Arrabole
quelle

Antworten:

169

Angenommen, logcat zeigt Ihnen das folgende Absturzprotokoll (dies stammt aus einem meiner Projekte):

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

Schauen Sie sich die letzten 3 Zeilen an. Das ist dein Callstack. 'pc' ist der Programmzähler, und der PC für Stapelrahmen # 00 gibt Ihnen die Adresse an, an der der Absturz aufgetreten ist. Dies ist die Nummer, die an addr2line übergeben werden soll.

Ich verwende NDK r5, daher befindet sich die von mir verwendete ausführbare Datei unter $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin; Stellen Sie sicher, dass das in Ihrem ist $PATH. Der zu verwendende Befehl sieht so aus

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

Oder für den obigen Fall:

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

Welches gibt Ihnen den Ort des Absturzes.

Hinweis:

  • Das Flag -C dient zum Entwirren von C ++ - Code
  • Verwenden Sie die .so-Datei unter obj / local / armeabi, da dies die nicht gestrippte Version ist

Wenn Sie NDK r5 mit einer 2.3 AVD verwenden, ist es tatsächlich möglich, Multithread-Code zu debuggen.

svdree
quelle
1
Großartig, ausgezeichnet. Danke für die ausführliche Antwort. Es hat bei mir zu 100% funktioniert. Vielen Dank und eine positive Abstimmung für Sie.
Anil Arrabole
1
Genial, dank dir hat das funktioniert - ich hatte Probleme mit der Verwendung der .soDatei libs, die natürlich entfernt wurde. Der in objArbeit.
Nick
avdree - Ich möchte Sie ermutigen, die tatsächliche Ausgabe von add2line in dieser ansonsten sehr guten Antwort anzuzeigen.
Chris Markle
Nur ein Kommentar, das Dienstprogramm addr2line kann mit jeder (von GNU erstellten?) Binärdatei verwendet werden, die Debug-Symbole enthält. Funktioniert auch für Desktop- und eingebettete Ziele :)
Morten Jensen
2
Ich wollte Ihre Aufmerksamkeit auf die zweite Anmerkung lenken : Verwenden Sie die .so-Datei unter obj / local / <abi> . Lebensretter
Fillobotto
48

Es gibt jetzt einen einfacheren Weg, dies zu tun (ndk-r7). Überprüfen Sie den Befehl ndk-stack. Die Dokumente befinden sich in you_android_ndk_path / docs / NDK-STACK.html

Byron
quelle
1
Ich habe die erste Antwort von svdree versucht und konnte keine gute Ausgabe bekommen. Ich habe es versucht und es zeigte mir die genaue Zeile, in der mein Code abstürzte! Danke Byron!
Alk3ovation
Viel einfacher als früher addr2line!
Josh
1
Ich hätte sehr gerne einen Link / eine Ressource, wenn Sie einen erstellen könnten.
Ehtesh Choudhury
Das ist sehr gut! (ndk-stack.html) [ developer.android.com/ndk/guides/ndk-stack.html]
Aadishri
2
"Verzeichnis mit symbolischen Versionen der gemeinsam genutzten Bibliotheken Ihrer App." Wie können wir die gemeinsame Bibliothek für eine Xamarin Forms Android-Anwendung finden
George Thomas