使用 IntelliJ IDEA 进行远程调试

1. 前言

今天线上出现了个 Bug ,而且比较坑的是涉及到k8s环境相关的东西不能线下调试。传统方式是在代码中各种的日志 log 埋点然后重新部署进行调试,再根据 log 中的信息进行分析。如果你的 log 埋点不合理,就要不停的修改代码、不停的打包部署。有没有什么骚操作避免上面的问题呢?

2. 远程调试

当然有解决方案,这就是远程调试(Remote debugging)。远程调试使开发人员能够直接诊断服务器或其它线上进程上的问题,它提供了跟踪线上运行时错误并确定性能瓶颈和问题根源的方法,让你能够像在本地调试一样 Debug 远程服务器。接下来我们将使用流行的 Java IDE,由 JetBrains 出品的 IntelliJ IDEA 来进行远程调试。要让远程服务器运行的代码支持远程调试,则启动的时候必须加上特定的 JVM 参数,这些参数是:

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

参数说明:

主要是为了启用Java Debug Wire Protocol (JDWP),这是一种调试协议,使得你可以在程序运行时进行远程调试。具体来说,这些参数的作用如下:

  • -agentlib:jdwp:启用JDWP调试功能,允许远程调试。

  • transport=dt_socket:指定调试通信的传输方式为基于TCP/IP的套接字(socket)。

  • server=y:表示JVM作为调试服务器启动,等待调试客户端(如IDE)连接。

  • suspend=n :指定程序启动时是否暂停。n表示程序不会在启动时暂停,而是直接运行,等待调试客户端连接。如果设置为y,则JVM会在启动时暂停,直到调试客户端连接上来。

  • address=5005:指定调试客户端连接的端口,这里是5005端口。调试客户端会通过这个端口连接到JVM实例。

3. 使用 IDEA 进行远程调试

IntelliJ IDEA 进行远程调试并不复杂经过下面几个步骤就可以很方便的配置。

按照上面图的位置打开配置面板新建一个 Remote 调试面板如下:

按照上图所示的顺序结合你自己服务器和本地环境依次进行配置,然后点击确定就行了。

开启远程调试

点击箭头所示的 绿色甲虫按钮 (快捷键 Shift + F9) 就启动调试了,然后设置好本地代码的断点,让远程的逻辑触发断点逻辑就可以进行打断点调试了。

请务必保证本地 debug 的代码与远程部署的代码完全一致,不能发生任何的修改!否则断点将无法命中!

4. 一些要点

除了需要保证代码一致外,这里还有一些需要我们注意的地方。调试完毕远程的 JDWP Agent 应该被禁用,也就是将远端的相关参数去掉。另外在调试中远端的日志并不会映射到本地,当然你可以借助一些工具将远程的日志映射到本地以提供更强大的调试功能。

还要记住,虽然远程调试是一个非常强大的工具,但是它并非银弹!生产环境不是调试的合适目标,请勿滥用!

相关推荐
weixin_BYSJ19875 分钟前
「课设设计」springboot校园超市助购系统26449 (附源码)
java·javascript·spring boot·python·django·flask·php
栋***t10 分钟前
从“纸质试卷”到“AI智能组卷”,麦塔在线考试系统如何重构出题逻辑?
java·大数据·人工智能·算法·重构
CHANG_THE_WORLD19 分钟前
深入理解递归:从函数调用到调用栈的完整执行过程
java·开发语言·算法
xexpertS20 分钟前
CI/CD 熔断机制:如何通过编排级熔断器提升开发者效率
java·linux·运维
zy happy1 小时前
VMware虚拟机添加新的硬盘
java·linux·jvm·docker
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第192题】【08_Kafka篇】第8题:死信队列是什么?延时队列是什么?
java·kafka·消息队列·死信队列·延时队列
meng半颗糖1 小时前
3.Java流程控制语句
java·开发语言·intellij-idea
大模型码小白2 小时前
企业级检索增强后端集成:Java 服务如何管理知识库版本
java·服务器·开发语言·人工智能·python·microsoft
用户6169182299932 小时前
记录一次死锁检测
java
jvmind_dev2 小时前
1c1g 容器莫名 OOM Killed?排查 Metaspace 持续增长与脚本引擎的坑
java·后端