ndk-stack

Công cụ ndk-stack cho phép bạn biểu tượng hoá dấu vết ngăn xếp từ adb logcat hoặc tombstone trong /data/tombstones/. Công cụ này sẽ thay thế mọi địa chỉ bên trong một thư viện dùng chung bằng <source-file>:<line-number> tương ứng từ mã nguồn, giúp gỡ lỗi dễ dàng hơn.

Ví dụ: Công cụ này dịch nội dung như:

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

sang dạng dễ đọc hơn:

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

Cách sử dụng

Để sử dụng ndk-stack, trước tiên, bạn cần có một thư mục chứa các phiên bản đã lược bỏ thông tin của thư viện dùng chung trong ứng dụng. Nếu bạn sử dụng ndk-build, thì các thư viện dùng chung đã lược bỏ thông tin này có trong $PROJECT_PATH/obj/local/<abi>, trong đó <abi> là ABI của thiết bị.

Bạn có thể dùng công cụ này theo hai cách. Bạn có thể cung cấp văn bản logcat dưới dạng thông tin đầu vào trực tiếp cho chương trình. Ví dụ:

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

Bạn cũng có thể sử dụng tuỳ chọn -dump để chỉ định logcat làm tệp đầu vào. Ví dụ:

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

Khi bắt đầu phân tích cú pháp tệp đầu ra logcat, công cụ sẽ tìm dòng dấu hoa thị ban đầu. Ví dụ:

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

Lưu ý: Khi sao chép/dán dấu vết, bạn không được quên dòng này. Nếu không, ndk-stack sẽ không hoạt động chính xác.

Thông tin khác

Google Play sử dụng ndk-stack để biểu tượng hoá dấu vết ngăn xếp cho các ứng dụng gốc trong Google Play Console. Để biết thông tin về cách bật tính năng này cho ứng dụng trong môi trường phát hành chính thức, hãy xem cách bao gồm tệp biểu tượng gỡ lỗi gốc cho ứng dụng trong Google Play Console.