Eclipse 调试器 零距离接触实战技巧
eclipse 平台的最大特色是插件化(plugin)。调试是任何程序员都无法回避的工作。因此eclipse的内置插件java开发工具包(java development toolkit,简称jdt)中集成了一个功能强大的java调试器(debugger)。实际上,jdt是eclipse工作平台(eclipse platform workbench)的基础工具,除了调试器,还提供透视图、视图、编辑器、搜索等eclipse基础功能。
由于eclipse调试器采用了基于客户端/服务器的设计模式,远程应用的调试变得与本地一样简单。其工作原理是,本地eclipse工作平台充当调试的客户端,而远程应用所在的机器则充当了调试服务器的角色。
debug 视图
debug视图作为eclipse调试器透视图的一部分,管理与程序调试相关的功能。如图所示,debug视图呈树状结构,每一个线程对应一树节点。图中显示的是暂挂线程main的调试堆栈帧结构。
作为标准的java调试平台,debug视图提供了许多执行控制命令(execution control commands),用于在程序中设置/取消断点,单步执行,暂挂与恢复线程。以下是一些常用的执行控制命令:
1. layout布局
debug视图的布局与断点调试等主体功能相比,显得并不那么乍眼,因此也常被人忽略,不过eclipse的魅力之一就是它的细节做的特别完美。我们简单介绍一下debug视图布局的特点,如图所示。
第一个特点是automatic功能。选择菜单选项layout -> automatic,可以实现debug视图在树状模式与breadrumb模式之间的自动互换。相信很多编程人员都喜欢breadrumb模式,向面包片一样,一层一层的,直观,醒目。
layout菜单的第二个特点breadrumb模式。选择菜单选项layout -> breadcrumb,打开breadrumb模式。除此之外,选择菜单选项layout -> auto-expand breadcrumb,可实现自动展开breadrumb模式。当选择下拉框时,可自动定位到暂挂线程的调试堆栈帧。这个细节对于编程人员来说,也是非常 的方便。
2. 调试启动停止等相关命令
debug视图提供了诸多的启停控制命令,叫法上与其它的调试器可能稍微有些不同,具体如下:
启动调试视图:eclipse提供三种方式来启动程序(launch)的调试,分别是通过菜单(run –> debug)、图标(“绿色臭虫”)以及快捷键(f11),在这一点上,与其他命令(例如run)类似。
停止调试:eclipse通过terminate命令终止对本地程序的调试。特别的,对于远程程序的调试,eclipse使用 disconnect命令来终止与远程jvm的socket连接。前面我们谈到,eclipse调试器采用了基于客户端/服务器的设计模式,本地 eclipse工作平台充当调试的客户端,而远程应用所在的jvm则充当了调试服务器的角色。简单的说,terminate命令终止本地调 试,disconnect命令终止远程调试。terminate/disconnect all终止所有的调试,包括本地与远程。
重新启动调试:eclipse通过relaunch命令重新启动调试。这里需要指出的是relaunch支持两种重启动模式,一种是针对已经停止的程序调 试,另一种是针对active的当程序调试。前者不难理解,效果上等同于terminate+launch。后者的处理方式有些不同,效果上则等同于 launch一个新的debug项。实际上,针对后一种情况,我们通常采用eclipse的terminate and relaunch命令来达到重启debug的目的。
删除调试项:eclipse支持针对多个程序的调试。我们称每一项对应一个debug item。remove命令将某一个debug item从当前的debug视图中删除。不过,remove命令只适用于已停止的debug item,而对于运行中的debug item,eclipse提供了terminate and remove命令。假如想停止并清除所有的debug item,则可以通过terminate and remove all命令。此外,eclipse还提供了copy stack命令或者快捷键ctr+c,可将调试堆栈帧内容拷贝至剪贴板中,这样效果上就等同于“撤销”。
以上这些命令虽然有些琐碎,但是非常能反映eclipse对细节的把握与控制。
3. 单步执行
相信任何调试人员对单步调试非常的熟悉。eclipse提供step into、step over、 step return三个命令来支持单步调试。三者的具体区别是:step into(快捷键f5)就是单步执行,遇到子函数就进入并且继续单步执行;step over(快捷键f6)是在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。 step return(快捷键f7)就是单步执行到子函数内时,用step return就可以执行完子函数余下部分,并返回到上一层函数。说的通俗点就是,step into:进入子函数,step over:越过子函数,但子函数会执行,step return:跳出子函数。
此外,eclipse还提供了run to line(快捷键ctr + r)功能,从开始处运行程序,到正在执行的断点暂停。
4. drop to frame
drop to frame功能虽然不属于单步调试的核心,但是该功能非常的适用,它为调试人员提供了调试回退的机会。drop to frame可以重新跳到当前方法的开始处重新执行,并且所有上下文变量的值也相应回到初始时刻,如图所示。
5. step filters
当在你调试的时候,你只希望查看自己的代码,而不是从jdk或者是其他库中的代码,甚至是你也想屏蔽自己代码库中的框架部分代码。
针对这样的需求,eclipse提供了逐步过滤器(step filters)选项指的是一直执行直到遇到未经过滤的位置或断点。step filters功能由use step filters,edit step filters,filter type,filter package四项组成。
具体操作如下:
步骤 1: windows -> preferences -> java -> debug -> step filtering.
步骤 2:选择‘use step filters’.
步骤 3:在屏幕上选中所需的选项。你可以添加你自己代码库中的部分代码。
步骤 4:点击‘apply’.
原理上,edit step filter命令用于配置step filter规则,而filter type与filter package分别指的是过滤的java类型与java package,如图所示。
6. 声明选项
open declared type命令会打开当前调试堆栈帧的类型声明编辑器。而open declared type hierarchy则展现的是完整的层次结构,如图所示。
7. 线程的暂挂/恢复
eclipse通过suspend与resume来支持线程的暂挂与恢复。一般来讲,suspend适用于多线程程序的调试,当需要查看某一个线程的堆栈 帧及变量值时,我们可以通过suspend命令将该线程暂挂。resume用于恢复。有两种resume需要注意:第一是当在调试过程中修改程序代码,然 后保存,点击resume,此时程序会暂挂于断点。第二是当程序抛出异常时,运行resume,程序也会暂挂于断点。
8. show monitor命令
show monitor命令可实时显示变量的值。举个例子,我们写一个简单的helloworld程序。
以下是代码片段:
/**
* hello world
*/
public class helloworld {
public static void main(string[] args) {
line 11: object mutex = new object();
synchronized (mutex) {
system.out.println("hello world!");
}
}
}
如图所示,show monitor对应的监视信息会以“钥匙”的形式出现在当前stack frame前面。当前信号量的id为16。
上一篇: 无线认证提示“设备所有权密码”的解决方案