Springboot开启远程调试

简介: 远程调试就是服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码( 前提是本地 的代码必须和远程服务器运行的代码一致 )中设置断点,每当有请求到远程服务器时时能够在本地知道 远程服务端的此时的内部状态

1、什么是远程调试

所谓的远程调试就是服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码( 前提是本地 的代码必须和远程服务器运行的代码一致 )中设置断点,每当有请求到远程服务器时时能够在本地知道 远程服务端的此时的内部状态。

简单的意思:本地无需启动项目的状态下能够实时调试服务端的代码。

2、什么是JPDA

JPDA ( Java Platform Debugger Architecture ),即 Java 平台调试体系,具体结构图如下图所示:
image.png
其中实现调试功能的主要协议是JDWP协议,在Java SE 5以前版本,JVM端的实现接口是 JVMPI (Java Virtual Machine Profiler Interface),而在Java SE 5及以后版本,使用 JVMTI (Java Virtual Machine Tool Interface) 来替代JVMPI

因此,如果你使用的是Java SE 5之前的版本,则使用的调试命令格式如下:

java -Xdebug -Xrunjdwp:...

如果你使用的是 Java SE 5 之后的版本,则使用的命令格式如下:

java -agentlib:jdwp=...

3、如何开启调试

由于现在使用的大多数都是 Java SE 5之后的版本,则之前的就忽略了。

日常开发中最常见的开启远程调试的命令如下:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9093 -jar xxx.jar

前面的java -agentlib:jdwp= 是基础命令,后面的跟着的一串命令则是可选的参数,具体什么意思呢?

1、transport

指定运行的被调试应用和调试者之间的通信协议,有如下可选值:

dt_socket: 采用 socket方式连接(常用)

dt_shmem :采用共享内存的方式连接,支持有限,仅仅支持windows平台

2、server

指定当前应用作为调试服务端还是客户端,默认的值为 n (客户端)。

如果你想将当前应用作为被调试应用,设置该值为 y ;如果你想将当前应用作为客户端,作为调试的发起者,设置该值为 n

3、suspend

当前应用启动后,是否阻塞应用直到被连接,默认值为 y (阻塞)。

大部分情况下这个值应该为 n ,即不需要阻塞等待连接。一个可能为y 的应用场景是,你的程序在启动时出现了一个故障,为了调试,必须等到调试方连接上来后程序再启动。

4、address

对外暴露的端口,默认值是8000 注意 :此端口不能和项目同一个端口,且未被占用以及对外开放。

5、onthrow

这个参数的意思是当程序抛出指定异常时,则中断调试。

6、onuncaught

当程序抛出未捕获异常时,是否中断调试,默认值为 n 。

7、launch

当调试中断时,执行的程序。

8、timeout

超时时间,单位 ms (毫秒) 当suspend = y 时,该值表示等待连接的超时;当 suspend = n 时,该值表示连接后的使用超时。

4、常用的命令

下面列举几个常用的参考命令,这样更加方便理解。

Socket 方式监听 8000 端口,程序启动阻塞( suspend 的默认值为 y )直到被连接,命令如下:

-agentlib:jdwp=transport=dt_socket,server=y,address=8000

以Socket方式监听 8000端口,当程序启动后 5 秒无调试者连接的话终止,程序启动阻塞( suspend 的默认值为 y )直到被连接。

-agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000,timeout=5000

选择可用的共享内存连接地址并使用stdout 打印,程序启动不阻塞。

-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n

socket 方式连接到 myhost:8000 上的调试程序,在连接成功前启动阻塞。

-agentlib:jdwp=transport=dt_socket,address=myhost:8000

socket方式监听 8000 端口,程序启动阻塞(suspend 的默认值为 y )直到被连接。当抛出IOException时中断调试,转而执行usr/local/bin/debugstub程序。

agentlib:jdwp=transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub

5、IDEA如何开启远程调试

首先的将打包后的 Spring Boot 项目在服务器上运行,执行如下命令(各种参数根据实际情况自己配置):


java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9193 -jar debug-demo.jar

项目启动成功后,点击 Edit Configurations ,在弹框中点击+号,然后选择Remote

有些版本就是Remote
image.png
然后填写服务器的地址及端口,点击 OK 即可。

image.png
以上步骤配置完成后,点击DEBUG调试运行即可。
image.png
配置完毕后点击保存即可,因为我配置的 suspend=n ,因此服务端程序无需阻塞等待我们的连接。我们 点击 IDEA 调试按钮,当我访问某一接口时,能够正常调试。
image.png

目录
相关文章
|
1月前
|
Web App开发 监控 Java
|
28天前
|
Java Maven 微服务
springboot项目开启远程调试-jar包
springboot项目开启远程调试-jar包
20 0
|
1月前
|
前端开发 Java 数据库
基于Springboot的漫画网站22(程序+数据库+论文)可帮忙远程调试
基于Springboot的漫画网站22(程序+数据库+论文)可帮忙远程调试
|
6月前
|
JSON 网络协议 Java
使用端口映射实现Spring Boot服务端接口的公网远程调试:详细配置与步骤解析
使用端口映射实现Spring Boot服务端接口的公网远程调试:详细配置与步骤解析
|
7月前
|
JSON 网络协议 Java
springboot服务端接口公网远程调试 - 实现HTTP服务监听【端口映射】
前后端分离项目中,在调用接口调试时候,我们可以通过cpolar内网穿透将本地服务端接口模拟公共网络环境远程调用调试,本次教程我们以Java服务端接口为例。
61 0
springboot服务端接口公网远程调试 - 实现HTTP服务监听【端口映射】
|
7月前
|
JSON 网络协议 Java
springboot服务端接口公网远程调试 - 实现HTTP服务监听【端口映射】
springboot服务端接口公网远程调试 - 实现HTTP服务监听【端口映射】
88 0
|
7月前
|
JSON Java 数据格式
springboot服务端接口外网远程调试,并实现HTTP服务监听(二)
springboot服务端接口外网远程调试,并实现HTTP服务监听(二)
73 0
|
7月前
|
网络协议 Java 应用服务中间件
springboot服务端接口外网远程调试,并实现HTTP服务监听(一)
springboot服务端接口外网远程调试,并实现HTTP服务监听(一)
79 0
|
7月前
|
JSON 网络协议 Java
springboot服务端接口外网远程调试,并实现HTTP服务监听
springboot服务端接口外网远程调试,并实现HTTP服务监听
84 0
|
7月前
|
JSON 网络协议 Java
springboot服务端接口公网远程调试 - 实现HTTP服务监听【端口映射】
前后端分离项目中,在调用接口调试时候,我们可以通过cpolar内网穿透将本地服务端接口模拟公共网络环境远程调用调试,本次教程我们以Java服务端接口为例。
springboot服务端接口公网远程调试 - 实现HTTP服务监听【端口映射】