这是对ndk-stack使用文档的翻译,文档所在的路径是:\android-ndk-r9d\docs\NDK-STACK.html
介绍:
这篇文档描述的是ndk-stack工具,从R6版本起,这个工具就分配到AndroidNDK中。
概述:
ndk-stack是一款简单的工具,你可以根据过滤器跟踪在logcat的输出中出现的堆栈,并且用对应的值替换任何一个共享的库的地址。
简而言之,他可以翻译如下的信息:
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 %gt;%gt;%gt; /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构建系统(i.e. ndk-build),那么他们的位置通常是在
$PROJECT_PATH/obj/local/<abi>目录下。<api>代表的是你硬件的ABI(i.e.默认的是“
armeabi
”文件夹)。
你可以将logcat中的文本作为输入目标输入到程序中,例如:
adb logcat | $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi
或者你也可以使用-dump(转存)选项指定logcat作为一个输入文件,例如:
adb logcat > /tmp/foo.txt
$NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -dump foo.txt
重点:
这个工具寻找最开始的行包含星花(*),在logcat的输出中,例如:
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
在粘贴/复制轨迹的时候,不要忘了轨迹中的这条线,否则,工具将不会正常的工作。
待增加的功能:
ndk-stack将来的版本将会试着自动启动logcat,自动选择库路径。现在,你必须手动完成这些步骤。现在,ndk-stack还不能处理在其中没有调试信息的库。向ndk-stack提供一个PC的地址找最近的入口函数指针,还是很有用的。