stack ndk

Lo strumento ndk-stack consente di simboleggiare le tracce dello stack da adb logcat o da un elemento tombstone in /data/tombstones/. Sostituisce qualsiasi indirizzo all'interno di una libreria condivisa con il corrispondente <source-file>:<line-number> del codice sorgente, semplificando il debug.

Ad esempio, traduce qualcosa del genere:

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 una versione più leggibile:

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

Utilizzo

Per utilizzare ndk-stack, devi prima avere una directory contenente versioni senza striping delle librerie condivise della tua app. Se utilizzi ndk-build, queste librerie condivise non sottoposte a debug si trovano in $PROJECT_PATH/obj/local/<abi>, dove <abi> è l'ABI del tuo dispositivo.

Per una compilazione del plug-in Android per Gradle (AGP), le librerie non stripped si troveranno in <project-path>/build/intermediates/cxx/<build-type>/<hash>/obj/<abi>, dove <project-path> è la directory del progetto AGP che contiene il modulo che stai cercando di simboleggiare (per impostazione predefinita è app), <build-type> è il nome del tipo di compilazione CMake o ndk-build (ad esempio RelWithDebInfo, Release, Debug e così via), <hash> è arbitrario e <abi> è l'ABI del dispositivo.

Esistono due modi per utilizzare lo strumento. Puoi fornire il testo di logcat come input diretto al programma. Ad esempio:

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

Puoi anche utilizzare l'opzione -dump per specificare logcat come file di input. Ad esempio:

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

Quando inizia l'analisi dell'output di logcat, lo strumento cerca una riga iniziale di asterischi. Ad esempio:

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

Nota: quando copi e incolli le tracce, non dimenticare questa riga, altrimenti ndk-stack non funzionerà correttamente.

Ulteriori informazioni

Google Play utilizza ndk-stack per simbolizzare le analisi dello stack per le app native in Google Play Console. Per informazioni su come attivare questa funzionalità per la tua app in un ambiente di produzione, scopri come includere un file di simboli di debug nativo per la tua app in Google Play Console.