android NDK开发在本地C/C++源码中设置断点单步调试具体教程
近期在学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++源码中设置断点单步调试具体教程的更多相关文章
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
分类: Android 系统开发(5) 作者同类文章X 版权声明:本文为博主原创文章 ...
- MFC源码不能设置断点调试
用VS2013中MFC开发应用程序时,进入MFC源码设置断点调试.但是在调试过程中发现无法进入源码.最后发现在MFC设置的MFC的使用默认值是在共享dll中使用MFC,这就意味着MFC中的源码并没有连 ...
- windows下用ADT进行android NDK开发的具体教程(从环境搭建、配置到编译全过程)
郑重申明:如需转载本博客,请注明出处,谢谢! 这几天在学习android NDK的开发.那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Ki ...
- Android NDK开发入门实例
AndroidNDK是能使Android应用开发者把从c/c++编译而来的本地代码嵌入到应用包中的一系列工具的组合. 注意: AndroidNDK只能用于Android1.5及以上版本中. I. An ...
- vlc源码分析(七) 调试学习HLS协议
HTTP Live Streaming(HLS)是苹果公司提出来的流媒体传输协议.与RTP协议不同的是,HLS可以穿透某些允许HTTP协议通过的防火墙. 一.HLS播放模式 (1) 点播模式(Vide ...
- Android NDK 开发(二) -- 从Hlello World学起【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41805719 上篇文章讲述了Android NDK开发的一些基本概念,以及NDK ...
- android NDK开发环境搭建
android NDK开发环境搭建 2012-05-14 00:13:58 分类: 嵌入式 基于 Android NDK 的学习之旅-----环境搭建 工欲善其事必先利其器 , 下面介绍下 Eclip ...
- Android NDK 开发(四)java传递数据到C【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处 ...
- Android NDK 开发(三)--常见错误锦集合Log的使用【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511 Android NDK开发经常因某些因素会出现一些意想不到的错误, ...
随机推荐
- promise 小抄
catch的用法 我们知道Promise对象除了then方法,还有一个catch方法,它是做什么用的呢?其实它和then的第二个参数一样,用来指定reject的回调,用法是这样: getNumber( ...
- mysql中判断记录是否存在方法
以下这个方法是我推荐的. sql语句:select 1 from tablename where col = col limit 1; 然后读取语句执行所影响的行数. 当然这里limit 1很重要.这 ...
- 【百度之星】-IP聚合
问题描述: Problem Description 当今世界,网络已经无处不在了,小度熊由于犯了错误,当上了度度公司的网络管理员,他手上有大量的 IP列表,小度熊想知道在某个固定的子网掩码下,有多少个 ...
- FFmpeg编译Android版本
FFmpeg是很好用的一个音视频库,功能强大,但是用起来并不是很方便.之前一直不想用FFmpeg,因为感觉编译太麻烦,但是到了不得不用的时候了,没办法,参考了网上大神的方法,在这里自己也记录一下方便以 ...
- html5——多媒体(四)
全屏兼容 box.requestFullscreen(); box.webkitRequestFullScreen(); box.mozRequestFullScreen(); <!DOCTYP ...
- CSS之float浮动
CSS理解之float浮动 首先我们看看W3C给出的关于 float 的说明: 参考资料 MDN W3C
- HyperLink的使用
<asp:HyperLink ID="Hyperlink2" NavigateUrl='<%# string.Format("AddOrganizition. ...
- react typescript 子组件调用父组件
//父组件 import * as React from 'react'import { Input } from 'antd'const Search = Input.Searchimport &q ...
- [系统资源攻略]CPU
linux系统中如何查看cpu信息? 查看linux版本.cpu.位数.内核.内存等信息 linux下查看CPU,内存,机器型号,网卡等信息的方法 查看服务器物理CPU数和CPU核数方法介绍 可以用/ ...
- C C++ POSIX 的一些 IO 操作
一些 C C++ POSIX 的 IO 操作总结 文件-内存之间 内存-内存之间 POSIX 有无缓冲的 IO 操作 对文件的操作,读文件至内存,从内存写至文件 // 读文件至内存buf中 void ...