Frage

Ich bin mit meiner App festgefahren, da ich nicht debuggen kann, da es sich um ein Multithreads handelt und mit dem Fehler Sigsegv abstürzt. Ich erhalte viele Informationen von LogCat, wodurch mir Adressen in meiner nativen Bibliothek angegeben werden. Es wäre hilfreich, wenn ich diese Adressen in meinen Code umwandeln könnte.

Hat jemand eine Idee, wie man adDR2Line verwendet, das mit Android-NDK versehen ist?

War es hilfreich?

Lösung

Nehmen wir an, dass LogCat Ihnen das folgende Crash -Protokoll anzeigen (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; Dies ist Ihr Callstack. 'PC' ist der Programmzähler, und der PC für Stack Frame #00 gibt Ihnen die Adresse, an der der Absturz stattgefunden hat. Dies ist die Nummer, die an adr2Line übergeben werden soll.

Ich benutze NDK R5, daher befindet sich die ausführbare Datei, die ich verwende $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin; Stellen Sie sicher, dass dies in Ihrem liegt $PATH. Der zu bedienende Befehl sieht aus wie

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

Das gibt Ihnen den Ort des Absturzes.

Notiz:

  • Das -C -Flag ist zum Demangle C ++ Code
  • Verwenden Sie die .so-Datei unter OBJ/Local/Armabi, da dies die nicht gestreifte Version ist

Bei Verwendung von NDK R5 mit einem 2,3 AVD ist es tatsächlich möglich, Multithread -Code zu debuggen.

Andere Tipps

Es gibt eine einfachere Möglichkeit, dies jetzt zu tun (NDK-R7). Schauen Sie sich den Befehl ndk-stack an. Die Dokumente finden Sie in YOHR_ANDROID_NDK_PATH/DOCS/NDK-STACK.HTML

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top