服务部署后出错怎么快速调试?试试JDWP协议

前言

原文链接:教你使用 JDWP 远程调试服务

在我们日常开发工作中,经常会遇到写好的代码线上出了问题,但是本地又无法复现,看着控制台输出的日志恨自己当初没有多打几条日志,然后追着日志一条一条查,不说找起来有多费事费劲,再我们找到后还要去对应的代码进行修改,最后再将改过的代码打包部署重新测试,这个流程下来十几二十分钟就没了。那么有没有什么办法能帮助我们进行调试呢?答案是有的!使用Java为我们提供的JDWP协议(Java Debug Wire Protocol) 来实现

具体实现

编写测试类

我们新建一个web项目写个controller即可,不需要连接数据库和其他中间件

java 复制代码
@RestController  
public class TestController {  
  
    @GetMapping("/test")  
    public String test(String name) {  
        String content = "你好,";  
        String message = content + name;  
        return message;  
    }  
  
}

以上就是我们写的一个简单示例,我这里程序的端口使用的是默认端口8080,接着我们直接打包即可。

启动Jar包

拿到编译好的jar包后我们直接进行启动,但是需要注意的是,我们这里启动不是使用最简单的java -jar进行启动,而是要加一些参数启动:java -jar -agentlib:jdwp=transport=dt_socket.server=y,suspend=n,address=端口号 xxx.jar。 可以看到上述的启动命令相较于我们使用java -jar启动中间多了一些参数:agentlib:jdwp=transport=dt_socket.server=y,suspend=n,address=端口号,而这就是我们远程调试的关键。

现在我们逐一来分析这些参数都代表了什么意思:

  • agentlib:jdwp:这个参数表明了我们在启动时命令JVM加载JDWP的代理库,而JDWP是Java提供给我们进行远程调试是一种协议。
  • transport=dt_socket :该参数指定了远程调试信息传输的通信协议,共有两种协议:dt_socketdt_shmem
    • dt_socket
      • 使用嵌套字(socket)的方式进行数据传输,JDWP代理会通过TCP/IP的嵌套字与调试器进行通信。
      • 通过网络连接调试器和调试代理,可以在不同的机器上进行调试,适用于远程调试。
    • dt_shmem
      • 使用共享内存(Shared Memory)的方式进行数据传输,JDWP 代理和调试器在同一台物理机上共享内存区域,通过共享内存进行通信。
      • 该协议要求服务与调试器必须在同一台机器上运行,适用于本地调试
      • 由于共享内存直接在物理内存中交换数据,因此通常比套接字传输更快,具有更低的延迟。
  • server=y:该参数用于标明JDWP代理是否作为调试服务器运行,等待调试器的连接(如:Eclipse、IDEA等)。
  • suspend=n:该参数用于标明JVM在启动时是否要等待调试器的连接,如果配置了不需要等待则会在JVM启动后立刻执行程序代码。
  • address=端口号:该参数指定了调试服务器监听的端口号,调试器会以该端口与JDWP代理进行通信。

执行命令后输出与直接使用java -jar启动无异,在这里为了展示效果我使用 dt_socket 的方式进行数据传输,这里我指定了调试服务器监听端口为8888。

配置IDEA远程调试

我们点击 Edit Configurations 来配置我们的远程调试,如下:

点击+号后找到 Remote JVM Debug 添加我们的远程调试 ,其参数如下:

我们配置完成之后直接运行即可。

Debug调试

我们在上述Controller方法中打一个断点,如下:

然后我们去访问一下:http://localhost:8080/test?name=张三

我们可以发现服务可以正常请求到我们的断点中:

至此结束。

相关推荐
茶本无香1 小时前
Arthas 实战:线上“看 Map”的四种武器
java·map·arthas·线上定位
烂蜻蜓2 小时前
Flask入门教程(二十六):Session API——用户会话状态管理
后端·python·flask
霸道流氓气质2 小时前
Spring AI异常处理与重试机制
java·人工智能·spring
郑州光合科技余经理4 小时前
本地生活服务系统:成品模块和定制接口怎么划界
java·前端·人工智能·后端·系统架构·php·ai编程
萧瑟余晖4 小时前
Java深入解析篇三十三之密封类与接口(Sealed Classes)详解
java·开发语言
论迹复利7 小时前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
张宇Joaquin8 小时前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
宸津-代码粉碎机8 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
2601_963749109 小时前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构
朦胧之9 小时前
PostgreSQL 数据库笔记
人工智能·后端