使用Eclipse进行远程调试
本文介绍在不更改配置的情况下远程调试 Java 程序和 tomcat 程序。
远程调试Java程序
测试代码 HelloWorld.java
将以上代码打成jar包(remoteDebug.jar)上传到目标机器(远程或本地)。
要进行调试,必须将调试 JDWP 代理加载到应用程序的 JVM 中。从 Java 5.0 开始,可以用 -agentlib:jdwp 选项来完成加载。5.0 以前版本则使用 -Xdebug 和 -Xrunjdwp 选项(5.0 也支持 -Xdebug 和 -Xrunjdwp 选项,不过新的 -agentlib:jdwp 选项更加好用。因为 5.0 中的 JDWP 代理使用 JVMTI 接口连接 VM,而非旧的 JVMDI 接口)。你应该向 -agentlib:jdwp(Java 5.0中)或 -Xrunjdwp(Java 5.0以前版本) 参数提供子选项;两组可能的子选项相同。
子选项参数说明:
- transport:这里通常使用套接字传输器(dt_socket)。如果被调试者和调试器位于同一机器之中,且运行的是 Windows 系统,可以使用共享内存连接器(dt_schmem)。
- server:如果值为 y,目标应用程序监听将要连接的调试器应用程序。否则,它将连接到特定地址上的调试器应用程序。
- address:连接的传输地址。如果 server= n,将尝试连接到该地址上的调试器应用程序。否则将在这个端口监听连接。
- suspend:如果值为 y,目标 VM 将暂停,直到调试器应用程序进行连接。
在目标机器上运行:
此时目标机器处于等待调试状态,在 eclipse 中设置代码断点,然后在 Debug configurations 的 Remote Java Application 中添加一个启动配置,具体如下:
连接类型(Connection Type)有两种,这两种连接器对应用程序调试没有影响,可以任意选择:
- Socket Attach:连接套接字的连接器,目标 VM 将作为主机。
- Socket Listen:监听套接字的连接器,Eclipse VM 将是与远程 Java 应用程序连接的主机。
点击 Debug 即进入调试模式:
调试 eclipse 代码即见目标机器执行效果:
目标机器可能会报以下错误:
是由于 remoteDebug.jar 中的 manifest.mf 文件里面没有指定 Main-Class,可在 manifest.mf 文件里添加内容:
也可在目标机器这样启动程序:
远程调试tomcat程序
远程调试 tomcat 参照以下方式执行即可:
eclipse 中同样设定断点,并在 Debug configurations 的 Remote Java Application 中添加启动配置。如以下示例,将断点设在用户登录时,当点击“登录”后 eclipse 即进入调试模式: