所谓的远程调试就是服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码(前提是本地的代码必须和远程服务器运行的代码一致)中设置断点,每当有请求到远程服务器时时能够在本地知道远程服务端的此时的内部状态。下面介绍一下Intellij IDEA下对Springboot类型的项目的远程调试功能。
IDEA远程DEBUG Tomcat很简单,配置如下:
1.修改tomcat服务器配置
打开tomcat/bin/catalina.sh
在空白处添加如下参数
- linux添加如下配置
CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=xxx.xxx.xx.xx:60222,suspend=n,server=y" - Windows添加配置如下
tomcat启动之前,修改tomcat\bin\catalina.bat文件,设置调试端口
rem ---------------------------------------------------------------------------此为注释
set JAVA_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8021
说明:address为tomcat服务器ip地址,这里必须填上(如果是局域网ip,就填局域网ip,如果不填ip,可能启动会用127.0.0.1这个回环地址,导致DEBUG失败)。端口号随便定义,没被占用即可
添加完成后,保存修改。
以catalina.sh的方式启动tomcat
sh catalina.sh start
至此,服务器端配置完毕
- SpringBoot下远程debug调试
填写name,配置Host地址(远程服务器地址)和端口(选一个未被占用的端口)。然后复制For JDK1.4.x下面的参数,示例配置的端口为5005:
图片参数设置如下
#Command line arguments for running remote JVM
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
#For JDK 1.4X
-Xdebug -XrunJdwp:transport=dt_socket,server=y,suspend=n,address=5005
#For JDK 1.3x or earlier
-Xnoagent -Djava.compiler=NONE -Xdebug
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
*** 参数说明***
(1) transport
指定运行的被调试应用和调试者之间的通信协议,它由几个可选值:
dt_socket:主要的方式,采用 socket 方式连接
dt_shmem:采用共享内存方式连接,仅支持 Windows 平台(暂未验证)
(2) server
当前应用作为调试服务端还是客户端,默认为 n。
如果你想将当前应用作为被调试应用,设置该值为 y;如果你想将当前应用作为客户端,作为调试的发起者,设置该值为 n。
(3) suspend
当前应用启动后,是否阻塞应用直到被连接,默认值为 y。
在大部分的应用场景,这个值为 n,即不需要应用阻塞等待连接。一个可能为 y 的应用场景是,你的程序在启动时出现了一个故障,为了调试,必须等到调试方连接上来后程序再启动。
(3) address
暴露的调试连接端口,默认值为 8000。
(4) onthrow
当程序抛出设定异常时,中断调试。
(5) onuncaught
当程序抛出未捕获异常时,是否中断调试,默认值为 n。
(6) launch
当调试中断时,执行的程序。
(7) timeout
该参数限定为 java -agentlib:jdwp=… 可用,单位为毫秒ms。
当 suspend = y 时,该值表示等待连接的超时;当 suspend = n 时,该值表示连接后的使用超时。
***参考实例***
-agentlib:jdwp=transport=dt_socket,server=y,address=8000
以 Socket 方式监听 8000 端口,程序启动阻塞(suspend的默认值为y)直到被连接。
-agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000,timeout=5000
以 Socket 方式监听 8000 端口,当程序启动后5秒无调试者连接的话终止,程序启动阻塞(suspend的默认值为y)直到被连接。
-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
选择可用的共享内存连接地址并使用 stdout 打印,程序启动不阻塞。
-agentlib:jdwp=transport=dt_socket,address=myhost:8000
以 socket 方式连接到 myhost:8000上的调试程序,在连接成功前启动阻塞。
-agentlib:jdwp=transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
以 Socket 方式监听 8000 端口,程序启动阻塞(suspend的默认值为y)直到被连接。当抛出 IOException 时中断调试,转而执行 usr/local/bin/debugstub程序。
经过以上步骤,已经获得了启动远程服务器的参数。在启动springboot时默认使用java命令来启动。
java -jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 springboot-test-1.0-SNAPSHOT.jar
#这样服务端就监听在5005端口了。可以通过以下命令来检查是否监听成功:
netstat -anp | grep 5005
#通过以上步骤已经完成了服务器端参数的添加。下面启动刚才配置的Remote服务,即test-spring。在启动时候我们会发现此项启动程序只有debug启动模式。
#启动完成,对需要debug的代码打上断点,剩下的操作步骤就是访问远程服务器对应的业务请求,本地就会同步debug。其余的操作与本地debug相同
2.IDEA配置
如图
第一步,Edit Configurations
第二步 Add New Configuration >> Tomcat Server >> Remote
第三步,修改配置,如图
第四步,点击Startup/Connection >> Debug,修改Port为第一步设置的端口,这里是60222
第五步,Debug启动IDEA Tomcat,控制台打印如下信息,则表示启动成功,就可以开始远程debug啦