`
iaiai
  • 浏览: 2203876 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

超简单的NDK单步调试方法

 
阅读更多
最近为了性能需求,开始搞JNI,白手起搞真心不容易。中间差点崩溃了好几次,最终总算得到一点心得。



JNI对性能的提升没有我预想中的大,对于for循环的速度提升大概在1倍左右,所以如果数量级不大的话,性能提升不会很明显

JNI编完之后,不能调试,是不是很蛋疼,不像android Java可以看出错信息。JNI crash之后,界面上表示为没有任何反应,过段时间直接退出应用,没有提示、也没有XXX已停止运行。第一次遇到真是无从下手,有没有!!!,经过对Java层的log研究发现,原来JNI crash后,cpu就直接死在那里(相当于assert,程序停止运行)。果断时间后JAVA层发现程序已挂之后(进程僵死),就强制杀死该进程。于是程序直接退出而无提示。(以上分析纯属个人分析,如有不对,敬请指正)。这时发现如果能有单步调试功能那该多好!!



百度一下 ndk单步调式 一般能搜出如下结果:

1、安装CDT插件

2、安装Sequoyah插件

3、使用插件装入JNI文件、导入JNI头文件

4、配置eclipse JNI编译环境

5、修改ndk-gdb脚本

6、运行ndk-gdb脚本,并修改生成的文件(windows需安装cygwin)

7、配置eclipse native调试环境

吓尿了,有没有!!!单步调试这么麻烦!!!麻烦不说,windows下使用ndk-gdb效率还特别低



另外,对于修改google release的ndk脚本,我一直持保留态度,安说release的脚本应该直接能用的,为什么要做修改后才能用呢?



以上步骤,我花了2~3小时搞定,仅仅为了能打个断点~~~



在机缘巧合下,我看到一篇google官方的文章“Using NDK Plugins”

令人兴奋的是,ADTr20已经支持JNI单步调试,再也不需要如上这么麻烦的步骤了

你现在需要做的只需以下2步:

1、使用ndk-build编译时,加上如下参数NDK_DEBUG=1,之后生成so文件之外,还会生成gdbobserver,gdb.setup调式文件

2、在项目的Debug Configuration中选择Android Native Apllication,点击下方Debug

3、Enjoy your Debugging!



如何?是不是超简单,而且调试速度还相当快哦



ADTr20已经比较完美支持NDK开发了。可以集成ndk编译,只需在项目右键Add Native Support,就能自动生成jni文件,并部署编译环境(注意这个过程是不可逆的,手动删除jni文件后,会编译不过)。如果需要生成NDK调试文件,需要右键项目->properties->C/C++ build->Builder Setting 把默认的Build Command : ndk-build 修改成 ndk-build NDK_DEBUG=1



最后推荐一个很有用的android官方网站http://tools.android.com/这个网站包含大多数ADT使用方法和新版ADT的介绍,获益匪浅

关于如何使用ADT进行ndk单步调式就在http://tools.android.com/recent/usingthendkplugin


只可惜这种方法只能在ndk环境下使用,如果要对framework中的jni进行单步调试,应该就行不通了,推荐的一种方法是把它在NDK中编译调试完毕,然后将生成的so放在system/lib下

android职业交流QQ 群,有兴趣的可以一起来多搞搞技术、职业交流,互相学习、提高,互通好的职业信息,群号:104286694
分享到:
评论

相关推荐

    嵌入式linux中单步调试程序的方法(图文详细说明)

    在嵌入式Linux系统中,调试程序是一项至关重要的任务,特别是在遇到复杂问题时,单步调试可以帮助开发者逐步跟踪代码执行,查找和修复错误。本文主要介绍如何在QtCreator中进行嵌入式ARM程序的单步调试,以下是详细...

    oracle存储过程单步调试的方法

    Oracle存储过程的单步调试是数据库开发中必不可少的技能,它可以帮助开发者跟踪代码执行流程,定位并解决问题。本文将详细讲解如何在Oracle环境中进行存储过程的单步调试。 首先,要进行存储过程的调试,你需要在...

    Eclipse 的单步调试.docx

    Eclipse 的单步调试 Eclipse 的单步调试是指在 Eclipse 集成开发环境(IDE)中使用单步调试功能来 debug Java 程序。单步调试功能可以帮助开发者逐步执行程序,检查程序的执行结果,改变变量的值,检查代码段执行...

    codeblocks 单步调试演示

    1. **什么是单步调试**:单步调试是一种逐行执行程序的方法,它允许程序员观察每一步的执行情况,包括变量的变化、函数调用等,以便找出潜在的问题。这对于理解代码逻辑、定位bug至关重要。 2. **CodeBlocks的调试...

    一种C语言级单步调试系统的功能实现方案

    单步调试功能是软件调试中不可或缺的一部分,它允许开发者逐行执行程序,并观察程序运行的每一步。C语言作为一种编译型语言,其单步调试功能实现需要关注源代码级别上的执行细节,而不是仅仅在汇编层面。 首先,...

    CodeBlocks单步调试入门

    单步调试的使用方法和意义在于帮助开发者追踪程序的执行流程,寻找程序实际执行与预期之间的差异。例如,开发者可以通过单步执行来确认程序是否按照设计的逻辑来执行分支条件判断(比如应该执行A路径,结果却错误地...

    VC6.0单步调试

    在使用VC6.0进行单步调试时,掌握正确的调试按键使用方法是非常关键的。通过合理地运用这些调试工具和技术,可以帮助开发者高效地定位和解决问题。特别是在处理复杂的函数调用或API交互时,适当选择F10和F11可以使...

    vc++6.0单步调试

    vc++6.0 单步调试的详细介绍,并配合以具体的例子,一学就会

    Lua单步调试编辑软件

    Lua是一种轻量级的脚本...总结来说,"Lua单步调试编辑软件"是一个集成了单步调试功能的Lua编程环境,它利用如luaDebugger.dll等组件,为开发者提供了强大的错误检测和问题定位能力,极大地提升了开发效率和代码质量。

    VxWorks单步调试环境的搭建

    ### VxWorks单步调试环境的搭建 #### 一、项目编译及VxWorks OS组件配置 在搭建VxWorks单步调试环境的过程中,首先需要进行的是项目的编译及VxWorks操作系统的相关组件配置。 1. **编译设置**: - 在项目编译...

    DevC++单步调试的设置方法.rar_DEVC_devC++调试顺序_单步调试setting

    总之,熟练掌握DevC++的单步调试设置方法对于提升编程效率和理解代码执行流程至关重要。通过实践,你会发现自己能更快地定位和修复程序中的问题。在学习过程中,记得多尝试,多实践,不断巩固这些技能。

    使用eclipse单步调试jni代码 (方法2)

    ### 使用Eclipse单步调试JNI代码(方法2) #### 环境配置 为了能够有效地进行JNI代码的调试,首先需要确保以下环境已正确配置: - **ADT Bundle**: Eclipse版本为Juno - **NDK**: 版本r9 - **JDK**: 版本8 - **...

    在dev C++ 中如何单步调试程序

    首先,为了能够进行单步调试,我们需要确保编译器生成包含调试信息的可执行文件。在Dev C++中,这可以通过以下步骤实现: 1. 打开Dev C++,进入“Tools”菜单,选择“Compiler Options”(编译器选项)。 2. 在弹出...

    可在win vs下单步调试的SQLite

    网上大多数的使用vs2005编译sqlite是编译成为dll 我的目的是为了分析sqlite 所以还是编译成一个可执行程序方便单步调试 1 创建一个空的Win32 Console Application工程 2 sqlite3 6 23的所有源码均加入工程 除去以下...

    wxlua单步调试工具

    【标题】"wxlua单步调试工具"是一个专为Lua脚本语言设计的集成开发环境(IDE),它具有单步调试的功能,使得程序员能够更高效地调试和优化代码。wxLua是一个结合了wxWidgets库与Lua的绑定项目,旨在提供一个跨平台的...

    Win7/Win10 x64 中VC6 安装卡死、无法单步调试、调试退出进程没有结束

    在Windows 7或Windows 10 x64操作系统上,用户可能会遇到Visual C++ 6.0(简称VC6)安装过程中的各种问题,包括安装卡死、无法进行单步调试以及调试结束后进程未正常结束等。这些问题主要是由于系统兼容性、缺少组件...

    一种C语言级单步调试系统的功能实现方案.pdf

    单步调试是调试中的一种基本而重要的技术,它能够让开发者逐行执行程序代码,从而精确地跟踪程序执行流程,定位程序中的错误。在本文档中,我们讨论了一种针对C语言的单步调试系统功能的实现方案。以下详细描述了该...

    使用H-Jtag或Jlinkv7单步调试、RVDS 配置

    4. **进行调试:**完成以上步骤后,即可按照前述方法进行单步调试。 **总结:** 无论是使用H-Jtag还是Jlinkv7进行单步调试,都需要确保硬件连接正确无误,并遵循一定的配置流程。需要注意的是,在进行中断相关的...

Global site tag (gtag.js) - Google Analytics