ndk-stack 使用(分析native代码stack)

时间:2023-03-09 16:14:48
ndk-stack 使用(分析native代码stack)

简介:

  ndk r6 版本之后开始提供该功能。

作用:

  ndk-stack可以把不认识的内存地址信息转换成可读的信息。

比如,把下列内容

I/DEBUG   (   ): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( ): Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'
I/DEBUG ( ): pid: , tid: %gt;%gt;%gt; /data/local/ndk-tests/crasher <<<
I/DEBUG ( ): signal (SIGSEGV), fault addr 0d9f00d8
I/DEBUG ( ): r0 0000af88 r1 0000a008 r2 baadf00d r3 0d9f00d8
I/DEBUG ( ): r4 r5 0000a008 r6 0000af88 r7 00013c44
I/DEBUG ( ): r8 r9 fp
I/DEBUG ( ): ip 0000959c sp be956cc8 lr pc 0000841e cpsr
I/DEBUG ( ): # pc 0000841e /data/local/ndk-tests/crasher
I/DEBUG ( ): # pc 000083fe /data/local/ndk-tests/crasher
I/DEBUG ( ): # pc 000083f6 /data/local/ndk-tests/crasher
I/DEBUG ( ): # pc 000191ac /system/lib/libc.so
I/DEBUG ( ): # pc 000083ea /data/local/ndk-tests/crasher
I/DEBUG ( ): # pc /data/local/ndk-tests/crasher
I/DEBUG ( ): # pc 0000d362 /system/lib/libc.so
I/DEBUG ( ):

转换成可读信息后:

********** Crash dump: **********
Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'
pid: , tid: >>> /data/local/ndk-tests/crasher <<<
signal (SIGSEGV), fault addr 0d9f00d8
Stack frame # pc 0000841e /data/local/ndk-tests/crasher : Routine zoo in /tmp/foo/crasher/jni/zoo.c:
Stack frame # pc 000083fe /data/local/ndk-tests/crasher : Routine bar in /tmp/foo/crasher/jni/bar.c:
Stack frame # pc 000083f6 /data/local/ndk-tests/crasher : Routine my_comparison in /tmp/foo/crasher/jni/foo.c:
Stack frame # pc 000191ac /system/lib/libc.so
Stack frame # pc 000083ea /data/local/ndk-tests/crasher : Routine foo in /tmp/foo/crasher/jni/foo.c:
Stack frame # pc /data/local/ndk-tests/crasher : Routine main in /tmp/foo/crasher/jni/main.c:
Stack frame # pc 0000d362 /system/lib/libc.so

使用方法:

前提: 你的代码必须是使用ndk build打包出来的。这样地址信息就会是

$PROJECT_PATH/obj/local/<abi>

其中 <abi> 是根据你的手机的ABI来的。(比如:’armeabi‘就是默认值)

打开你的控制台,输入($NDK是你的环境变量,指向NDK目录):

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

大工完成。