远程调试(Remote Debugging)Java程序(Eclipse)

本文介绍如何使用Java平台调试架构(JPDA)实现远程调试。通过配置JVM参数启动服务端应用,并在Eclipse中设置客户端连接,即可进行远程调试。文章详细解释了参数含义及调试步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述
远程调试简单的说就是通过运行在A机器上的debug客户端要调试一个运行在远程B机器上的应用程序。工作中我们常常需要把程序部署在服务器上(有时联调 受对方源IP限制,或者应用程序有时必须运行在特定机器上),而源代码在本机,这时我们一般习惯通过日志调试,迫不得已时可能会在服务器上运行个代理来解 决源IP限制的问题,从而在本机的IDE环境中调试。但是不管怎样,远程调试(Remote Debugging)常常也是重要的。Sun 在设计JPDA(Java Platform Debug architecture)就留下了接口,我们只要在服务器上运行java程序时,给jvm传递几个参数,设定一个监听端口,然后用一个debug客户端 (elipse内置)来访问这个端口,就可以进行远程调试了。操作比较简单就和使用jconsole进行远程性能分析一样,不过java自带的远程调试比自带的jconsole有价值得多,jconsole可展现的东西太少,没有太大的价值,远比不上一些第三方的profiler工具
下面以一个简单的代码展现下远程调试的过程。
在eclipse里专门建立了个项目 
其中RemoteDebugger.java的源代码如下
public class RemoteDebugger {
public static void main(String[] args) throws Exception {
   System.out.println("prepare to call doBusinessLogic ...");
   doBusinessLogic(); //此处设个断点
   System.out.println("end the call");
}
private static void doBusinessLogic() {
   System.out.println("start to execute business logic");
   int i = 3; //此处设个断点
   System.out.println("i = "+i);
   int j = 4;
   System.out.println("j = "+j);
   int s = i+j;
   System.out.println("s = i+j = "+s);
   System.out.println("end business logic");
}
}
服务端设置
服务端运行脚本 ex.sh
#!/usr/bin/ksh
CLASSPATH=.
CLASSPATH=$CLASSPATH:./classes
export CLASSPATH
java -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y RemoteDebugger

or

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8787 RemoteDebugger

参数 含义 
Xdebug 告诉jvm运行在debug模式下 
Xnoagent 不清楚 
Xrunjdwp transport 指定连接方式(包括socket传输和内存传输两种,其中内存传输只支持windows,而且内存传输不支持远程调试) 
address 监听端口,以接收debug客户端发起的TCP连接。 
server =y 表示在remote debugging会话中作为服务端 
suspend =y 表示在客户端建立连接前,服务端被挂起;=n 则不会被挂起。 专门调试时建议设置成y 
客户端设置
(1) 打开eclipse工作台 (笔者用的是eclipse3.2)
(2) 选择“Run->Debug…”菜单项
(3) 选择“Remote Java Application”,在右键弹出菜单中选择“New”
(4) 在Connect标签项中配置连接方式,远程主机的IP和端口(由于在服务端我们设置的是8787,客户端则设置8787)
(5) 在Source标签项中配置好源代码,一般保留默认的就可以。
调试
(1) 在服务端(笔者实验是在10.10.41.182上)运行脚本ex.sh,会显示程序正监听8787端口,由于suspend设置成了=y,所以必须等到客户端连接上了服务端才会继续运行。
(2) 运行客户端,运行刚才建立的RemoteDebugger(1),注意到远程调试项图标下面有个“L”型的折线图标。
(3)此时可以看到程序会停在本机设的断点上,要提醒的是我们程序实际是跑在服务器上的,却能使用本机的断点,挺奇妙的!
参考资料 http://www.eclipsezone.com/eclipse/forums/t53459.html

转载自http://hi.baidu.com/zeorliu/blog/item/e0eb4be74e337629b9382095.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值