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

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

相关推荐
二进制小甜豆5 小时前
网络原理 TCP/IP
java·学习
chirrupy_hamal6 小时前
IntelliJ IDEA 保姆级使用教程
java·intellij idea
D_aniel_6 小时前
Leetcode:回文链表
java·算法·leetcode·链表
软件2058 小时前
【登录流程图】
java·前端·流程图
深度物联网9 小时前
Spring Boot多模块划分设计
java·spring boot·后端
一 乐9 小时前
宿舍报修|宿舍报修小程序|基于Java微信小程序的宿舍报修系统的设计与实现(源码+数据库+文档)
java·数据库·微信小程序·小程序·论文·毕设·宿舍报修小程序
武昌库里写JAVA11 小时前
Java 设计模式
java·vue.js·spring boot·课程设计·宠物管理
钢铁男儿11 小时前
Python 函数装饰器和闭包(闭包)
java·网络·python
Clf丶忆笙12 小时前
从零开始搭建第一个Spring Boot应用:从入门到精通
java·spring boot
东坡大表哥12 小时前
【Android】Android签名解析
android·java