android NDK开发在本地C/C++源代码中设置断点单步调试详细教程

本文主要是介绍android NDK开发在本地C/C++源代码中设置断点单步调试详细教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    最近在学android NDK开发,折腾了一天,终于能够成功在ADT中设置断点单步调试本地C/C++源代码了。网上关于这方面的资料太少了,而且大都不全,并且调试过程中会出现各种各样的问题,真是很磨人,程序猿就得有耐心。把自己的调试过程记录下来,希望对需要的朋友有帮助。

    在看本文之前,请先确保你已经成功编译了一个android NDK工程,并且能够在模拟器或者真机上运行。至于怎么编译NDK工程,包括配置、生成.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文件,根据需要设置断点,如下图:


     三、设置工程为可调试模式:

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


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

    四、打开Cygwin,用cd命令定位到工程目录下,我的是 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那个按钮(由于当时没有截图,反正有3个按钮,你点中间那个),把jni文件夹下的cpp文件加进来。如果控制台显示如下图,你直接忽略错误,点Yes,这个时候如果不出意外,就会跳进C++中设置的断点。



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

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

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代码中恰当位置延迟几秒钟,这样就能保证程序执行到断点处本地调试程序已经开启。

能调试成功不容易啊,各位朋友如果遇到了问题,可以在博客下给我留言,我尽力帮忙解决。


这篇关于android NDK开发在本地C/C++源代码中设置断点单步调试详细教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1119881

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

全网最全Tomcat完全卸载重装教程小结

《全网最全Tomcat完全卸载重装教程小结》windows系统卸载Tomcat重新通过ZIP方式安装Tomcat,优点是灵活可控,适合开发者自定义配置,手动配置环境变量后,可通过命令行快速启动和管理... 目录一、完全卸载Tomcat1. 停止Tomcat服务2. 通过控制面板卸载3. 手动删除残留文件4.

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Java服务实现开启Debug远程调试

《Java服务实现开启Debug远程调试》文章介绍如何通过JVM参数开启Java服务远程调试,便于在线上排查问题,在IDEA中配置客户端连接,实现无需频繁部署的调试,提升效率... 目录一、背景二、相关图示说明三、具体操作步骤1、服务端配置2、客户端配置总结一、背景日常项目中,通常我们的代码都是部署到远程

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni