So verwenden Sie adDR2Line in Android
-
24-10-2019 - |
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?
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