• 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里面的上面这个函数,就可以重现上面问题了。

  • 相关阅读:
    Sum Root to Leaf Numbers深度优先计算路径和
    Path Sum II深度优先找路径
    动态和静态链接库
    C/C++变量
    搜索
    基本格式
    随机数生成函数
    珍惜生命,我用Python 。今天开始学习Python
    在windows里hexo 博客创建步骤
    作为一个程序员,什么是脚本。必须要理解
  • 原文地址:https://www.cnblogs.com/chuanwei-zhang/p/3937976.html
Copyright © 2020-2023  润新知