Debugging

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/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值