近期在学android NDK开发,折腾了一天,最终可以成功在ADT中设置断点单步调试本地C/C++源码了。网上关于这方面的资料太少了,并且大都不全,并且调试过程中会出现各种各样的问题,真是非常磨人。程序员就得有耐心。

把自己的调试过程记录下来。希望对须要的朋友有帮助。

在看本文之前,请先确保你已经成功编译了一个android NDKproject,而且可以在模拟器或者真机上执行。至于怎么编译NDKproject,包含配置、生成.so文件等等。可以參考我的前一篇博客:http://blog.csdn.net/u013149325/article/details/40375455

首先,说一下我的开发环境配置:

win7  64位

ADT版本号: v22.6.2(已经集成了eclipse、CDT,建议大家都用最新版的ADT)

NDK版本号:android-ndk-r10c

Cygwin:官网下载地址:http://cygwin.com/install.html

至于Cygwin的安装和环境变量配置,网上非常多资料,在此不再赘述。

注:我试了,必须使用Cygwin运行NDK中的ndk-gdb脚本。才干在ADT中进入C/C++的断点。

一、在java程序中第一次调用native函数的地方加上断点。例如以下图:

二、打开jni目录下的cpp文件,依据须要设置断点。例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzE0OTMyNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

三、设置project为可调试模式:

在AndroidManifest的Application中设置Debuggable的值为true,例如以下图:

注:在C/C++ Build中的Builder Settings下也要设置ndk-build NDK_DEBUG=1

四、打开Cygwin。用cd命令定位到project文件夹下,我的是 cd  /cygdrive/f/练习/androidTest

然后运行ndk-gdb命令。我的是 $NDK_ROOT/ndk-gdb --verbose --force

注意:一定要加上--force。否则会报错:Another debug session running,Use --force to kill it

假设报出 No symbol table is loaded.  Use the "file" command
错误,则运行file命令把库加进来。例如以下:

file  obj/local/armeabi-v7a/libTest.so

运行list或者l命令。能够每次显示10行C++源码。

五、在ADT中 Debug As->Android Native Application,假设控制台报错找不到库,就点Load那个button(因为当时没有截图。反正有3个button。你点中间那个),把jni目录下的cpp文件加进来。假设控制台显演示样例如以下图。你直接忽略错误,点Yes,这个时候假设不出意外,就会跳进C++中设置的断点。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzE0OTMyNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这个时候,我们就能够看到变量值、堆栈信息和一些汇编指令了。

注意:假设没有跳进你设置的断点,可能是本地调试还没開始程序就运行完成了,官网上也是这样解释的:

Note:
There is a delay of a few seconds between when the activity is launched and when native debugging starts. If your code is already executed by that point, then you won’t see the breakpoint being hit. So either put a breakpoint in code that is called repetitively,
or make sure that you call JNI code after you see that ndk-gdb has connected. 链接:http://tools.android.com/recent/usingthendkplugin

你能够在java代码中恰当位置延迟几秒钟,这样就能保证程序运行到断点处本地调试程序已经开启。

能调试成功不easy啊,各位朋友假设遇到了问题,能够在博客下给我留言。我尽力帮忙解决。

android NDK开发在本地C/C++源码中设置断点单步调试具体教程的更多相关文章

  1. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  2. MFC源码不能设置断点调试

    用VS2013中MFC开发应用程序时,进入MFC源码设置断点调试.但是在调试过程中发现无法进入源码.最后发现在MFC设置的MFC的使用默认值是在共享dll中使用MFC,这就意味着MFC中的源码并没有连 ...

  3. windows下用ADT进行android NDK开发的具体教程(从环境搭建、配置到编译全过程)

    郑重申明:如需转载本博客,请注明出处,谢谢! 这几天在学习android NDK的开发.那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Ki ...

  4. Android NDK开发入门实例

    AndroidNDK是能使Android应用开发者把从c/c++编译而来的本地代码嵌入到应用包中的一系列工具的组合. 注意: AndroidNDK只能用于Android1.5及以上版本中. I. An ...

  5. vlc源码分析(七) 调试学习HLS协议

    HTTP Live Streaming(HLS)是苹果公司提出来的流媒体传输协议.与RTP协议不同的是,HLS可以穿透某些允许HTTP协议通过的防火墙. 一.HLS播放模式 (1) 点播模式(Vide ...

  6. Android NDK 开发(二) -- 从Hlello World学起【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41805719  上篇文章讲述了Android NDK开发的一些基本概念,以及NDK ...

  7. android NDK开发环境搭建

    android NDK开发环境搭建 2012-05-14 00:13:58 分类: 嵌入式 基于 Android NDK 的学习之旅-----环境搭建 工欲善其事必先利其器 , 下面介绍下 Eclip ...

  8. Android NDK 开发(四)java传递数据到C【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处 ...

  9. Android NDK 开发(三)--常见错误锦集合Log的使用【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误, ...

随机推荐

  1. 【BZOJ4566_洛谷3181】[HAOI2016]找相同字符(SAM)

    自己yy的方法yyyyyyyy着就A了,写篇博客庆祝一下. 题目: 洛谷3181 分析: SAM(可能是)模板题(不会SAM的同学戳我:[知识总结]后缀自动机的构建). 对\(s1\)建出SAM,用\ ...

  2. ACM_“IP地址”普及(进制转换)

    “IP地址”普及 Time Limit: 2000/1000ms (Java/Others) Problem Description: 大家都知道最近广财大校园网提速,现在就跟大家普及一下简单的互联网 ...

  3. day02_12/12/2016_bean的实例化之静态工厂方式

  4. Unicode gbk gb2312 编码问题 [转载]

    原文地址: http://www.cnblogs.com/csn0721/archive/2013/01/24/2875613.html HTML5 UTF-8 中文乱码   <!DOCTYPE ...

  5. DAO模式详解

    DAO模式 数据访问层(DAO): 数据的增.删.改.查操作: 业务逻辑层(service): 业务来往的操作,需要调用数据访问层则调用数据访问层,传递数据: 表现层(UI): 呈现数据,用户交互. ...

  6. Struts2之一 初体验

    Struts2 框架是基于MV模式开发的,它提供了一个核心控制器,用于对所有的请求进行统一处理,这个控制器是由一个名为FilterDispatcher的Servlet过滤器来充当的. 01.需要在we ...

  7. viewpager无线轮播获取网络图片

    首先创建小圆点 小圆点的两个属性一共两个属性另一个跟这个一个样,只不过颜色能让我们区分的 <?xml version="1.0" encoding="utf-8&q ...

  8. C#——反射动态创建类的实例

    “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 若要反射当前项目中的类(即当前项目已经引用它了),可以使用下面的写法. ...

  9. [Windows Server 2008] Serv-U安装方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Serv- ...

  10. Centos永久路由添加教程

    Centos 永久路由添加,一张图看懂全部 blog地址:http://www.cnblogs.com/caoguo