NDK官方开发指南翻译之 NDK_GDB
这几天看JNI,没有基础,那真是难受……把看到的相关资料记录一下,也分享给刚開始学习的人。 ‘ndk-gdb’ Overview
重要:假设你要调试线程相关的程序。请阅读以下的‘Thread Support’部分。
1.使用方法:
-------------
Android r4引入了一个叫着‘ndk-gdb’的脚本。可以很easy的为NDK生成的机器码启动一个debugsession。
这个脚本位于NDK的顶层文件夹下,它必须从你应用程序的文件夹或者子文件夹下。用命令行的方式来调用。比如:
cd $PROJECT
$NDK/ndk-gdb
$NDK指向你NDK的安装路径。你能够创建一个别名或者把$NDK增加到你的环境变量PATH中,这样能够避免每次都要输入完整的路径名。
重要:本地调试仅仅有在下面全部条件都满足时才干工作:
1.你的应用程序必须用‘ndk-build’脚本编译。
用之前的方式‘make APP=<name>’编译,NDK是不支持的。
2.你的应用程序必须是可调试的:
换句话说,AndroidManifest.xml的<application>必须设置android:debuggable为true。
3. 你的应用程序必须执行在Android 2.2或者更高的版本号中:
ndk-gdb执行在Android 2.2版本号之前是不行的。
这并不意味着。你的应用程序的目标API必须是2.2+。仅仅是debugging
session仅仅能执行在2.2+的设备或者模拟器上。
很很很重要!!
假设你使用Eclipse ADT插件编译应用程序,必须确保使用0.9.7或之后的版本号。
假设你使用‘ant’编译工具,必须确保使用的是SDK平台组件的最新版本号。
以下是最低版本号的要求:
Android 1.5 r4
Android1.6 r3
Android2.1 r2
Android2.2 r1
这些都能够通过SDK的更新来获得。
假设这些条件不满足,生成的apk将不会包括必要的支持文件,本地调试将不能工作。
假设发现了问题。‘ndk-gdb’会处理很多错误情况和存储错误信息。比如:
-检查adb是否在你的path中。
-检查你的应用程序在manifest中是否声明了debuggable。
-检查设备上已经安装的具有同样包名的应用程序是否是可调试的。
默认情况下,ndk-gdb会搜索已经正在执行的应用程序进程,假设没有找到的话会报错。可是你能够在启动debugging session之前,使用--start或--launch=<name>选项来自己主动启动activity。
当gdb成功attach到你应用程序的进程中,在session建立后,ndk-gdb会有一个GDB提示:在生成的本地库中查找源文件和symbol/debug
versions。
你能够用‘b <location>’设置断点,用‘c’(continue)继续运行。很多其它的命令请查看GDB手冊。
重要:当退出GBD提示。应用程序的调试进程就会停止!这是gdb的一个限制。
重要:当gdb找不到系统库(如libc.so, libstdc++.so, liblog.so, libcutils.so等)的时候,GDB停止退出前。会列出一长串的错误信息。
这是正常的。由于在你的开发机器上,没有这些库的symbol/debug versions来相应你的目标设备。
你能够安全的忽略这些信息。
2. 选项:
------------
你能够用‘ndk-gdb --help’命令列出这些选项:
--verbose:
打印native debuggingsession启动时的具体信息。
当你不能连接、ndk-gdb打印的错误信息不够的时候,才须要它来调试问题。
--force:
默认情况下,假设发现另外一个nativedebugging session执行在同一台设备上。ndk-gdb会崩溃。使用--force会kill掉那个session,然后启动一个新的session替换它。
注意调试的程序不会被kill,将会再一次stopped。
--start:
默认情况下。ndk-gdb会试图attach到一个正在执行的应用程序的实例上。你能够在debugging sessiong之前,使用--start来显示的启动你的应用程序。
注意:这个选项会启动manifest中第一个launchable的activity,使用--launch=<name>能够启动其它的activity。 --launch-list能够列出全部这种activity。
--launch=<name>:
除了能够启动指定的activity外。其它的和start类似。
假设你的manifest定义了非常多launchable的activity,这个选项是比較实用的。
--launch-list:
列出manifest中全部launchable的activity。使用--start时。第一个launchable的activity被启动。
--project=<path>:
指定应用程序的project所在文件夹。假设你不想cd到你project的文件夹中,这个选项是比較实用的。
--port=<port>
默认情况下,ndk-gdb使用本地TCPport5039连接到debugged的应用程序。通过使用不同的port。在同一台开发机器中。能够在不同的设备/模拟器上执行调试程序。
--adb=<file>:
假设不在你的path中,能够指定adb工具的路径。
-d,-e,-s <serial>
这些标志和ADB类似。能够处理多台设备/模拟器连接到你机器上的情况。
-d:连接到一个单独的物理设备
-e:连接到一个单独的模拟
-s:连接到<serial>指定的真机或者模拟器,<serial>是用‘adb
devices’命令列出的设备 的名称。
你也能够定义ADB_SERIAL环境变量来指定你的设备。不须要使用这个选项。
--exec=<file>:
-x<file>:
连接到调试进程后,会执行在<file>文件里找到的GDB初始化命令。当你要做一些反复的事情,这是很实用的。比如建立一序列的断点,然后自己主动恢复执行。
3.必要条件
---------------------
眼下‘ndk-gdb’须要执行在Unix shell上。这意味着在Windows系统中必须执行在Cygwin上。我们希望在以后的NDK版本号中可以摆脱这个限制。
NDK的其它要求:比如 GNU Make3.81或更高版本号。
4. 线程支持:
------------------
假设你的应用程序执行在Android 2.3之前。ndk-gdb不能正确的调试本地线程,debug的时候仅仅能把断点打在主线程中,全然会忽略其它线程的执行。
造成这个问题的最初原因是非常复杂的。本质上是在这个平台上不幸有一个bug,而这个是近期才发现的。
执行时。NDK自带的gdbserver二进制文件有特殊的代码来检測这个条件,而且会自己主动调整它的行为(换句话说,当编译代码的时候。你不须要不论什么的特殊操作)。
这意味着在实践中:
- 假设你执行在Android 2.3。或者2.3之前的平台可是已经修复了这个bug。你能够自己主动的调试本地线程。
- 假设不是。你仅仅能在主线程中调试(像前面所说的)。当启动ndk-gdb(在gdb prompt之前)。你会看到以下的信息:
Thread debugging is unsupported on this Android platform!
假设你在非主线程中运行的函数打了断点,程序会退出。同一时候GDB会输出下面信息:
Program terminated with signal SIGTRAP, Trace/breakpoint trap.
The program no longer exists.
NDK官方开发指南翻译之 NDK_GDB的更多相关文章
- Quartz.net官方开发指南系列篇
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...
- Quartz.net官方开发指南[转]
http://www.cnblogs.com/shanyou/category/102991.html
- Angularjs中文版本开发指南发布
从本人开始在写关于Angularjs的文章开始,也算是见证了Angularjs在国内慢慢的火起来,如今的Angularjs正式如日中天.想知道为什么Angularjs会这么火,请移步angularjs ...
- [翻译]现代java开发指南 第一部分
现代java开发指南 第一部分 第一部分:Java已不是你父亲那一代的样子 第一部分,第二部分 =================== 与历史上任何其他的语言相比,这里要排除c语言和cobol语言,现 ...
- protocol buffer开发指南(官方)
欢迎来到protocol buffer的开发者指南文档,一种语言无关.平台无关.扩展性好的用于通信协议.数据存储的结构化数据序列化方法. 本文档是面向计划将protocol buffer使用的到自己的 ...
- [翻译]现代java开发指南 第二部分
现代java开发指南 第二部分 第二部分:部署.监控 & 管理,性能分析和基准测试 第一部分,第二部分 =================== 欢迎来到现代 Java 开发指南第二部分.在第一 ...
- [翻译]现代java开发指南 第三部分
现代java开发指南 第三部分 第三部分:Web开发 第一部分,第二部分,第三部分 =========================== 欢迎来到现代 Java 开发指南第三部分.在第一部分中,我们 ...
- Libgdx 开发指南——目录
本系列文档选译自libgdx github项目 wiki : https://github.com/libgdx/libgdx/wiki 由于关于Libgdx的中文文档非常稀缺,因此在这里对官方Wik ...
- Knockout应用开发指南(完整版) 目录索引
http://learn.knockoutjs.com/ 所有示例和代码都在在上面直接运行预览 注意:因为它用了google的cdn加速,所要要用代_理+_翻_墙才能正常加载 使用Knockout有 ...
随机推荐
- [ Python - 5 ] 通过random模块生成随机字符串
import random checkcode = '' for i in range(4): if i == random.randint(0,3): current = chr(random.ra ...
- AC日记——【清华集训2014】奇数国 uoj 38
#38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘 ...
- 使用 gulp 压缩 CSS
请务必理解如下章节后阅读此章节: 安装 Node 和 gulp 使用 gulp 压缩 JS 压缩 css 代码可降低 css 文件大小,提高页面打开速度. 我们接着将规律转换为 gulp 代码 规律 ...
- centos系统设置局域网静态IP
---恢复内容开始--- centos系统设置局域网静态IP 很多时候,我们并不希望漏油器重启之后,自己的服务器动态的获取IP,这样很不利,因为你可能装了mysql,redis,等软件,然后需要远程去 ...
- Windows下python的第三方库的安装
D:\Python27\Scripts\pip.exe install beautifulsoup4
- python 面向对象(成员,静态,类)的(变量,方法)区别
静态方法是使用@staticmethod装饰的方法,并且参数表中不需要self或者cls,可以访问类成员变量 默认的方法是有self的,是成员方法,可以访问私有变量和方法(通过self.xxx),或者 ...
- HDU 4528 小明系列故事――捉迷藏
广搜. 根据题意,可以知道状态总共有$4*n*m$种.每一个位置四种状态:两个都没有发现:发现$E$没发现$D$:发现$D$没发现$E$:两个都发现. 每次移动的花费都是$1$,队列里面状态的费用是单 ...
- 线段树【CF620E】The Child and Sequence
Description At the children's day, the child came to Picks's house, and messed his house up. Picks w ...
- 找礼物(find)(模拟)
找礼物(find) 时间限制: 1 Sec 内存限制: 64 MB提交: 57 解决: 4[提交][状态][讨论版] 题目描述 新 年到了,你的好友和你(共K个人)的周围满是礼物,你让你的好友先拿 ...
- 读《thinking in java》第一遍笔记
1.System.out.println(variable)为什么会调用重写的toString方法? 根据我搜到的信息结合源代码,得到以下结论,如有误请告知. 首先我们看一下println方法的源代码 ...