How to use NDK-STACK tool to debug Cocos2d-x android project.

Android NDK-STACK Tool

‘ndk-stack’ is a simple tool that allows you to analyze stack traces as they appear in the output of ‘adb logcat’ and replace any address inside a shared library with the corresponding values.

In the output of ‘adb logcat’, you may see something like the followings, and we must translate those:

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):

How to use this tool

If you succeed in building Cocos2d-x android project, it will generate shared libraries in $PROJECT_PATH/obj/local/ , where stands for your device’s ABI (i.e.‘armeabi’ by default);

You can feed the logcat text either as direct input to the program, e.g.:

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

Or you can use the -dump option to specify the logcat as an input file, e.g.:

adb logcat > /tmp/foo.txt
$NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -dump foo.txt

After that, you will get the more readable output:

********** 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

IMPORTANT

The tool looks for the initial line containing starts in the logcat output, i.e.something this looks like:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

When copy/pasting traces, don’t forget this line from the traces, or ndk-stack won’t work correctly.

Now both the versions(linux/windows/mac) of ndk-stack are available at Android Developer .

References

$NDK_ROOT/docs/NDK-STACK.html

4 Likes

Amazing! Thanks a lot!~

Here’s the format of the command I use today, in case anyone else runs into the same problem, I had to make sure I pointed at the symbol directory, and that I used the correct ndk version.

E:\Cocos\tools\android-ndk-r10c\ndk-stack.exe -sym PROJECTNAME\proj.android\obj\local\armeabi-v7a\  -dump PROJECTNAME\trace.log > PROJECTNAME\output.log

Hi,
I don’t have the folder \obj\local… in my project path (proj.android).
I’m using Android Studio 3.1.3 for Mac and NDK 16.
How to solve it?

Could be a new version of android or something changing up the folder layouts but I’m surprised. Maybe it’s somewhere else? Make sure the game compiles too, otherwise it wouldn’t exist.

Yes, the game compiles fine. But i don’t find the folder, haha.
Are you using the same versions that I described before?

I found this folders:

../proj.android//app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a
../proj.android//app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a

Maybe I should test with the second.
EDIT: Yes, that’s the folder.

2 Likes