前言

介绍:Java Remote Debug指的是"Java远程调试"。特别是当你在本地开发的时候,你需要调试服务器上的程序时,远程调试就显得非常有用。本人就遇到这样一个问题,本地环境运行一切正常,但是部署到服务器就报错,而且问题一直找不到,这时候使用远程调试就方便得多了,便于我们更快的查找出问题。

步骤

废话不多说,直接上教程

1. 本地项目使用Maven工具打包后,将生成的jar包上传到服务器。
2. 启动命令修改为如下,程序就会支持Remote Debug
nohup java -Djavax.net.debug=ssl -Xdebug -Xnoagent -Djava.compiler=NONE 
 -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8080 -jar demo-0.0.1-SNAPSHOT.jar --server.port=8888 
 -spring.profiles.active=test >&1 &

注:
-XDebug 启用调试
-Xrunjdwp 加载JDWP的JPDA参考执行实例。
transport 用于在调试程序和 VM 使用的进程之间通讯。
dt_socket 套接字传输。
server=y/n VM是否需要作为调试服务器执行。
address=8080 调试服务器监听的端口号(等下使用IDEA调试需要用到)。
-suspend=y/n 是否在调试客户端建立连接之后启动 VM 。
--server.port=8888 修改应用程序启动端口号(application.yml中已设置可忽略)
-spring.profiles.active=test 选择不同环境配置文件(如 使用application-test.yml配置文件,没有可忽略)
demo-0.0.1-SNAPSHOT.jar 启动的jar包,修改为自己上传的jar包

3. 程序启动后,在IDEA中配置一下,让它去访问远程的VM

remote_adr remoteadress_jar包


添加配置Remote:

remote_adr remoteadress_jar包_02


点击debug运行:

remote_adr remoteadress_remote_adr_03


控制台输出如下说明连接成功:

remote_adr remoteadress_java_04

若连接失败:
  • 1.请使用telnet 192.168.20.64:8080 命令查看是否成功 (ip为jar包运行环境地址,端口为启动命令address地址)
  • 2.telnet若失败,使用netstat -nltp命令在服务器(jar包运行环境)执行,查看address配置的端口信息;在Local Address列我们看到了端口信息,若显示的ip为0.0.0.0:8080 (表示telnet是ip只要为服务器任一ip都可以,但是一般来说只有一个,不排除多网卡的情况),若显示localhost:8080则需要修改debug启动命令address=8080address=192.168.20.64:8080 (ip为jar包运行环境ip)
4. 打断点调试

我们可以在IDEA本地文件中打断点进行调试:

remote_adr remoteadress_jar包_05

5.防止断点把VM挂起
  • 提示:idea 的断点默认会挂起整个 VM , 这样一来,任何一个线程进入断点都会导致所有的请求(其他没打断点的请求)被阻塞。这样有可能影响测试环境的正常使用。
  • 解决方案:打完断点后,使用鼠标右键单击红点,将 Suspend 设置为 Thread,最后再点击一下 Make Default 设置为默认。以后有需求可以再改回来。

remote_adr remoteadress_jar包_06