zoukankan      html  css  js  c++  java
  • 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里面的上面这个函数,就可以重现上面问题了。

  • 相关阅读:
    使用python发送(SMTP)qq邮件
    google hack
    python多线程爬取网页
    windows自带的颜色编辑器居中
    (转)如何在任务栏添加托盘图标
    c++ 字符串转数字或数字转字符串
    (转)null和NULL和nullptr和””区别
    Windows系统自带选择文件的对话重写和居中处理
    ANSII 与Unicode,Utf8之间的转换
    (转) Windows如何区分鼠标双击和两次单击
  • 原文地址:https://www.cnblogs.com/chuanwei-zhang/p/3937976.html
Copyright © 2011-2022 走看看