调试的方法虽然千千万万,但归根结底,就是找到引起错误的代码。Eclipse调试器的目标是让程序员能对本地或远程程序进行错误侦测与诊断。该调试器提供全部标准调试功能,包括进行单步执行、设置断点和值、检查变量和值以及暂挂和恢复线程的能力。这篇文章主要讲述Eclipse调试器,包括Debug视图,断点的设置,Java代码的调试等等。与一些理论性较强的文章相比,本文更注重实践,为读者提供更加使用的调试技巧。编程
Eclipse 调试器设计模式
Eclipse 平台的最大特点是插件化(Plugin)。调试是任何程序员都没法回避的工做。所以Eclipse的内置插件Java开发工具包(Java Development Toolkit,简称JDT)中集成了一个功能强大的Java调试器(Debugger)。实际上,JDT是Eclipse工做平台(Eclipse Platform Workbench)的基础工具,除了调试器,还提供透视图、视图、编辑器、搜索等Eclipse基础功能。服务器
因为Eclipse调试器采用了基于客户端/服务器的设计模式,远程应用的调试变得与本地同样简单。其工做原理是,本地Eclipse工做平台充当调试的客户端,而远程应用所在的机器则充当了调试服务器的角色。多线程
Debug 视图框架
Debug视图做为Eclipse调试器透视图的一部分,管理与程序调试相关的功能。如图所示,Debug视图呈树状结构,每个线程对应一树节点。图中显示的是暂挂线程Main的调试堆栈帧结构。socket
做为标准的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!"); } } } |