ndk-stack 调试 android c++ 代码崩溃位置

   在android下面使用jni来调用c++,在开发游戏是非常正常的。但是要调试c++部分却是非常麻烦的问题。如果快速定位崩溃位置呢。NDK提供了一个小工具ndk-stack.

首先,我们先配置环境,把NDK路径和adb的路径配置到环境变量中。如下面:

ADBPATH = F:DevelopToolsadt-bundle-windows-x86_64-20131030sdkplatform-tools

NDKROOT = F:DevelopToolsandroid-ndk-r9d

Path = %path%;%NDKROOT %;%ADBPATH%;

接下, 去我们到工程的根目录,执行以下命令:

adb logcat | ndk-stack -sym obj/local/armeabi

开始执行调试游戏,出现下列错误

********** Crash dump: **********
Build fingerprint: 'generic/sdk/generic:2.3.3/GRI34/101070:eng/test-keys'
pid: 571, tid: 571  >>> com.example.hellojni <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
Stack frame I/DEBUG   (   30):          #00  pc 00000eb0  /data/data/com.examp
ringFromJNI at C:Userszhangchuanweiworkspace1hellojni/jni/hellojni.cpp:22
Stack frame I/DEBUG   (   30):          #01  pc 00017d74  /system/lib/libdvm.s
Stack frame I/DEBUG   (   30):          #02  pc 00048f08  /system/lib/libdvm.s
Stack frame I/DEBUG   (   30):          #03  pc 00041ab6  /system/lib/libdvm.s
Stack frame I/DEBUG   (   30):          #04  pc 0002976c  /system/lib/libdvm.s
Stack frame I/DEBUG   (   30):          #05  pc 00021020  /system/lib/libdvm.s
Stack frame I/DEBUG   (   30):          #06  pc 0005f5de  /system/lib/libdvm.s
Stack frame I/DEBUG   (   30):          #07  pc 00066fce  /system/lib/libdvm.s
Stack frame I/DEBUG   (   30):          #08  pc 0001cfd4  /system/lib/libdvm.s
Stack frame I/DEBUG   (   30):          #09  pc 000220dc  /system/lib/libdvm.s
Stack frame I/DEBUG   (   30):          #10  pc 00020fd0  /system/lib/libdvm.s
Stack frame I/DEBUG   (   30):          #11  pc 0005f430  /system/lib/libdvm.s
Stack frame I/DEBUG   (   30):          #12  pc 0004b9a8  /system/lib/libdvm.s
Stack frame I/DEBUG   (   30):          #13  pc 0003ebb0  /system/lib/libdvm.s
Stack frame I/DEBUG   (   30):          #14  pc 000314ac  /system/lib/libandro
Stack frame I/DEBUG   (   30):          #15  pc 000322c6  /system/lib/libandro
Stack frame I/DEBUG   (   30):          #16  pc 00008ca2  /system/bin/app_proc
Stack frame I/DEBUG   (   30):          #17  pc 00014db8  /system/lib/libc.so

直接可以看到我们的工程第22行有错误,看下22行是什么

   18 struct strTest{
   19     char* pstr;
   20 };
   21 strTest *ptest=NULL;
   22 ptest->pstr=NULL;
   23 return env->NewStringUTF("hello world returned.");

对于ndk-stack的使用可以看ndk根目录下的docs/NDK-STACK.html文件

源码:http://files.cnblogs.com/chuanwei-zhang/hellojni-dynamic.zip

static const char* className = "com/example/hellojni/MainActivity";
JNIEXPORT jstring JNICALL stringFromJNI(JNIEnv* env, jclass clazz)
{
    //return env->NewStringUTF(env, "Hello form JNI!");
    struct strTest{
        char* pstr;
    };
    strTest *ptest=NULL;
    ptest->pstr=NULL;
    return env->NewStringUTF("hello world returned.");
}

下载源码,并替换hellojni.cpp里面的上面这个函数,就可以重现上面问题了。

原文地址:https://www.cnblogs.com/chuanwei-zhang/p/3937976.html