ndk-stack

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

Beispiel:

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 den besser lesbaren Text:

********** 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

Wenn Sie ndk-stack verwenden möchten, benötigen Sie zuerst ein Verzeichnis mit nicht entfernten Versionen der freigegebenen Bibliotheken Ihrer App. Wenn Sie ndk-build verwenden, finden Sie diese nicht entfernten freigegebenen Bibliotheken unter $PROJECT_PATH/obj/local/<abi>, wobei <abi> das ABI Ihres Geräts ist.

Bei einem Build des Android-Gradle-Plug-ins (AGP) befinden sich die Bibliotheken mit Debugging-Symbolen in <project-path>/build/intermediates/cxx/<build-type>/<hash>/obj/<abi>, wobei <project-path> das Verzeichnis des AGP-Projekts ist, das das Modul enthält, das Sie symbolisieren möchten (standardmäßig app). <build-type> ist der Name des Build-Typs „CMake“ oder „ndk-build“ (z. B. RelWithDebInfo, Release, Debug usw.). <hash> ist beliebig und <abi> ist das ABI Ihres Geräts.

Es gibt zwei Möglichkeiten, das Tool zu verwenden. Sie können den Logcat-Text als direkte Eingabe in das Programm einspeisen. Beispiel:

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

Sie können auch die Option -dump verwenden, um den Logcat als Eingabedatei anzugeben. Beispiel:

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

Beim Parsen der Logcat-Ausgabe sucht das Tool nach einer anfänglichen Zeile mit Sternen. Beispiel:

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

Hinweis: Achten Sie beim Kopieren und Einfügen von Protokollen darauf, diese Zeile nicht zu vergessen, 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 du diese Funktion für deine App in einer Produktionsumgebung aktivierst, findest du in der Google Play Console unter Eine native Debugging-Symboldatei für deine App hinzufügen.