欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Eclipse 调试器 零距离接触实战技巧

程序员文章站 2023-11-25 20:14:28
Eclipse 调试器 零距离接触实战技巧...
调试的方法虽然千千万万,但归根结底,就是找到引发错误的代码。eclipse调试器的目标是让程序员能对本地或远程程序进行错误侦测与诊断。该调试器提 供所有标准调试功能,包括进行单步执行、设置断点和值、检查变量和值以及暂挂和恢复线程的能力。这篇文章主要讲述eclipse调试器,包括debug视 图,断点的设置,java代码的调试等等。与一些理论性较强的文章相比,本文更注重实践,为读者提供更加使用的调试技巧。

eclipse 平台的最大特色是插件化(plugin)。调试是任何程序员都无法回避的工作。因此eclipse的内置插件java开发工具包(java development toolkit,简称jdt)中集成了一个功能强大的java调试器(debugger)。实际上,jdt是eclipse工作平台(eclipse platform workbench)的基础工具,除了调试器,还提供透视图、视图、编辑器、搜索等eclipse基础功能。

由于eclipse调试器采用了基于客户端/服务器的设计模式,远程应用的调试变得与本地一样简单。其工作原理是,本地eclipse工作平台充当调试的客户端,而远程应用所在的机器则充当了调试服务器的角色。

debug 视图

debug视图作为eclipse调试器透视图的一部分,管理与程序调试相关的功能。如图所示,debug视图呈树状结构,每一个线程对应一树节点。图中显示的是暂挂线程main的调试堆栈帧结构。

Eclipse 调试器 零距离接触实战技巧

作为标准的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模式。当选择下拉框时,可自动定位到暂挂线程的调试堆栈帧。这个细节对于编程人员来说,也是非常 的方便。

Eclipse 调试器 零距离接触实战技巧

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可以重新跳到当前方法的开始处重新执行,并且所有上下文变量的值也相应回到初始时刻,如图所示。

Eclipse 调试器 零距离接触实战技巧

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,如图所示。

Eclipse 调试器 零距离接触实战技巧

6. 声明选项

open declared type命令会打开当前调试堆栈帧的类型声明编辑器。而open declared type hierarchy则展现的是完整的层次结构,如图所示。

Eclipse 调试器 零距离接触实战技巧

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。

Eclipse 调试器 零距离接触实战技巧

相关标签: Eclipse 调试器