【从零单排】Java远程调试Remote Debug的二三事

问题

笔者对于本地调试已经有很多经验了,一般流程是:在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中,配置如下:

debug_1.png

这里需要我们填的是Host和Port。

然后,就可以愉快地跑起来了~

需要注意的是,远程调试由于需要网络传输,如果服务器在国外,可能会非常慢。

参考

原文地址:https://www.cnblogs.com/maxstack/p/12877974.html