使用 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 应该被禁用,也就是将远端的相关参数去掉。另外在调试中远端的日志并不会映射到本地,当然你可以借助一些工具将远程的日志映射到本地以提供更强大的调试功能。

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

相关推荐
望获linux14 分钟前
【实时Linux实战系列】Linux 内核的实时组调度(Real-Time Group Scheduling)
java·linux·服务器·前端·数据库·人工智能·深度学习
Never_Satisfied17 分钟前
在 JavaScript 中,删除数组中内容为xxx的元素
java·前端·javascript
OK_boom25 分钟前
visual studio 打开设计时刻抛出异常“未能加载文件或程序集...”的另一解决方法
ide·visual studio
MC丶科25 分钟前
【SpringBoot常见报错与解决方案】端口被占用?Spring Boot 修改端口号的 3 种方法,第 3 种 90% 的人不知道!
java·linux·spring boot
怪兽201429 分钟前
Redis常见性能问题和解决方案
java·数据库·redis·面试
zz-zjx30 分钟前
JVM 内存结构与 GC 机制详解( 实战优化版)
java·jvm·tomcat
nvvas42 分钟前
Android Studio JAVA开发按钮跳转功能
android·java·android studio
小蕾Java1 小时前
【VSCode】Visual Studio Code 2024安装包及安装教程 (附所有版本下载)
ide·vscode·编辑器
CV工程师丁Sir1 小时前
Rokid设备连接全解析:蓝牙与Wi-Fi通信源码深度剖析
java
zoyation1 小时前
多线程简介和在JAVA中应用
java·开发语言