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):
I/DEBUG ( 31):
I/DEBUG ( 31):
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.
.so
Dateilibs
, die natürlich entfernt wurde. Der inobj
Arbeit.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
quelle