问题
笔者对于本地调试已经有很多经验了,一般流程是:在IDE中设置断点,配置参数,开始调试。这里的程序是跑在本地的机器上的。
而在实际开发或者生产环境中,应用都是部署在某个服务器上的,服务器上的机器性能更强大,而且可以起集群协同处理。
由于本地的机器的资源限制(笔者的台式机6核16G内存),对于大型应用来说远远不够,某些时候为了跑UAT测试,必须把应用部署到远端的服务器上,这个时候就需要远程调试了。
命令
远程调试和本地调试的思路是一致的,唯一的区别就是,需要让IDE attach到远端服务器的应用上去。
这里有个前提就是,在起JVM的时候,必须设置使其支持远程调试,命令如下(JDK 1.5 +):
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6060
参数的含义如下:
- jdwp:加载JDWP的JPDA参考执行实例。
- transport:用于在调试程序和 VM 使用的进程之间通讯。
- dt_socket:套接字传输。
- server=y/n:VM 是否需要作为调试服务器执行。
- address=6060:调试服务器的端口号,客户端用来连接服务器的端口号。
- suspend=y/n:是否在调试客户端建立连接之后启动 VM 。
对于JDK 1.4及以下的,参数略微有所区别。
一般来说,需要改动的是address,且需要确保该端口在服务器上是可用的,没有冲突。
验证
将应用正确在服务器上部署好之后,使用ps -aux | grep java
命令可以查看server上的Java应用,找到我们的应用如下:
/opt/sunjdk/jdk1.8.0u45_64/bin/java
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6060
-XX:+UseG1GC -Xmx140G -Xms5G -Xss10M -XX:NewSize=4G -Dcom.nomura.fixp.watchdog.timeout.minutes=30
-verbose:gc
-Xloggc:/home/user1/LOGS/app_log.log
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Dcom.sun.management.jmxremote.port=1785
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dlog4j.configuration=file:///home/user1/App/resources/log4j.properties
-cp path1:path2:path3 com.dummy.App
可以看到启动参数中已经正确设置了远程调试。
连接
接下来,我们就需要在IDE中,连接到这个端口。在IntelliJ中,配置如下:
这里需要我们填的是Host和Port。
然后,就可以愉快地跑起来了~
需要注意的是,远程调试由于需要网络传输,如果服务器在国外,可能会非常慢。