ndk-stack

Mit dem ndk-stack-Tool können Sie Stacktraces aus adb logcat oder einem Tombstone in /data/tombstones/ symbolisieren. Dabei werden alle Adressen in einer gemeinsam genutzten Bibliothek durch die entsprechende <source-file>:<line-number> aus Ihrem Quellcode ersetzt, was die Fehlerbehebung erleichtert.

Die Übersetzung sieht beispielsweise so aus:

I/DEBUG   (   31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (   31): Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'
I/DEBUG   (   31): pid: 351, tid: 351  >>> /data/local/ndk-tests/crasher <<<
I/DEBUG   (   31): signal 11 (SIGSEGV), fault addr 0d9f00d8
I/DEBUG   (   31):  r0 0000af88  r1 0000a008  r2 baadf00d  r3 0d9f00d8
I/DEBUG   (   31):  r4 00000004  r5 0000a008  r6 0000af88  r7 00013c44
I/DEBUG   (   31):  r8 00000000  r9 00000000  10 00000000  fp 00000000
I/DEBUG   (   31):  ip 0000959c  sp be956cc8  lr 00008403  pc 0000841e  cpsr 60000030
I/DEBUG   (   31):          #00  pc 0000841e  /data/local/ndk-tests/crasher
I/DEBUG   (   31):          #01  pc 000083fe  /data/local/ndk-tests/crasher
I/DEBUG   (   31):          #02  pc 000083f6  /data/local/ndk-tests/crasher
I/DEBUG   (   31):          #03  pc 000191ac  /system/lib/libc.so
I/DEBUG   (   31):          #04  pc 000083ea  /data/local/ndk-tests/crasher
I/DEBUG   (   31):          #05  pc 00008458  /data/local/ndk-tests/crasher
I/DEBUG   (   31):          #06  pc 0000d362  /system/lib/libc.so
I/DEBUG   (   31):

in die lesbareren:

********** Crash dump: **********
Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'
pid: 351, tid: 351  >>> /data/local/ndk-tests/crasher <<<
signal 11 (SIGSEGV), fault addr 0d9f00d8
Stack frame #00  pc 0000841e  /data/local/ndk-tests/crasher : Routine zoo in /tmp/foo/crasher/jni/zoo.c:13
Stack frame #01  pc 000083fe  /data/local/ndk-tests/crasher : Routine bar in /tmp/foo/crasher/jni/bar.c:5
Stack frame #02  pc 000083f6  /data/local/ndk-tests/crasher : Routine my_comparison in /tmp/foo/crasher/jni/foo.c:9
Stack frame #03  pc 000191ac  /system/lib/libc.so
Stack frame #04  pc 000083ea  /data/local/ndk-tests/crasher : Routine foo in /tmp/foo/crasher/jni/foo.c:14
Stack frame #05  pc 00008458  /data/local/ndk-tests/crasher : Routine main in /tmp/foo/crasher/jni/main.c:19
Stack frame #06  pc 0000d362  /system/lib/libc.so

Nutzung

Zur Verwendung von ndk-stack benötigen Sie zuerst ein Verzeichnis, das nicht entfernte Versionen der gemeinsam genutzten Bibliotheken Ihrer App enthält. Wenn Sie ndk-build verwenden, befinden sich diese nicht entfernten geteilten Bibliotheken in $PROJECT_PATH/obj/local/<abi>, wobei <abi> das ABI Ihres Geräts ist.

Es gibt zwei Möglichkeiten, das Tool zu verwenden. Sie können den Logcat-Text als direkte Eingabe für das Programm eingeben. Beispiele:

adb logcat | $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi-v7a

Sie können den Logcat auch mit der Option -dump als Eingabedatei angeben. Beispiele:

adb logcat > /tmp/foo.txt
$NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi-v7a -dump foo.txt

Zu Beginn des Parsens der Logcat-Ausgabe sucht das Tool nach einer ersten Zeile mit Sternchen. Beispiele:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

Hinweis : Vergessen Sie diese Zeile beim Kopieren und Einfügen von Traces nicht, da ndk-stack sonst nicht richtig funktioniert.

Weitere Informationen

Google Play verwendet ndk-stack, um Stacktraces für native Apps in der Google Play Console zu symbolisieren. Informationen dazu, wie Sie dies für Ihre App in einer Produktionsumgebung aktivieren können, finden Sie in der Google Play Console unter Symboldatei zum Debuggen von nativem Code für Ihre App in die Google Play Console einfügen.