还在为线上BUG苦苦找寻?试试IntelliJ IDEA远程调试线上Java程序

news2024/11/28 4:04:33

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

还在为线上BUG苦苦找寻?试试IntelliJ IDEA远程调试线上Java程序

  • 前言
  • 远程调试的原理
    • JDWP(Java Debug Wire Protocol)
  • 开始配置
    • ❶ 构建项目并配置启动参数部署
    • ❷ 配置 IntelliJ IDEA
    • ❸ 测试远程调试
  • 总结

前言

相信很多小伙伴开发项目中,本地开发环境运行好好的,但在生产环境就会出现某些BUG,而定位复现BUG又成了开发者最苦恼的事情,且这是一个非常耗费时间且低效的过程,需要解决这个问题,那么我就需要借助 Java 调试线协议(JDWP)开启远程调试,可以直接将线上项目在本地代码上Debug

远程调试是我们开发者日常工作中的重要技能之一,它可以帮助我们在生产环境中直接调试运行中的应用程序,快速发现并解决问题。博主将给大家将详细介绍在 IntelliJ IDEA 中如何进行远程调试 Java 程序。

远程调试的原理

远程调试是指通过开发工具(如 IntelliJ IDEA)连接到远程运行的 Java 应用程序,从而在本地进行断点设置、变量查看和执行流程控制等调试操作。Java 提供了一套标准的调试协议(JDWP - Java Debug Wire Protocol),允许调试器(IDE)与被调试程序(应用)之间进行通信。

JDWP(Java Debug Wire Protocol)

JDWP 是 Java 平台调试架构(JPDA)的一部分,它定义了调试器与 Java 虚拟机(JVM)之间通信的标准协议。JPDA 包括三部分:

  • Java 虚拟机工具接口(JVMTI):JVM 级别的接口,用于监视和控制 Java 程序的执行
  • Java 调试接口(JDI):高级Java API,供调试器使用,提供用户友好的调试功能
  • Java 调试线协议(JDWP):调试器和 JVM 之间的通信协议

JDWP 负责在调试器和 JVM 之间传递调试命令和事件通知,包括设置断点单步执行查看变量等操作。

  • 调试器启动:IDE 启动调试器,并配置要连接的远程主机和端口
  • 应用启动:Java 应用以调试模式启动,并监听指定的端口
  • 建立连接:调试器与远程 JVM 通过套接字(Socket)建立连接
  • 协议通信:调试器通过 JDWP 向 JVM 发送调试命令,JVM 处理命令并返回结果

工作中我们的调试流程可能如下图:
在这里插入图片描述

开始配置

❶ 构建项目并配置启动参数部署

首先构建我们的 Spring Boot 项目,简单创建一个接口

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class JDWPController {

    @GetMapping("/jvm")
    public String testJvm(){
        System.out.println("调试进入");
        System.out.println("使用循环为了测试进行远程调试时远程程序依然是运行的状态");
        int count = 0;
        for (int i = 0; i < 10; i++) {
            try {
                count++;
                System.out.println("count:" + count);
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return "success";
    }
}

maven 打包构建项目,将 jar 文件在另外一台虚拟机上启动运行,命令如下
your-application.jar 替换你的 jar 包名称

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar your-application.jar

参数解释

  • -agentlib:jdwp:启用 JDWP 调试代理
  • transport=dt_socket:使用套接字进行通信
  • tserver=y:开启调试服务器模式
  • suspend=n:应用启动后不暂停,立即运行
  • address=*:5005:调试服务器监听在 5005 端口上(自行修改自己需要端口)

在这里插入图片描述
出现上图端口监提示,表示开启远程调试并且远程端口是5005

❷ 配置 IntelliJ IDEA

在项目中进行以下配置 Edit Configurations
在这里插入图片描述
弹出窗口 点击左上角的 + 号,选择 Remote JVM Debug,创建一个新的远程调试配置

在这里插入图片描述
主要简单配置几个参数 ,配置如下:
在这里插入图片描述
设置我们需要测试的接口断点,开启远程调试
在这里插入图片描述
温馨提示

如果出现 Unable to open debugger port 错误,是因为我们的远程服务器端口未开放
在这里插入图片描述
开放端口,博主以本地虚拟机 centos 为例:

# 开放5005端口
firewall-cmd --zone=public --add-port=5005/tcp --permanent

#重启firewall
systemctl restart firewalld

#查看开放端口
firewall-cmd --zone=public --list-ports

❸ 测试远程调试

上述步骤都完成且通过后,访问我们的测试接口 http://192.168.1.22:9090/api/jvm ,可以看到已经进入了我们本地代码的DEBUG

在这里插入图片描述

总结

通过本文的介绍,相信小伙伴们应该已经了解了在 IntelliJ IDEA 中进行远程调试 Java 程序的基本原理和具体步骤。

本文的代码主要是演示使用,小伙伴们可以根据自己业务需求进行修改升级。如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1802577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMware导入小白分享的MacOS版本之后,无法开机的解决方案

前言 这段时间陆续有小伙伴找到小白&#xff0c;说&#xff1a;导入小白分享的MacOS版本之后&#xff0c;出现无法开机的问题。 遇到这个问题&#xff0c;并不是说明分享版本有问题&#xff0c;因为大部分小伙伴导入之后都没有出现类似的问题&#xff0c;都是导入之后开机&…

VBA经典应用69例应用5:使用VBA冻结窗格

《VBA经典应用69例》&#xff08;版权10178981&#xff09;&#xff0c;是我推出的第九套教程&#xff0c;教程是专门针对初级、中级学员在学习VBA过程中可能遇到的案例展开&#xff0c;这套教程案例众多&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以便…

PaddleSpeech MFA:阿米娅中文音色复刻计划

PaddleSpeech&#xff1a;阿米娅中文音色复刻计划 本篇项目是对iterhui大佬项目[PaddleSpeech 原神] 音色克隆之胡桃的复刻&#xff0c;使用的PaddleSpeech的版本较新&#xff0c;也针对新版本的PaddleSpeech做了许多配置之上的更新并加入了自己对语音的对齐、配置、训练其它任…

Buildroot和Debian文件系统修改方法

本文档主要介绍在没有编译环境的情况下&#xff0c;如何修改buildroot和debian文件系统方法&#xff0c;如在buildroot文件系统中添加文件、修改目录等文件操作&#xff0c;在debian文件系统中&#xff0c;安装软件库、工具、扩大文件系统空间等等操作。 1.Debian文件系统 …

Java | Leetcode Java题解之第137题只出现一次的数字II

题目&#xff1a; 题解&#xff1a; class Solution {public int singleNumber(int[] nums) {int a 0, b 0;for (int num : nums) {b ~a & (b ^ num);a ~b & (a ^ num);}return b;} }

AndroidStudio无法识别连接夜神模拟器

方法一(无法从根本上解决) ①进入夜神模拟器安装路径下的bin路径(安装路径可以带有中文路径) ②打开cmd窗口,输入以下代码(一定要打开模拟器) nox_adb.exe connect 127.0.0.1:62001 方法二(根本上解决) 原因:Android Studio的adb版本与夜神模拟器的adb版本不一致 ①打开And…

【Unity】 HTFramework框架(五十一)代码片段执行器

更新日期&#xff1a;2024年6月8日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 Code Snippet Executer 代码片段执行器使用 Code Snippet Executer打开 Code Snippet Executer动态执行&#xff08;代码片段&#xff09;静态执行&#x…

core dump核心转储

检查核心转储是否开启&#xff0c;否则无法生成core文件 ulimit -a 如果为0就需要修改 ulimit -c 10240 写一个会触发core命令的程序 以浮点数运算为例 #include <iostream>int main() {int i 1/0; } 在编译时使用-g选项 运行程序&#xff0c;生成core文件 gdb调试 g…

本地部署GLM-4-9B清华智谱开源大模型方法和对话效果体验

GLM-4-9B是清华大学和智谱AI推出的最新一代预训练模型GLM-4系列中的开源版本。在语义、数学、推理、代码和知识等多方面的数据集测评中&#xff0c;GLM-4-9B及其人类偏好对齐的版本GLM-4-9B-Chat均表现出较高的性能&#xff0c;其通用能力评测结果甚至超越了Llama-3-8B开源大模…

如何解锁植物大战僵尸杂交版v2.0.88所有植物

如何解锁植物大战僵尸杂交版v2.0.88所有植物 前言安装相关软件快速解锁方法修改冒险模式修改挑战模式 前言 经过探索植物大战僵尸杂交版植物解锁和关卡有关&#xff0c;所以通过所有关卡就可以解锁所有植物。 安装相关软件 1.安装植物大战僵尸 2.安装Hex Editor Neo 快速解…

pytorch 加权CE_loss实现(语义分割中的类不平衡使用)

加权CE_loss和BCE_loss稍有不同 1.标签为long类型&#xff0c;BCE标签为float类型 2.当reduction为mean时计算每个像素点的损失的平均&#xff0c;BCE除以像素数得到平均值&#xff0c;CE除以像素对应的权重之和得到平均值。 参数配置torch.nn.CrossEntropyLoss(weightNone,…

【香橙派】Orange Pi AIpro体验——国产AI赋能

文章目录 &#x1f354;开箱&#x1f6f8;烧录镜像⭐启动系统&#x1f388;本机登录&#x1f388;远程登陆 &#x1f386;AI功能体验&#x1f50e;总结 &#x1f354;开箱 可以看到是很精美的开发组件 这里是香橙派官网 http://www.orangepi.cn/ 我们找到下面图片的内容&#…

uc/OS移植到stm32实现三个任务

文章目录 一、使用CubeMX创建工程二、uc/OS移植三、添加代码四、修改代码五、实践结果六、参考文章七、总结 实践内容 学习嵌入式实时操作系统&#xff08;RTOS&#xff09;,以uc/OS为例&#xff0c;将其移植到stm32F103上&#xff0c;构建至少3个任务&#xff08;task&#xf…

python有short类型吗

Python 数字数据类型用于存储数值。 Python 支持三种不同的数值类型&#xff1a;整型&#xff08;int&#xff09;、浮点型&#xff08;float&#xff09;、复数&#xff08;complex&#xff09;。 在其他的编程语言中&#xff0c;比如Java、C这一类的语言中还分有长整型&…

西米支付:刷卡手续费进入高费率时代! 十多家支付机构公布最新收费标准

《非银行支付机构监督管理条例》自5月1日施行以来&#xff0c;越来越多支付机构落实收费透明化。 支付界注意到&#xff0c;日前&#xff0c;拉卡拉、银联商务两家持牌支付公司公布了新的收单业务收费标准。 拉卡拉在其官网公布了最新的“收费项目及收费标准公示”&#xff0…

二叉查找树详解

目录 二叉查找树的定义 二叉查找树的基本操作 查找 插入 建立 删除 二叉树查找树的性质 二叉查找树的定义 二叉查找树是一种特殊的二叉树&#xff0c;又称为排序二叉树、二叉搜索树、二叉排序树。 二叉树的递归定义如下&#xff1a; &#xff08;1&#xff09;要么二…

CorelDraw安装时界面显示不全的解决方案

问题原因&#xff1a;安装包权限 解决方案&#xff1a; 1、安装包解压后&#xff0c;找到Setup文件&#xff0c;复制粘贴到当前文件夹并重命名为Getup后&#xff0c;右击Getup文件&#xff0c;选择“以管理员身份运行” 说明&#xff1a;除了命名Gsetup。还可以命名为其他的…

【Java】Java18的新特性

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

史上最有趣嫁妆:晋公盘的传奇

在遥远的春秋时代&#xff0c;晋国的晋文公为他的女儿用心打造了一件独特的嫁妆——晋公盘。 晋公盘由青铜制成&#xff0c;形状独特&#xff0c;工艺精湛。在晋公盘内底中央&#xff0c;一对精美的浮雕龙盘绕成圆形&#xff0c;盘上饰有鸟、龟、鱼、蛙等多种动物&#xff0c;最…

带你学习Mybatis之逆向工程

逆向工程 可以针对单表自动生成MyBatis执行所需要的代码&#xff0c;包括&#xff1a;Mapper.java&#xff0c;Mapper.xml&#xff0c;实体类&#xff0c;这样可以减少重复代码的编写 <dependency> <groupId>org.mybatis.generator</groupId> …