Eclipse 是一个图形化 Java 调试器前端。JDI 在 org.eclipse.jdt.debug 包中实现。本文不详细讨论 JDI 实现。参见 参考资料 获得关于 Eclipse JDT 和 Java JDI 技术的信息。
我们首先应该知道要使用哪个 Eclipse 连接器。要了解 Eclipse 提供的远程连接类型,您可以转到 Eclipse 菜单并选择 Run > Debug Configurations...,在 Remote Java Application
中添加一个启动配置,然后从下拉列表中选择连接器。在 Ganymede 中共有两个连接器:
- Socket Attach
- Socket Listen
对 于监听套接字的连接器,Eclipse VM 将是与远程 Java 应用程序连接的主机。对于连接套接字的连接器,目标 VM 将作为主机。这两种连接器对应用程序调试没有影响,用户可以任意选择。但根据经验,需要使用速度更快、更强大的计算机作为 VM 调试主机,因为需要计算的资源很多。
在调试 Java 应用程序之前,需要确保已经为远程应用程序启用所有调试选项。如果选项信息不可用,您将收到一个错误信息,比如 “Debug information is not available” 或 “Unable to install breakpoint due to missing line number”。您可以通过更改 Eclipse 菜单上的 Window > Preferences > Java > Compiler 来修改设置。
图 1. Eclipse 中的调试选项
![使用 Eclipse 远程调试 Java 应用程序 - huapox_bok - huapox_bok Eclipse 中的调试选项](http://img.bimg.126.net/photo/aQ54zP1lanv_99rlScnMIw==/5132414725359046724.jpg)
现在,我们已经准备好远程调试应用程序。我们分步执行:
- 1. 使用简单类创建一个 Java 项目
- 我们为调试创建一个简单类。清单 4 给出了示例代码。
清单 4. 调试示例代码
package com.ibm.developerWorks.debugtest;
public class test {
public static void main(String[] args) {
System.out.println("This is a test.");
}
}
- 2. 设置一个断点
- 在代码中设置一个断点。在这个例子中,我们在
System.out.println("This is a test.");
这行中设置断点。
图 2. 在 Eclipse 中设置断点
![使用 Eclipse 远程调试 Java 应用程序 - huapox_bok - huapox_bok 在 Eclipse 中设置断点](http://img.bimg.126.net/photo/-RFhEhMsfhKh39lmjDGGCA==/5132414725359046725.jpg)
- 3. 从本地调试应用程序
- 在调试应用程序之前,确保已经为项目启用图 1 中描述的调试选项。从本地调试应用程序是没有必要的,但是这可以确保是否所有调试信息都可用。右键单击 Java 项目,并选择 Debug As,然后选择 Java Application(参见图 3)。如果应用程序在断点处停止执行,则表明调试信息正确显示。这时,可以继续使用这些调试特性,比如显示调试堆栈、变量或断点管理等等。
图 3. 从本地调试应用程序
![使用 Eclipse 远程调试 Java 应用程序 - huapox_bok - huapox_bok 从本地调试应用程序](http://img.bimg.126.net/photo/7rPLJM-xZj8QUij1qL3oCg==/5132414725359046726.jpg)
- 4. 导出 Java 项目
- 我们将使用这个应用程序作为调试目标。右键单击 Java 项目,选择 Export,然后选择 Java,最后选择 JAR file 或Runnable JAR file 导出项目。将在指定的位置生成 JAR 文件。注意,如果 Java 源代码与目标应用程序不匹配,调试特性将不能正常工作。
- 5. 手动运行 Java 应用程序
- 打开控制台手动启动应用程序,确保正确配置了 Java 运行时环境。
清单 5. 调用 Java 应用程序的示例
java -jar test.jar
- 6. 远程调试应用程序
- 将 JAR 文件复制到远程计算机或同一台计算机上的适当位置,调用调试服务器,然后为它添加一个客户机。简单的 Java 应用程序就可以充当调试服务器或客户机。您可以在 Eclipse 中选择 Socket Attach 或 Socket Listen 连接类型,这取决于特定的配置。接下来的两个小节将学习如何将应用程序作为服务器或客户机运行。
下面这个示例远程调用 Java 应用程序作为调试服务器,并在端口 8000 监听套接字连接。目标 VM 将暂停,直到调试器连接。
清单 6. Eclipse 连接套接字模式下的 VM 调用示例
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address="8000" -jar
test.jar
使用远程启动配置启动 Eclipse,并指定远程应用程序的目标 VM 地址。为此,单击 Run > Debug Configurations,然后在 Eclipse 菜单中双击Remote Java Application。从最新创建的启动配置中为目标应用程序指定 IP 和端口。为了在同一台机器上运行远程应用程序,仅需将主机 IP 指定为 localhost 或 127.0.0.1。
图 4. 连接套接字连接的配置
![使用 Eclipse 远程调试 Java 应用程序 - huapox_bok - huapox_bok 连接套接字连接的配置](http://img.bimg.126.net/photo/dHKChNCiUQvodefhxOOl0Q==/5132414725359046727.jpg)
选择Allow termination of remote VM 选项终止在应用程序调试期间连接的 VM。
图 5. Eclipse 中的 Terminate 按钮
![使用 Eclipse 远程调试 Java 应用程序 - huapox_bok - huapox_bok Eclipse 中的 Terminate 按钮](http://img.bimg.126.net/photo/8y1vYgFrEr_dog6PbOhTmQ==/5132414725359046728.jpg)
第二个示例使用一个简单的 Java 应用程序作为调试客户机,并且调试器前端作为调试服务器。Eclipse 使用套接字监听模式连接类型进行监听。必须先启动调试前端来监听特定的端口。图 6 给出一个用于设置监听的示例配置。
图 6. 监听套接字连接的配置
![使用 Eclipse 远程调试 Java 应用程序 - huapox_bok - huapox_bok 监听套接字连接的配置](http://img.bimg.126.net/photo/1vtcxeTX89gC97oTBH21-Q==/5132414725359046729.jpg)
单击 Eclipse Debug 按钮,状态栏将显示消息 “waiting for vm to connect at port 8000...”。看到这个消息后,启动远程应用程序。清单 7 显示了如何将 Java 应用程序作为调试客户机并调用它,然后使用端口 8000 上的主机 127.0.0.1 的套接字将其连接到一个正在运行的调试器应用程序。
清单 7. Eclipse 监听套接字连接模式中的 VM 调用示例
java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y
-jar test.jar
如果一切进行顺利,将会显示一个调试透视图帮助调试应用程序,并且远程 Java 应用程序将正常停止。这类似于步骤 3 中的本地调试(参见图 3)。在这里,您可以使用标准的调试特性,比如设置断点和值、单步执行等。