Java Remote Debug(远程调试)
作者: ytfei 日期: 年 05 月 08 日 发表评论 (0) 查看评论新接手的项目采用的是Maven作为编译管理工具,项目内容则是按子模块Module来划分。由于模块太多,且都比较大(基本上都能独立运行并负责处理一方面的业务),并采用Socket来进行模块之间的数据通信,结果就导致一个略显臃肿的系统产生了。最重要的是,不知道maven的pom.xml文件出了什么问题,Eclipse也一直无法成功加载部分重要模块(以致最后切换到JetBrain IDEA(Open Source)——这也算是一点收获),常用的调试方式也行不通了。过了好一段时间我才习惯,每次提交代码前都要小心翼翼地检查一遍。
昨天让同事帮我做CodeReview,讨论问题中,看着他演示一下Remote Debug。觉得很神奇,回来试了一下,又加了点资料,才发觉得我真的是Out了。以下内容是个简单的笔记,关于在JetBrain IDEA中使用Remote Debug的方式。
要想Debug,首先得需要在编译时打开debug选项,这样生成的class文件才能支持debug过程。其次,RemoteDebug过程是在两个不同的VM实例间进行了,这就得需要一个通信方式了。常用的是Socket了!因此设置中会涉及到一些端口设置的。
在启动程序时,将以下参数选项添加到自定义的命令行中,程序就会以支持RemoteDeubg的方式启动。
-Xdebug -Xnoagent -piler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=2345
例如:
JVM_OPTS="-server -Xss128k -XX:+UseParNewGC -XX:+HandlePromotionFailure -XX:+HeapDumpOnOutOfMemoryError"
DEBUG="-Xdebug -Xnoagent -piler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=2345"
JVM_OPTS="$JVM_OPTS $DEBUG"
$JAVA_HOME/bin/java $JVM_OPTS -cp $CP com.romebuild.Main
准备程序之后,再配置一下IDE,让它去访问远程的VM了。过程相当简单!
【Run】|【Edit Configuration】,选择【Add New Configuration】|【Remote】,便生成了一个RemoteDebug配置,其中的参数不用修改,但需要设置目标VM实例所在的主机与监听的端口。本例则为localhost:2345了。再选择与目标实例对应的模块代码就可以了。
点击调试按钮,IDEA就会连接到目标VM上去了,调试方法就不用多说了吧。下面来说明一下DEBUG选项参数的意思:
-XDebug 启用调试
-Xrunjdwp 加载JDWP的JPDA参考执行实例。
transport 用于在调试程序和 VM 使用的进程之间通讯。
dt_socket 套接字传输。
server=y/n VM是否需要作为调试服务器执行。
address=2345调试服务器监听的端口号。
suspend=y/n 是否在调试客户端建立连接之后启动 VM 。
关于suspend多说一句,如果设置为y,它会阻塞程序运行,直到有客户端连接到对应的监听端口(这里是9527),程序才真正开始执行。我们有时候会抱怨程序一闪而过,还没来得及在本地加载上代码程序就执行完了,这种情况就可以使用suspend参数。
还有一个细节是-jar参数不能写到-Xug参数前,像这样无法启用调试:
java -jar lib/Main.jar -Xdebug -Xrunjdwp:transport=dt_socket,address=9527,server=y,suspend=y