Debugging
Logging运行输出来自一个运行应用的消息,展示它目前的状态。
当错误发生时,来自代码关系的部分的日志消息的(granularity)
可能不是足够的。新的日志消息能够插入到代码来展示更多关于目前
状态的消息但是它会降低这错误定位进程。使用一个debugger来观察
这应用程序的状态时错误定位的最有效的方式。通过GDB,Android NDk
支持本地的代码的调试。
本地代码应该本编译通过ndk-build命令,或者通过Eclipse
IDE使用使用安卓开发工具。在远程调试的建立进程期间,这
NDK建立系统将产生一系列的文件。
在AndroidManifest.xml文件中设置可以调试的通过android
:debuggeble属性。
这ndk-gdb脚本处理很多错误条件和输出错误信息来让你知道是否任何
这些条件还没有被满足。
调试Session建立
这ndk-gdb脚本在开发者的利益上启动调试会话,在调试会话建立期间
知道一系列事件发生,它对于理解在Android上的调试本地代码的片元
是非常有用的。这个完整的调试会话建立如下:
这ndk-gdb脚本通过使用应用程序管理器来启动目标应用程序。这个
应用程序管理器依赖对Zygote进程的请求。
Zygote也知道这“app process”,是当安卓系统boot的核心进程。
它在Android平台上的核心角色是启动Dalvik虚拟机和初始化所有的
核心安卓服务。作为一个手机操作系统,Android需要保持应用程序
的启动时间尽可能的小为了提供一个高质量的用户体验。为了达到这,
代替开启一个新的进程来自应用程序,Zygote仅仅依赖forking。在
计算中,forking克隆存在的进程。这新的进程也有与父进程相同的
内存端,通过所有的进程独立的执行。
在这是,应用程序被启动和执行代码。正如你所提到,这debug会话
并没有建立。
基于获得应用程序的进程ID,这ndk-gdb脚本在Andorid平台上开启
GDB和让它附加到这运行的应用程序。这ndk-gdb脚本配置端口使用ADB
来让GDB Server对于宿主机可以使用的。之后,拷贝Zygote的二进制文件
和共享的类库开始着GDB的客户端。在这二进制被拷贝,这ndk-gdb脚本
开启GDB客户和调试会话变得活动。在这之后,可以开启调试应用程序。
建立调试的例子:
为了看到本地调试的代码,你将使用hello-jni的实例项目。为了简化
调试进程,修改oncreate方法。
{
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("Call Native");
button.setOnClickListener(new OnClickListener() {
public void onClick(View button) {
((Button) button).setText(stringFromJNI());
}
});
setContentView(button);
}
开启调试
调试本地代码通过命令行和Eclipse。这一部分将会展示两种方法。
对于Windows用户的修订
在window平台上,在Andorid NDK有一个bug,阻止这GDB定位二进制。
这ndk-gdb脚本配置GDB可以使用一个GDB脚本文件。在Window平台上,
这个脚本文件通过额外的返回来产生,引发了这个问题。
为了修订它,使用Eclipse,打开着<ANDROID_NDK_HOME>/ndk-gdb脚本
在编辑视图中。到文件的结束,和增加修改如下:
#Fix the line endings.
sed -i 's/\r\r//' 'native_path $GDBSETUP'
$GDBCLIENT -x 'native_path $GDBSETUP'
使用Eclipse
像运行应用程序,Eclipse需要有一个debug配置被定义为了建立一个
debug会话。
1.run-》debug configuration
2.选择,Android Native Application
3.在对话工具bar上旋转着新配置。
4.浏览按钮旋转目前项目。
5.单击应用按钮来存储debug配置。
6.选择debug配置对话框和返回到Eclipse 工作空间。
1.打开hllo-jni.c源文件在编辑视图
2.定位本地方法,和右键在标记区域,编辑视图的左边框。
3.正如,选择从上下文菜单来放在一个断点。一个蓝色的点
被放到了标记bar行来指示断点。
4.现在断点被放在了,使用top的菜单栏,选择run-》debug
Configuration 来启动Debug配置对话。
5.选择debug配置
6.点击debug按钮
7.Eclipse支持不同的视图,workbench布局,对于不同的任务。
基于点击调试按钮,Eclipse将会问你是否将转到调试视图,点击
Yes进行。
当本地代码触发断点,这应用程序停止和对调试器一下控制,如下:
这个debug视图给了本地代码的目前状态的简图。在上面的左面,这
Debug视图展示了运行的线程的列表和他们正在运行的功能。在右上角,
这个变量视图给可以获得本地变量的视图和让你监视目前的值。在中
间空间,这本地源代码本展示在Editor视图,和一个箭头展示在marker
条靠近被执行的行。如下:
通过debug工具条下面的动作被提供:
Skip All Breakpoints:使所有的断点失效
Resum:继续执行本地代码知道下一个断点。
Suspend:通过发送SIGINT阻止信号到进程阻止本地代码的执行,
允许你查看着本地代码的目前状态。
Step Into:接下来的本地调用,进入执行
Step Over:执行下一个native函数和然后停止。
Step Return:执行知道本地函数的返回。
Terminate:终止debug会话。
命令行
使用ndk-gdb脚本本地代码被调试。目前这ndk-gdb脚本需要一个UNIX
shell来运行。在windows平台,你将使用Cygwin代替debugging的命令。
首先,打开Cygwin或者widow终端,基于你的平台。将使用hello-jni
例子项目。
1.确保这Eclipse不在执行为了阻止任何冲突
2.改变目前目录到这hello-jni项目目录。
3.从Eclipse删除左面任何文件通过 rm -rf bin obj libs;
4.编译本地模块通过使用ndk-build在命令行。
5.为了编译和打包应用程序,确保这ANT建立脚本build.xml
文件。如果这是第一次你正在奖励这个项目从命令行,
update project -p 来产生必要的建立文件。如果用Cygwin,
使用android.bat代替android。
6.编译和打包项目在debug模式通过询问ant debug在命令行。
7.发布应用程序到设备或者通过询问ant installd命令到模拟器。
8.默认,这ndk-gdb脚本询问一个已经存在的运行应用程序;然而,
你能够是一个这--start或者--launch=<activity>参数来自动
开启应用程序在debugging会话前。开启debugging会话通过
ndk -gdb --start来自命令行。当GDB成功的附加到这hello-
jni应用程序,它将gdb优先。
9.增加一个断点到hello-jni.c源文件在30行通过使用 b hello
-jni.c在GDB。
10.现在定义了断点,在GDB询问c来继续着本地应用程序的执行
11.使用Android设备或者模拟器,点击本地调用来触发本地函数。
使用GDB命令:
有一个有用的GDB命令列表,能够通过GDB来调试这本地代码:
break:放置一个断点到指定位置。这个位置可能是一个函数名,或者
一个文件名和一个文件的行号。
enable/disable/delete <#>:Enable ,disables,或者删除断点。
clear:清除所有的断点。
next:跳转到下一条命令
continue:继续执行本地代码
backtrace:表明这调用的栈。
backtrace all:表明所有调用的栈包括在每个帧的局部变量。
等详细命令www.gnu.org/software/gdb/documentation/
Logging运行输出来自一个运行应用的消息,展示它目前的状态。
当错误发生时,来自代码关系的部分的日志消息的(granularity)
可能不是足够的。新的日志消息能够插入到代码来展示更多关于目前
状态的消息但是它会降低这错误定位进程。使用一个debugger来观察
这应用程序的状态时错误定位的最有效的方式。通过GDB,Android NDk
支持本地的代码的调试。
本地代码应该本编译通过ndk-build命令,或者通过Eclipse
IDE使用使用安卓开发工具。在远程调试的建立进程期间,这
NDK建立系统将产生一系列的文件。
在AndroidManifest.xml文件中设置可以调试的通过android
:debuggeble属性。
这ndk-gdb脚本处理很多错误条件和输出错误信息来让你知道是否任何
这些条件还没有被满足。
调试Session建立
这ndk-gdb脚本在开发者的利益上启动调试会话,在调试会话建立期间
知道一系列事件发生,它对于理解在Android上的调试本地代码的片元
是非常有用的。这个完整的调试会话建立如下:
这ndk-gdb脚本通过使用应用程序管理器来启动目标应用程序。这个
应用程序管理器依赖对Zygote进程的请求。
Zygote也知道这“app process”,是当安卓系统boot的核心进程。
它在Android平台上的核心角色是启动Dalvik虚拟机和初始化所有的
核心安卓服务。作为一个手机操作系统,Android需要保持应用程序
的启动时间尽可能的小为了提供一个高质量的用户体验。为了达到这,
代替开启一个新的进程来自应用程序,Zygote仅仅依赖forking。在
计算中,forking克隆存在的进程。这新的进程也有与父进程相同的
内存端,通过所有的进程独立的执行。
在这是,应用程序被启动和执行代码。正如你所提到,这debug会话
并没有建立。
基于获得应用程序的进程ID,这ndk-gdb脚本在Andorid平台上开启
GDB和让它附加到这运行的应用程序。这ndk-gdb脚本配置端口使用ADB
来让GDB Server对于宿主机可以使用的。之后,拷贝Zygote的二进制文件
和共享的类库开始着GDB的客户端。在这二进制被拷贝,这ndk-gdb脚本
开启GDB客户和调试会话变得活动。在这之后,可以开启调试应用程序。
建立调试的例子:
为了看到本地调试的代码,你将使用hello-jni的实例项目。为了简化
调试进程,修改oncreate方法。
{
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("Call Native");
button.setOnClickListener(new OnClickListener() {
public void onClick(View button) {
((Button) button).setText(stringFromJNI());
}
});
setContentView(button);
}
开启调试
调试本地代码通过命令行和Eclipse。这一部分将会展示两种方法。
对于Windows用户的修订
在window平台上,在Andorid NDK有一个bug,阻止这GDB定位二进制。
这ndk-gdb脚本配置GDB可以使用一个GDB脚本文件。在Window平台上,
这个脚本文件通过额外的返回来产生,引发了这个问题。
为了修订它,使用Eclipse,打开着<ANDROID_NDK_HOME>/ndk-gdb脚本
在编辑视图中。到文件的结束,和增加修改如下:
#Fix the line endings.
sed -i 's/\r\r//' 'native_path $GDBSETUP'
$GDBCLIENT -x 'native_path $GDBSETUP'
使用Eclipse
像运行应用程序,Eclipse需要有一个debug配置被定义为了建立一个
debug会话。
1.run-》debug configuration
2.选择,Android Native Application
3.在对话工具bar上旋转着新配置。
4.浏览按钮旋转目前项目。
5.单击应用按钮来存储debug配置。
6.选择debug配置对话框和返回到Eclipse 工作空间。
1.打开hllo-jni.c源文件在编辑视图
2.定位本地方法,和右键在标记区域,编辑视图的左边框。
3.正如,选择从上下文菜单来放在一个断点。一个蓝色的点
被放到了标记bar行来指示断点。
4.现在断点被放在了,使用top的菜单栏,选择run-》debug
Configuration 来启动Debug配置对话。
5.选择debug配置
6.点击debug按钮
7.Eclipse支持不同的视图,workbench布局,对于不同的任务。
基于点击调试按钮,Eclipse将会问你是否将转到调试视图,点击
Yes进行。
当本地代码触发断点,这应用程序停止和对调试器一下控制,如下:
这个debug视图给了本地代码的目前状态的简图。在上面的左面,这
Debug视图展示了运行的线程的列表和他们正在运行的功能。在右上角,
这个变量视图给可以获得本地变量的视图和让你监视目前的值。在中
间空间,这本地源代码本展示在Editor视图,和一个箭头展示在marker
条靠近被执行的行。如下:
通过debug工具条下面的动作被提供:
Skip All Breakpoints:使所有的断点失效
Resum:继续执行本地代码知道下一个断点。
Suspend:通过发送SIGINT阻止信号到进程阻止本地代码的执行,
允许你查看着本地代码的目前状态。
Step Into:接下来的本地调用,进入执行
Step Over:执行下一个native函数和然后停止。
Step Return:执行知道本地函数的返回。
Terminate:终止debug会话。
命令行
使用ndk-gdb脚本本地代码被调试。目前这ndk-gdb脚本需要一个UNIX
shell来运行。在windows平台,你将使用Cygwin代替debugging的命令。
首先,打开Cygwin或者widow终端,基于你的平台。将使用hello-jni
例子项目。
1.确保这Eclipse不在执行为了阻止任何冲突
2.改变目前目录到这hello-jni项目目录。
3.从Eclipse删除左面任何文件通过 rm -rf bin obj libs;
4.编译本地模块通过使用ndk-build在命令行。
5.为了编译和打包应用程序,确保这ANT建立脚本build.xml
文件。如果这是第一次你正在奖励这个项目从命令行,
update project -p 来产生必要的建立文件。如果用Cygwin,
使用android.bat代替android。
6.编译和打包项目在debug模式通过询问ant debug在命令行。
7.发布应用程序到设备或者通过询问ant installd命令到模拟器。
8.默认,这ndk-gdb脚本询问一个已经存在的运行应用程序;然而,
你能够是一个这--start或者--launch=<activity>参数来自动
开启应用程序在debugging会话前。开启debugging会话通过
ndk -gdb --start来自命令行。当GDB成功的附加到这hello-
jni应用程序,它将gdb优先。
9.增加一个断点到hello-jni.c源文件在30行通过使用 b hello
-jni.c在GDB。
10.现在定义了断点,在GDB询问c来继续着本地应用程序的执行
11.使用Android设备或者模拟器,点击本地调用来触发本地函数。
使用GDB命令:
有一个有用的GDB命令列表,能够通过GDB来调试这本地代码:
break:放置一个断点到指定位置。这个位置可能是一个函数名,或者
一个文件名和一个文件的行号。
enable/disable/delete <#>:Enable ,disables,或者删除断点。
clear:清除所有的断点。
next:跳转到下一条命令
continue:继续执行本地代码
backtrace:表明这调用的栈。
backtrace all:表明所有调用的栈包括在每个帧的局部变量。
等详细命令www.gnu.org/software/gdb/documentation/