ndk-stack的使用

本文档翻译自android-ndk-r9ddocsNDK-STACK.html,详细介绍了如何在Android环境中使用ndk-stack工具进行崩溃日志分析,帮助开发者定位Native层的错误。
摘要由CSDN通过智能技术生成

这是对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的地址找最近的入口函数指针,还是很有用的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值