ndk-stack
工具允许您对来自 adb logcat
或 /data/tombstones/
中的 tombstone 的堆栈跟踪进行符号化。它将共享库中的任何地址替换为源代码中相应的 <源文件>:<行号>
,从而简化调试过程。
例如,它会将类似以下内容的内容:
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):
转换为更易于阅读的内容:
********** 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
用法
要使用 ndk-stack
,您首先需要一个包含应用共享库未剥离版本的目录。如果您使用 ndk-build
,则这些未剥离的共享库位于 $PROJECT_PATH/obj/local/<abi>
中,其中 <abi>
是您设备的 ABI。
对于 Android Gradle Plugin (AGP) 构建,未剥离的库将位于 <项目路径>/build/intermediates/cxx/<构建类型>/<哈希值>/obj/<abi>
中,其中 <项目路径>
是包含您尝试进行符号化处理的模块的 AGP 项目的目录(默认情况下为 app
),<构建类型>
是 CMake 或 ndk-build 构建类型的名称(例如 RelWithDebInfo
、Release
、Debug
等),<哈希值>
是任意的,<abi>
是您设备的 ABI。
有两种使用此工具的方法。您可以将 logcat 文本作为直接输入提供给程序。例如:
adb logcat | $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi-v7a
您也可以使用 -dump
选项指定 logcat 作为输入文件。例如:
adb logcat > /tmp/foo.txt $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi-v7a -dump foo.txt
当它开始解析 logcat 输出时,工具会查找初始星号行。例如:
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
注意:复制/粘贴跟踪时,请不要忘记此行,否则 ndk-stack
将无法正常工作。
更多信息
Google Play 使用 ndk-stack
对 Google Play Console 中原生应用的堆栈跟踪进行符号化。有关如何在生产环境中为您的应用启用此功能的信息,请参阅如何在 Google Play Console 中包含原生调试符号文件。