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

相关文章

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

linux hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)