NDK官方开发指南翻译之 NDK_GDB


这几天看JNI,没有基础,那真是难受……把看到的相关资料记录一下,也分享给初学者。

‘ndk-gdb’ Overview

重要:如果你要调试线程相关的程序,请阅读下面的‘Thread Support’部分。

1.用法:

-------------

Android r4引入了一个叫着‘ndk-gdb’的脚本,能够非常简单的为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>:

指定应用程序的工程所在目录。如果你不想cd到你工程的目录中,这个选项是比较有用的。

--port=<port>

默认情况下,ndk-gdb使用本地TCP端口5039连接到debugged的应用程序。通过使用不同的端口,在同一台开发机器中,可以在不同的设备/模拟器上运行调试程序。

--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.

时间: 2024-10-17 19:26:10

NDK官方开发指南翻译之 NDK_GDB的相关文章

Angularjs中文版本开发指南发布

Angularjs中文版本开发指南发布 2014-02-16 15:49 by 破狼, 29069 阅读, 9 评论, 收藏,  编辑 从本人开始在写关于Angularjs的文章开始,也算是见证了Angularjs在国内慢慢的火起来,如今的Angularjs正式如日中天.想知道为什么Angularjs会这么火,请移步angularjs移除不必要的$watch. 也是一次偶然的机会,在Angular.js中文社区群里相遇一群Angular的爱好者,在一次巧妙的交谈,大家对于Angular官方的Gu

WatchKit-Programming-Guide-Apple-Watch开发指南官方翻译及总结

鉴于CSDN的Markdown很多bug,大家请看这里: WatchKit-Programming-Guide-Apple-Watch开发指南官方翻译及总结 Overview ### Developing for Apple Watch Apple Watch可以让用户以一种很私密,不招摇的样式查看信息(官方文档是这样的哈,但是我想大多数人不会不招摇的查看Apple Watch上的信息??).用户可以在不拿出手机的情况下,通过查看Apple Watch快速的获取重要的信息. Apple Watc

JNI/NDK开发指南(八)——调用构造方法和父类实例方法

转载请注明出处:http://blog.csdn.net/xyang81/article/details/44002089 在第6章我们学习到了在Native层如何调用Java静态方法和实例方法,其中调用实例方法的示例代码中也提到了调用构造函数来实始化一个对象,但没有详细介绍,一带而过了.还没有阅读过的同学请移步<JNI/NDK开发指南(六)--C/C++访问Java实例方法和静态方法>阅读.这章详细来介绍下初始一个对象的两种方式,以及如何调用子类对象重写的父类实例方法. 我们先回过一下,在J

JNI/NDK开发指南(五)——访问数组(基本类型数组与对象数组)

转载请注明出处:http://blog.csdn.net/xyang81/article/details/42346165 JNI中的数组分为基本类型数组和对象数组,它们的处理方式是不一样的,基本类型数组中的所有元素都是JNI的基本数据类型,可以直接访问.而对象数组中的所有元素是一个类的实例或其它数组的引用,和字符串操作一样,不能直接访问Java传递给JNI层的数组,必须选择合适的JNI函数来访问和设置Java层的数组对象.阅读此文假设你已经了解了JNI与Java数据类型的映射关系,如果还不了解

Boost程序库完全开发指南——深入C++“准”标准库(第3版)

内容简介  · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Boost 社区开发并维护,使用了许多现代C++编程技术,内容涵盖字符串处理.正则表达式.容器与数据结构.并发编程.函数式编程.泛型编程.设计模式实现等许多领域,极大地丰富了C++的功能和表现力,能够使C++软件开发更加简捷.优雅.灵活和高效. <Boost程序库完全开发指南——深入C++“准”标准库(

[转帖]cocos2d-x 3.0rc开发指南:Windows下Android环境搭建

原文请看:http://blog.csdn.net/linzhengqun/article/details/21663341 鲜红字体请注意:文中红色字体乃是本文博主阳光下的蒲公英添加.红色字体部分造成的问题,本博主一概不负任何责任.其他字体的责任由原文作者负责.(本文博主是不是特别无节操了呢....O(∩_∩)O哈哈哈~) 安装工具 1. 配置JDK JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.ht

Knockout应用开发指南

第一章:入门 1.Knockout简介 (Introduction) Knockout是一个轻量级的UI类库,通过应用MVVM模式使JavaScript前端UI简单化. Knockout有如下4大重要概念: 声明式绑定 (Declarative Bindings):使用简明易读的语法很容易地将模型(model)数据关联到DOM元素上. UI界面自动刷新 (Automatic UI Refresh):当您的模型状态(model state)改变时,您的UI界面将自动更新. 依赖跟踪 (Depend

移动应用安全开发指南(Android)--完结篇(http://www.bubuko.com/infodetail-577312.html)

1.认证和授权 概述 认证是用来证明用户身份合法性的过程,授权是用来证明用户可以合法地做哪些事的过程,这两个过程一般是在服务器端执行的,但也有的APP出于性能提升或用户体验等原因,将其做在客户端完成,由此导致客户端绕过等问题. 安全准则 在客户端做认证和授权是很难保证安全的,所以应该把认证和授权做在服务器端.如果确实有特殊的需求,可以和安全工程师进行沟通做单一case分析. 尽可能避免在设备上存储用户名和密码,可以使用登录认证后获得的token进行鉴权(同时注意控制token的有效期). 详细描

AngularJS开发指南7:AngularJS本地化,国际化,以及兼容IE低版本浏览器

AngularJS本地化,国际化 国际化,简写为i18n,指的是使产品快速适应不同语言和文化. 本地化,简称l10n,是指使产品在特定文化和语言市场中可用. 对开发者来说,国际化一个应用意味着将所有的文字和其他因地区而异的数据从应用中抽离出来. 本地化意味着为这些抽离的数据和文字提供翻译和转变成本地的格式. 目前,AngularJS支持日期,数字和货币的国际化和本地化. 另外,AngularJS还通过ngPluralize指令支持本地多元化. 所有的AngularJS本地化组件都依赖于$loca