ndk-stack

Alat ndk-stack memungkinkan Anda menyimbolkan stack trace dari adb logcat atau tombstone di /data/tombstones/. Alat ini menggantikan semua alamat dalam library bersama dengan <source-file>:<line-number> yang terkait dari kode sumber Anda, sehingga mempermudah proses debug.

Misalnya, alat ini menerjemahkan sesuatu seperti:

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

menjadi lebih mudah dibaca:

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

Penggunaan

Untuk menggunakan ndk-stack, pertama-tama Anda memerlukan direktori yang berisi versi unstripped dari library bersama aplikasi. Jika Anda menggunakan ndk-build, library bersama simbolik ini ditemukan di $PROJECT_PATH/obj/local/<abi>, dengan <abi> adalah ABI perangkat Anda.

Untuk build Plugin Android Gradle (AGP), library yang tidak di-strip akan berada di <project-path>/build/intermediates/cxx/<build-type>/<hash>/obj/<abi>, dengan <project-path> adalah direktori project AGP yang berisi modul yang Anda coba simbolkan (secara default adalah app), <build-type> adalah nama jenis build CMake atau ndk-build (seperti RelWithDebInfo, Release, Debug, dll.), <hash> bersifat arbitrer, dan <abi> adalah ABI perangkat Anda.

Ada dua cara untuk menggunakan alat ini. Anda dapat memasukkan teks logcat sebagai input langsung ke program. Contoh:

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

Anda juga dapat menggunakan opsi -dump untuk menentukan logcat sebagai file input. Contoh:

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

Saat mulai mengurai output logcat, fitur akan mencari baris awal yang terdiri dari tanda bintang. Contoh:

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

Catatan: Saat menyalin/menempel rekaman aktivitas, jangan lupakan baris ini, atau ndk-stack tidak akan berfungsi dengan benar.

Informasi selengkapnya

Google Play menggunakan ndk-stack agar dapat menyimbolkan pelacakan tumpukan untuk aplikasi native di Konsol Google Play. Untuk informasi tentang cara mengaktifkan fitur ini untuk aplikasi di lingkungan produksi, lihat cara menyertakan file simbol debug native untuk aplikasi di Konsol Google Play.