1. 条件断点 (Conditional Breakpoint)

断点是调试过程中最常用的功能,在 Eclipse Java 编辑区的行头双击即可设置普通断点,代码运行至此处时会暂停。

条件断点则是在普通断点的基础上增加了触发条件。只有当用户设置的条件满足时,代码运行到断点处才会停止,否则会自动跳过。

设置方法:在断点处点击鼠标右键,选择菜单底部的 "Breakpoint Properties"

断点右键菜单

断点属性界面及各选项含义如下所示:

断点属性界面

2. 变量断点 (Watchpoint)

断点不仅可以打在语句上,也可以打在变量上。

变量断点设置

上图即为变量断点。当变量的值被初始化或发生改变时,程序会停止。当然,变量断点上也可以添加条件,设置方法与上述条件断点一致。

3. 方法断点 (Method Breakpoint)

方法断点是将断点打在方法的入口处。

方法断点

方法断点的特别之处在于它可以打在 JDK 的源码里。由于 JDK 在编译时通常去掉了调试信息,普通行断点无法生效,但方法断点可以。通过这种方法,可以查看方法的调用栈。

4. 修改变量值 (Change Variable Value)

当代码停在断点处,如果传入的值不正确,如何修改变量值以保证代码继续走正确的流程?或者有一个异常分支老是进不去,能否在调试时修改条件,验证异常分支代码是否正确?

Debug 视图的 Variables 小窗口中,可以看到变量 mDestJarName 的值为 " F:\Study\eclipsepro\JarDir\jarHelp.jar "

Variables 窗口

可以在变量上右键,选择 "Change Value...",在弹出的对话框中修改变量的值。

修改变量值对话框

或者在下方的值查看窗口中直接修改,使用 Ctrl + S 保存后,变量值就会变为修改后的新值。

直接修改变量值

5. 回退栈帧 (Drop to Frame)

这种调试回退功能不是万能的,只能在当前线程的栈帧中回退,也就是说最多只能退回到当前线程调用的开始处。

回退时,请在需要回退的线程方法上点右键,选择 "Drop to Frame"

Drop to Frame

6. 远程调试 (Remote Debugging)

远程调试用于调试不在本机上的程序,主要有两种方式:

  1. 本机作为客户端
  2. 本机作为服务端

使用远程调试的前提是服务器端和客户端的代码是一致的。

6.1 本机作为客户端

本机作客户端比较常用。需要在远端服务器上的 Java 程序启动时打开远程调试开关,服务器端需要加上虚拟机参数。

  • 1.5 以前版本(1.5 以后也可用):

    -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000
  • 1.5 及以上版本

    -agentlib:jdwp=transport=dt_socket,server=y,address=8000

启动示例:

F:\Study\eclipsepro\screensnap>java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 -jar screensnap3.jar

连接远程服务器时,需要在 Eclipse 中新建一个远程调试程序:

新建远程调试程序

注意:连接成功时似乎不能自动切换到 Debug 视图,不要以为本机的调试程序没有连接到服务器端。

6.2 本机作为服务端

同本机作为客户端相比,只需要修改一下 "Connection Type"

修改 Connection Type

这时 Eclipse 会进入到等待连接的状态:

等待连接状态

连接程序使用如下参数即可连接本机服务器(IP 地址请用实际 IP 替换):

-agentlib:jdwp=transport=dt_socket,suspend=y,address=127.0.0.1:8000

启动示例:

F:\Study\eclipsepro\screensnap>java -agentlib:jdwp=transport=dt_socket,suspend=y,address=127.0.0.1:8000 -jar screensnap3.jar

注意:远程调试时本地的代码修改可同步到远程,但不会写到远程的文件里。也就是说本地修改会在下次启动远程程序时失效,不会影响到下次使用时的远程代码。

有关远程调试更详细的介绍请参考:【使用 Eclipse 远程调试 Java 应用程序】

7. 异常断点 (Exception Breakpoint)

经常遇见一些异常导致程序退出,要找到异常发生的地方比较困难。此时可以设置异常断点。

异常断点设置

上图中增加了一个 NullPointerException 的异常断点。当异常发生时,代码会停在异常发生处,这对定位问题非常有帮助。


说明:本文内容基于较旧版本的 Eclipse 与 JDK(如 JDK 1.5)编写,部分菜单选项或虚拟机参数在新版本中可能有所调整,但核心调试原理依然适用。原文转自:http://www.cnblogs.com/qingblog