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

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

ADBPATH = F:\DevelopTools\adt-bundle-windows-x86_64-20131030\sdk\platform-tools

NDKROOT = F:\DevelopTools\android-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: , tid: >>> com.example.hellojni <<<
signal (SIGSEGV), code (SEGV_MAPERR), fault addr
Stack frame I/DEBUG ( ): # pc 00000eb0 /data/data/com.examp
ringFromJNI at C:\Users\zhangchuanwei\workspace1\hellojni/jni/hellojni.cpp:
Stack frame I/DEBUG ( ): # pc 00017d74 /system/lib/libdvm.s
Stack frame I/DEBUG ( ): # pc 00048f08 /system/lib/libdvm.s
Stack frame I/DEBUG ( ): # pc 00041ab6 /system/lib/libdvm.s
Stack frame I/DEBUG ( ): # pc 0002976c /system/lib/libdvm.s
Stack frame I/DEBUG ( ): # pc /system/lib/libdvm.s
Stack frame I/DEBUG ( ): # pc 0005f5de /system/lib/libdvm.s
Stack frame I/DEBUG ( ): # pc 00066fce /system/lib/libdvm.s
Stack frame I/DEBUG ( ): # pc 0001cfd4 /system/lib/libdvm.s
Stack frame I/DEBUG ( ): # pc 000220dc /system/lib/libdvm.s
Stack frame I/DEBUG ( ): # pc 00020fd0 /system/lib/libdvm.s
Stack frame I/DEBUG ( ): # pc 0005f430 /system/lib/libdvm.s
Stack frame I/DEBUG ( ): # pc 0004b9a8 /system/lib/libdvm.s
Stack frame I/DEBUG ( ): # pc 0003ebb0 /system/lib/libdvm.s
Stack frame I/DEBUG ( ): # pc 000314ac /system/lib/libandro
Stack frame I/DEBUG ( ): # pc 000322c6 /system/lib/libandro
Stack frame I/DEBUG ( ): # pc 00008ca2 /system/bin/app_proc
Stack frame I/DEBUG ( ): # pc 00014db8 /system/lib/libc.so

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

    struct strTest{
char* pstr;
};
strTest *ptest=NULL;
ptest->pstr=NULL;
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里面的上面这个函数,就可以重现上面问题了。

ndk-stack 调试 android c++ 代码崩溃位置的更多相关文章

  1. ida 调试 android fork

    在使用ida 调试android native代码时经常会碰见fork子进程的情况出现,而运行一个 android_server只能对一个进程进行调试或者attach,而ida 默认端口是23946, ...

  2. Linux内核:分析coredump文件 - 内核代码崩溃

    转自:http://blog.csdn.net/guowenyan001/article/details/12975221 一.分析Core文件 1.1 找到core文件目录,启动mycrash:my ...

  3. Eclipse+CDT+GDB调试android NDK程序(转)

    Eclipse+CDT+gdb调试android ndk程序 先介绍一下开发环境,在这个环境下,up主保证是没有问题的. ubuntu 11.10 eclipse 3.7(indego) for ja ...

  4. Android Studio代码调试大全

    http://blog.csdn.net/dd864140130/article/details/51560664 Android Studio目前已经成为开发android的主要工具,用熟了可谓相当 ...

  5. Ubuntu18.04上使用LLDB调试Chromium Android C++代码。

    ###动机###Chromium Android源代码庞大且复杂.在调试器LLDB下能帮助我们更好的理解代码流程.介绍使用LLDB调试器调试android上chromium的C++代码. [1] 编译 ...

  6. JS事件调试 - 查找HTML元素绑定的事件以及绑定代码所在位置

    日常的网页开发调试工作中,经常需要知道指定的某个网页元素绑定了哪些事件以及绑定代码的位置,下面介绍三种用来跟踪页面中的事件的方法. 1.使用firefox调试 我们可以使用firefox的debug工 ...

  7. Android Native 代码NDK开发学习笔记

    引用:http://www.kunli.info/2011/08/21/android-native-code-study-note/ JNI,全称Java Native Interface,是用于让 ...

  8. Web程序员开发App系列 - 调试Android和IOS手机代码(补图)

    Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...

  9. Android如何完全调试framework层代码

    1 之前写过一篇文章:<Android实现开机调试system_process> 2 google的eclipse插件ADT的已经能够很方便的调试Android的apk了,但是调试的时候应 ...

随机推荐

  1. 为什么Hbase能实现快速的查询

    你的快速是指什么? 是根据亿级的记录中快速查询,还是说以实时的方式查询数据. A:如果快速查询(从磁盘读数据),hbase是根据rowkey查询的,只要能快速的定位rowkey,  就能实现快速的查询 ...

  2. Cocos2d 使用控制台打印的方法

    1.打开当前项目的win32解决方案. 2.在解决方案管理器的win32文件夹下打开main.cpp 3.增加以下代码: #define USE_WIN32_CONSOLE //以下加到入口函数 #i ...

  3. Zencart批量删除无图片产品

    Zencart批量删除无图片产品 2012-04-23 07:26:18|  分类: 默认分类 |字号 订阅 转自 http://zhongjia33.blog.163.com/blog/#m=0   ...

  4. HDU 2444 The Accomodation of Students(二分图判定+最大匹配)

    这是一个基础的二分图,题意比较好理解,给出n个人,其中有m对互不了解的人,先让我们判断能不能把这n对分成两部分,这就用到的二分图的判断方法了,二分图是没有由奇数条边构成环的图,这里用bfs染色法就可以 ...

  5. USACO Section 1.3 Prime Cryptarithm 解题报告

    题目 题目描述 牛式的定义,我们首先需要看下面这个算式结构: * * * x * * ------- * * * <-- partial product 1 * * * <-- parti ...

  6. Unity3d疑难问题解决

    1. 加载 c++ dll 不成功,报这个错: Failed to load 'Assets/Plugins/x86_64/myFile.dll' with error 'The operation ...

  7. STM32开发指南-跑马灯实验

    简单对I/O口的控制,主要通过对寄存器的读写控制.主要通过I/O的寄存器来控制:1. 控制I/O的方向2. 控制I/O的输出电平或上下来电阻3. 存储I/O口当前的输入状态(高低电平) 对使用LED灯 ...

  8. php 系列

    1.给 跑在windows 环境下的php, 安装redis 拓展.(installing Redis & Redis extension in PHP on XAMPP on windows ...

  9. Git上传文件

    最近开始折腾node.js,顺便学习了Git上传的相关知识,找了许多关于Git如何上传项目的相关资料,最终发现一篇比较简易完整的文章, 在此分享一下喜悦的心情!下文是使用Git上传的完整教程: 将文件 ...

  10. 微信小程序开发入门教程

    做任何程序开发要首先找到其官方文档,微信小程序目前还在邀请内测阶段,目前官方放出了部分开发文档,经过笔者一天的查看和尝试,感觉文档并不全面,但是通过这些文档已经能够看出其大概面貌了.闲话不多说,我们先 ...