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: 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:\Users\zhangchuanwei\workspace1\hellojni/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里面的上面这个函数,就可以重现上面问题了。

时间: 2024-10-21 14:10:36

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

ida 调试 android fork

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

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

转自:http://blog.csdn.net/guowenyan001/article/details/12975221 一.分析Core文件 1.1 找到core文件目录,启动mycrash:mycrash 1.2 查看崩溃的堆栈信息:bt 1.3 反汇编崩溃点的代码,10行:dis -l extract_http_info+73 10 二.分析源文件hinfo.ko 2.1 查看源文件信息:objdump -S hinfo.ko > tmp 2.2 从tmp文件中查找1.3中的内容movb

如何利用 release 版本的 backtrace 来定位 android NDK 程序的崩溃位置

我们知道 android NDK 程序在崩溃时会生成一个 tombstone 的 backtrace (也可利用 ADB logcat 抓取),从这个 backtrace 中我们可以了解是哪个函数引发的崩溃,但是通常由于我们发布时都是 release 版,无法利用 backtrace 中的地址信息直接定位到源码和行号,当引发崩溃的错误不是很明显时,对于我们解决问题的帮助就不大. 这时通常我们是重编一个 debug 版本并设法重现 crash.这样做有个两个问题,一是如果我们不知道复现步骤,或者复

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

Eclipse+CDT+gdb调试android ndk程序 先介绍一下开发环境,在这个环境下,up主保证是没有问题的. ubuntu 11.10 eclipse 3.7(indego) for java jdk 6 android sdk 2.2 andrid ndk r7 当然,在windows环境下通过cygwin等工具也是可以实现gdb调试的,我也确实实现过.但是性能实在太低,卡的根本没法用.Linux下直接用gdb调试本地方法是很流畅的. 再确定安装并配置好开发环境之后,就可以开始了.

Android Studio代码调试大全

http://blog.csdn.net/dd864140130/article/details/51560664 Android Studio目前已经成为开发android的主要工具,用熟了可谓相当顺手.作为开发者,调试并发现bug,进而解决,可是我们的看家本领.正所谓,工欲善其事必先利其器,和其他开发工具一样,如Eclipse.Idea,Android Studio也为我们提供了强大的调试技巧,今天我们就来看看Android Studio中有关调试的技巧. 首先,来看看Android stu

Eclipse替代ndk-gdb断点调试Android NDK程序

一 概述: Eclipse调试NDK程序的操作并不难,难的是环境的搭建.光是安装Eclipse就有不少问题,真是"大错不犯,小过不断"不胜期烦.在网上,已经有先行者记录下了Eclipse断点调试Android NDK程序的方法: <Eclipse + ADT(包括NDK Plugin) + CDT 搭建Android NDK开发环境>网址:http://blog.sina.com.cn/s/blog_48ed03c80101nhei.html 我遇到的情况与上文有些不同,上

白话开发——Android Studio代码调试技巧篇

Android Studio目前已经成为开发Android的主要工具,用熟了可谓相当顺手.作为开发者,调试并发现bug,进而解决,可是我们的看家本领.正所谓,工欲善其事必先利其器,和其他开发工具一样,如Eclipse.Idea,Android Studio也为我们提供了强大的调试技巧,今天我们就来看看Android Studio中有关调试的技巧. 首先,来看看Android studio中为我们提供的调试面板(标准情况下): 点击右上角Restore 'Threads'View可先展示目前相关的

Android技术9:Android NDK日志调试

在Android中我们经常使用Log来调试程序,NDK中也为我们提供输出日志的方法. 1.引入头文件<android/log.h> #include<android/log.h> 2.定义宏 #define LOG_TAG "System.out.c"#define LOGD(...) _android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,_VA_ARGS_)#define LOGI(...) _android_log_pri

Android Studio 2.1 NDK断点调试方法

Android Studio 2.1 NDK断点调试方法(基于Android 2.1, gradle 2.1.0) 1.创建一个Android Studio Project 2.设置NDK路径. 菜单中选择: File->Project Structure 在弹出的窗口的左侧选项框中,选择SDK Location,在右侧设置Android NDK location. 2.修改.\build.gradle如下: replase classpath 'com.android.tools.build: