概述
远程调试简单的说就是通过运行在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