Công cụ ndk-stack
hỗ trợ 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 chưa cắt của thư viện dùng chung trong ứng dụng. Nếu sử dụng ndk-build
, bạn sẽ tìm thấy các thư viện dùng chung chưa bị cắt này trong $PROJECT_PATH/obj/local/<abi>
, trong đó <abi>
là ABI của thiết bị.
Đối với bản dựng Trình bổ trợ Android cho Gradle (AGP), các thư viện chưa được loại bỏ sẽ nằm trong <project-path>/build/intermediates/cxx/<build-type>/<hash>/obj/<abi>
, trong đó <project-path>
là thư mục của dự án AGP chứa mô-đun mà bạn đang cố gắng biểu tượng hoá (theo mặc định là app
), <build-type>
là tên của loại bản dựng CMake hoặc ndk-build (chẳng hạn như RelWithDebInfo
, Release
, Debug
, v.v.), <hash>
là tuỳ ý và <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.