Eclipse的Debug介绍与技巧

写在前面:因为最近手上项目新接入了两个中间件,在接入过程当中遇到了不少问题,大部分问题都是由身边同事以及中间件的开发者帮忙解决的,在他们解决的过程当中学习到了不少关于debug的技巧。同时结合网上的一些介绍,总结出关于Eclipse的Debug的相关知识。java

没有任何程序员可以一鼓作气的写出没有任何BUG的代码,因此不少程序员有至关一部分时间是花费在Debug上的,程序调试是每一个程序员必须面对的工做,如何使用Eclipse进行有效的、尤为是高效的进行代码调试是一个值得学习的技巧。程序员

1、Eclipse调试介绍express

2、Eclipse中和Debug相关的视图json

2.1 Debug View服务器

2.2 Variables View多线程

2.3 Breakpoints Vieweclipse

2.4 Expressions Viewsocket

2.5 Display Viewjsp

3、Debug编辑器

3.1 设置断点

3.2 调试程序

3.2.1 调试本地 Java 语言程序

3.3.2 远程调试


1、Eclipse调试介绍

使用过Eclipse的人都知道,Eclipse都是自带Java调试器的,能够提供不少基本的调试功能。 Eclipse 平台工做台及其工具是围绕 JDT 组件构建的,该组件为 Eclipse 提供了下列特性:

项目管理工具 透视图和视图 构造器、编辑器、搜索和构建功能 调试器


2、Eclipse中和Debug相关的视图

图 1. Eclipse Debug 透视图的通常视图(该视图能够在Eclipse界面的右上角位置点击Debug按钮进入)

DebugView


Debug View:

debug

Debug视图容许您在工做台上管理正在调试和运行的程序,他显示了你正在调试的程序中挂起的线程的堆栈帧,程序中的每一个线程做为树的节点出现。他展现了正在运行的每一个目标的进程。若是线程被挂起,它的堆栈帧以子元素的形式展现。如下是一些经常使用的debug按钮:

skip_brkp

Skip All Breakpoints::将全部断点设置为被跳过的,设置了Skip All Breakpoints以后,全部断点上都会有一个斜线,表示断点将被跳过,线程不会在该断点处被挂起。

drop_to_frame

Drop to Frame: 这个命令可让程序回到当前方法的开头第一行从新开始执行,能够从新执行这个java堆栈帧,能够选择一个指定的堆栈帧,而后点击 Drop to Frame,这样就能够从新进入指定的堆栈帧。使用Drop to Frame时候须要注意:

1.不能drop到已经执行过的方法栈中的方法中。

2.drop到stack frame中时,不会改变全局数据原有的值,好比,一个包含元素的vertor并不会被清空。

stepbystep_co

Step Filters: 这个功能比较简单,就是当咱们在debug的时候想要忽略一些咱们不关注的类时,能够开启Step Filters进行过滤,程序会一直执行直到遇到未通过滤的位置或断点。Step Filters功能由Use Step FiltersEdit Step FiltersFilter TypeFilter Package四项组成。具体操做以下:

步骤 1: Windows -> Preferences -> Java -> Debug -> Step Filtering.

步骤 2:选择‘Use Step Filters’.

步骤 3:在屏幕上选中所需的选项。你能够添加你本身代码库中的部分代码。

步骤 4:点击‘Apply’.

  原理上,Edit Step Filter命令用于配置Step Filter规则,而Filter TypeFilter Package分别指的是过滤的Java类型与Java Package。

stepreturn_co

Step Return: 跳出当前方法,在被调用方法的执行过程当中,使用Step Return会在执行完当前方法的所有代码后跳出该方法返回到调用该方法的方法中。

stepover_co

Step Over: 在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完在中止,也就是把子函数整个做为一步。

stepinto_co

Step Into: 单步执行,遇到子函数就进入而且继续单步执行

resume_co

Resume: 恢复暂停的线程,直接从当前位置跳到下一个断点位置。

suspend_co

Suspend: 暂停选定的线程,这个时候能够进行浏览或者修改代码,检查数据等。

Eclipse经过Suspend与Resume来支持线程的暂挂与恢复。通常来说,Suspend适用于多线程程序的调试,当须要查看某一个线程的堆栈帧及变量值时,咱们能够经过Suspend命令将该线程暂挂。Resume用于恢复。有两种Resume须要注意:第一是当在调试过程当中修改程序代码,而后保存,点击Resume,此时程序会暂挂于断点。第二是当程序抛出异常时,运行Resume,程序也会暂挂于断点。

terminate_co

Terminate: Eclipse经过Terminate命令终止对本地程序的调试。

disconnect_co

Disconnect: Eclipse使用Disconnect命令来终止与远程JVM的socket链接。


Variables View :

velue

Variables View显示与Debug View中选定的堆栈帧相关的变量信息,调试Java程序时,变量能够选择将更详细的信息显示在详细信息窗格中。此外,Java对象还能够显示出其包含的属性的值。在该窗口中选中变量鼠标右键点击能够进行许多操做,主要操做有如下这些:

All Instances: 打开一个对话框来显示该java类的全部实例,使用该功能须要java虚拟机支持实例的检索。

All References: :打开一个对话框来显示全部引用了该变量的java对象,

Change Value: :更改变量的值,该功能能够和Drop to Frame联合使用进行程序的调试。使用这两个功能就能够代替从新debug

Copy Variables: 复制变量的值,尤为在变量值很长(好比json数据)的时候,这个功能就派上用场了。

Find: 有的时候一个类中变量特别多的时候,能够进行查找。


Breakpoints View :

break

Breakpoints View将列出你在当前工做区间里设置的全部断点,双击断点能够进入到程序中该断点的位置。还能够启用或禁用断点,删除,添加新的,根据工做组或点命中计数给他们分组。在使用断点是有如下两个技巧是十分有用的:

Hit Count: 是指定断点处的代码段运行多少次,最典型的就是循环,若是要让一个循环执行10次就线程挂起,则指定Hit Count值为10,那么当前的循环执行到第九次的时候就会挂掉。

Conditional: 顾名思义,就是条件判断,例如咱们须要循环变量i==10时,线程挂起,则条件设定为i==10,选择Suspend when "true"。

那若是上面的Hit Count和Conditional都选择的话,若是表达式和值设置不合理则会实效。若是选择Suspend when value changes,那么可能在Conditional在变量值发生改变的时候就挂起。


Expressions View :

express

要在 Debug 透视图的编辑器中求表达式的值,选中设置有断点的一整行,并在上下文菜单中选择 Inspect 选项。表达式是在当前堆栈帧的上下文中求值的,其结果显示在 Display 窗口的 Expressions 视图中。 好比我想要计算变量a+b的值,那么就能够在表达式视图中加一个表达式:a+b


Display View :

disp

可使用这个视图,输入或者演算一些新的代码。这些代码在当前的调试位置的上下文环境中被执行,这意味着,你可使用全部变量甚至是内容助手。要执行你的代码的话,只需标记它,并使用右键菜单或者CTRL+U(执行)或者 CTRL+SHIFT+I (检查).


3、Debug

设置断点

在源代码文件中,在想要设置断点的代码行的前面的标记行处,双击鼠标左键就能够设置断点,在相同位置再次双击便可取消断点。有的时候咱们还有这样的须要,就是我并不想一行一行的执行代码,好比一个for循环会循环1000多遍,我只想在第500遍的时候让线程挂起进行调试,这个时候咱们可使用 条件断点

设置条件断点:咱们能够给该断点设置触发条件,一旦知足某条件是才开始调试,能够在断点处点击鼠标右键,选择Breakpoint Properties进入断点设置页面, 刚刚在讲断点视图的时候咱们学到过Hit CountConditional的用法,这里能够设置条件和执行次数。


调试程序

一、调试本地 Java 语言程序

在全部调试中,调试一个Java程序是最简单的,主要有 设置断点启动调试单步执行结束调试 几步。

设置断点: 前面已经说过。

启动调试: Eclipse提供四种方式来启动程序(Launch)的调试,分别是经过菜单(Run –> Debug)、图标(“绿色臭虫”)、右键->Debug As以及快捷键(F11),在这一点上,与其余命令(例如Run)相似。

单步执行: 主要使用前面讲过的几个视图进行调试,其中debug视图中的几个按钮有快捷键:

Step Retuen(F7)

Step Over (F6)

Step Into (F5)

结束调试: 经过Terminate命令终止对本地程序的调试。


二、远程调试

远程调试主要用于调试非本地Java程序,这里的非本地并非只在其余人的机器上才叫非本地。运行在本机上的Web服务器上的程序在调试时也须要使用远程调试。远程调试的大体步骤和调试本地Java语言程序基本一直,只是在设置上有些不一样。

Eclipse 调试器能够调试远程应用程序。它能够链接到一个运行 Java 应用程序的远程 VM,将本身链接到该应用程序上去。使用远程调试会话与使用本地调试会话大体相同。可是,远程调试配置须要在 Run > Debug 窗口中配置一些不一样的设置。须要在左侧视图中先选择 Remote Java Application 选项,而后单击 New。这样就建立了一个新的远程启动配置,会显示出三个选项卡:ConnectSourceCommon

QQ截图20150314215010

在 Connect 选项卡的 Project 字段,选择在启动搜索源代码时要引用的项目。在 Connect 选项卡的 Host 字段,输入运行 Java 程序的远程主机的 IP 地址或域名。在 Connect 选项卡的 Port 字段,输入远程 VM 接收链接的端口。一般,该端口在启动远程 VM 时指定。若是想让调试器决定在远程会话中 Terminate 命令是否可用,能够选择 Allow termination of remote VM 选项。若是但愿能够终止链接的 VM,则选择该选项。如今,在选择 Debug 选项时,调试器会尝试链接到指定地址或端口的远程 VM,结果会在 Debug 视图中显示出来。


参考资料:

Eclipse Help : help.eclipse.org/luna/index.…

使用 Eclipse 平台进行调试 : www.ibm.com/developerwo…

使用 Eclipse 远程调试 Java 应用程序 : www.ibm.com/developerwo…

使用Eclipse调试Java程序的10个技巧 : developer.51cto.com/art/201304/…

Eclipse 调试器:零距离接触实战技巧 : hb.qq.com/a/20111125/…