ndk-stack 调试 android c++ 代码崩溃位置
在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++ 代码崩溃位置的更多相关文章
- ida 调试 android fork
在使用ida 调试android native代码时经常会碰见fork子进程的情况出现,而运行一个 android_server只能对一个进程进行调试或者attach,而ida 默认端口是23946, ...
- Linux内核:分析coredump文件 - 内核代码崩溃
转自:http://blog.csdn.net/guowenyan001/article/details/12975221 一.分析Core文件 1.1 找到core文件目录,启动mycrash:my ...
- Eclipse+CDT+GDB调试android NDK程序(转)
Eclipse+CDT+gdb调试android ndk程序 先介绍一下开发环境,在这个环境下,up主保证是没有问题的. ubuntu 11.10 eclipse 3.7(indego) for ja ...
- Android Studio代码调试大全
http://blog.csdn.net/dd864140130/article/details/51560664 Android Studio目前已经成为开发android的主要工具,用熟了可谓相当 ...
- Ubuntu18.04上使用LLDB调试Chromium Android C++代码。
###动机###Chromium Android源代码庞大且复杂.在调试器LLDB下能帮助我们更好的理解代码流程.介绍使用LLDB调试器调试android上chromium的C++代码. [1] 编译 ...
- JS事件调试 - 查找HTML元素绑定的事件以及绑定代码所在位置
日常的网页开发调试工作中,经常需要知道指定的某个网页元素绑定了哪些事件以及绑定代码的位置,下面介绍三种用来跟踪页面中的事件的方法. 1.使用firefox调试 我们可以使用firefox的debug工 ...
- Android Native 代码NDK开发学习笔记
引用:http://www.kunli.info/2011/08/21/android-native-code-study-note/ JNI,全称Java Native Interface,是用于让 ...
- Web程序员开发App系列 - 调试Android和IOS手机代码(补图)
Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...
- Android如何完全调试framework层代码
1 之前写过一篇文章:<Android实现开机调试system_process> 2 google的eclipse插件ADT的已经能够很方便的调试Android的apk了,但是调试的时候应 ...
随机推荐
- Linux学习 -- Shell编程 -- 字符处理命令
sort排序命令 sort [选项] 文件名 -f 忽略大小m写 -n 按数值型,默认字符串型 -r 反向 -t 指定分隔符 -k n[,m] 指定字段范围,默认行尾 eg. sort -n -t & ...
- 简单实现contentOS下开机自动启动tomcat
看过网上很多写tomcat开机自启动的例子,很多都是写了一个比较复杂的脚步.找到一个比较简单的. 首先编辑 vi /etc/rc.d/rc.local 在尾部加入 export JDK_HOME=/u ...
- Codeforces Round #349 (Div. 2) C. Reberland Linguistics (DP)
C. Reberland Linguistics time limit per test 1 second memory limit per test 256 megabytes input stan ...
- STL笔记之【map之总概】
1.map和multimap内部数据结构: 红黑树(平衡二叉树的一种)2.在往map和multimap中插入元素时,会自动进行排序3.map和multimap的所有元素的key都被视为常数,其元素的实 ...
- JS页面延迟执行一些方法(整理)
一般在JS页面延迟执行一些方法.可以使用以下的方法 jQuery.delay()方法简介 http://shawphy.com/2010/11/jquery-delay.html jQuery中que ...
- 设计模式之建造者模式(Builder)
一个人活到70岁以上,都会经历这样的几个阶段:婴儿,少年,青年,中年,老年.并且每个人在各个阶段肯定是不一样的呀,我觉得可以说世界上不存在两个人在人生的这5个阶段的生活完全一样,但是活到70岁以上的人 ...
- HTTPS与SSL
---------------------------------------------------------------------------------------------------- ...
- JAVA字符串编码转换常用类
无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题.尤其在web应用中常常需要处理中文字符,这时就需要进行字符串的编码转换,将字符串编码转换为GBK或者GB2312.一.关键技术点: ...
- 转:Selenium的延迟等待
Selenium的延迟等待分为 显式等待(Explicit Wait) & 隐式等待(Implicit Wait). 1.显式等待 显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点 ...
- HDU 2485 Destroying the bus stations
2015 ACM / ICPC 北京站 热身赛 C题 #include<cstdio> #include<cstring> #include<cmath> #inc ...