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.