ndk-stack

L'outil ndk-stack vous permet de décoder les traces de la pile à partir d'adb logcat ou d'un tombstone dans /data/tombstones/. Il remplace toute adresse figurant dans une bibliothèque partagée par la valeur <source-file>:<line-number> correspondante provenant de votre code source, ce qui facilite le débogage.

Par exemple, il convertit :

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):

dans un format plus lisible :

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

Utilisation

Pour utiliser ndk-stack, vous devez d'abord disposer d'un répertoire contenant des versions complètes des bibliothèques partagées de votre application. Si vous utilisez ndk-build, ces bibliothèques partagées complètes se trouvent dans $PROJECT_PATH/obj/local/<abi>, où <abi> correspond à l'ABI de votre appareil.

Pour une compilation du plug-in Android Gradle (AGP), les bibliothèques non supprimées se trouvent dans <project-path>/build/intermediates/cxx/<build-type>/<hash>/obj/<abi>, où <project-path> est le répertoire du projet AGP contenant le module que vous essayez de symboliser (par défaut, il s'agit de app), <build-type> est le nom du type de compilation CMake ou ndk-build (par exemple, RelWithDebInfo, Release, Debug, etc.), <hash> est arbitraire, et <abi> est l'ABI de votre appareil.

Il existe deux façons d'utiliser cet outil. Vous pouvez insérer directement le texte logcat dans le programme. Exemple :

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

Vous pouvez également utiliser l'option -dump pour spécifier le fichier logcat en tant que fichier d'entrée. Exemple :

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

Lorsqu'il commence à analyser la sortie du journal, l'outil recherche une première ligne d'astérisques. Exemple :

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

Remarque : Lorsque vous copiez/collez des traces, n'oubliez pas cette ligne. Dans le cas contraire, ndk-stack ne fonctionnera pas correctement.

Informations supplémentaires

Google Play utilise ndk-stack pour décoder les traces de la pile pour les applications natives dans la Google Play Console. Pour savoir comment utiliser cette fonctionnalité pour votre application dans un environnement de production, découvrez comment inclure un fichier de débogage natif dans la Google Play Console.