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

相关文章

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li

Linux:alias如何设置永久生效

《Linux:alias如何设置永久生效》在Linux中设置别名永久生效的步骤包括:在/root/.bashrc文件中配置别名,保存并退出,然后使用source命令(或点命令)使配置立即生效,这样,别... 目录linux:alias设置永久生效步骤保存退出后功能总结Linux:alias设置永久生效步骤

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC