前言

在日常开发中,我们经常遇到在本地重现不了,但是换个环境就必现的问题,而这个环境可能是测试环境,抑或是准生产环境。显然服务器上调试是很不方便的。这时候,我们可以利用本地代码来进行远程调试。当然实际的使用场景还是很多的,就不一一列举了,这里来和大家一起看下IDEA如何配置远程Debug调试。

IDEA本地配置

首先在IDEA中打开Run/Debug Configrations界面,然后点击+号,新增配置,然后配置号远程连接的Host和Port,Host即为服务部署的地址,需要注意port不是服务的配置端口,需要单独选用一个未被占用的端口进行配置,具体界面如下图所示

idea远程连接hadoop idea远程连接调试_Java

上图中3中的参数,可以先拷贝一份出来,待会在服务器上部署的时候需要,参数配置如下

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=15007

重启服务器上的项目

首先要保证本地的代码和服务器上代码版本是一致的,否则可能导致远程调试断点进不去。我们的项目是采用springboot的,在启动jar包的shell脚本中加上上图中的参数就ok了,这里复制下我的参数

nohup /usr/bin/java -Xms2048m -Xmx2048m -Xss256k -XX:MetaspaceSize=256m 
-XX:MaxMetaspaceSize=256m -agentlib:jdwp=transport=dt_socket,server=y,
suspend=n,address=15007 -jar test.jar --spring.profiles.active=dev >/dev/null 2>&1 &

上面参数加过之后,我们需要重新用上面的命令启动服务,这里需要确保服务器上15007端口没有被占用,当然你可以选择其他未被占用的端口,而且这个端口和IDEA中配置的监听端口要保持一致。在linux服务器上,可以通过netstat -anp |grep 端口号来查看端口是否被占用

idea远程连接hadoop idea远程连接调试_idea远程连接hadoop_02

上面查询8110端口处于LISTEN状态,已经被占用。

本地调试

服务器上服务启动好之后,我们用IDEA远程连接上去就ok了,具体启动步骤如下

idea远程连接hadoop idea远程连接调试_idea远程连接hadoop_03

启动好之后本地控制台会出现一行描述

idea远程连接hadoop idea远程连接调试_Java_04

后续就可以断点调试了,具体调试步骤和本地debug调试一致,这里不再赘述。

远程调试原理

我们都知道Java 程序是运行在Java 虚拟机上的,具有良好跨平台性,Java程序统一以字节码的形式在JVM中运行,不同平台的虚拟机都统一使用这种相同的程序存储格式。因为都是类字节码文件,只要本地代码和远程服务器上的类文件相同,两个JVM通过调试协议进行通信(例如通过插座在同一个端口进行通信),便可进行远程调试。