当前位置: 首页 > news >正文

如何对线上项目Debug

说明:本文介绍如何使用IDEA中的 Remote JVM Debug 功能对线上运行的项目Debug。

创建项目

创建一个测试项目,只有一个接口,该接口有一个BUG,如下:

(controller接口)

import com.hezy.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@Autowiredprivate HelloService helloService;@GetMapping("/hello")public String hello() {return helloService.printInfo();}
}

(service实现类,手动制造了一个BUG)

import com.hezy.service.HelloService;
import org.springframework.stereotype.Service;@Service
public class HelloServiceImpl implements HelloService {@Overridepublic String printInfo() {return print();}/*** 定义一个输出信息的方法*/public String print() {// 打印100个数字for (int i = 0; i < 100; i++) {System.out.println(i);}// 手动制造一个异常int i = 1 / 0;return "Hello World!";}
}

假设这个BUG我们没发现(嘿嘿),代码被我们推到测试环境跑,然后无意间调用该接口报错;

在这里插入图片描述

又假设这个BUG在本地无法复现,只有在线上环境才会出现,这时我们看着一堆日志无法排查;

在这里插入图片描述

在这里插入图片描述

远程Debug

进入正题,针对上面的情况,我们可以考虑使用IDEA的远程Debug功能,如下:

(1)新增远程Debug应用

进入Configuration窗口

在这里插入图片描述

新增一个启动项,选择Remote JVM Debug,即远程Debug

在这里插入图片描述

设置相关信息,端口号使用默认的5005即可,如有需要,可手动修改。另外注意一下JDK版本;

在这里插入图片描述

(2)线上项目Debug启动

另外,线上的项目需要Debug启动,如果是脚本或者命令行的方式启动的,可在对应的jar前面加上下面这行配置:

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

注意上面这行配置是在前面的配置窗口里中拷贝过来的,不要手敲:

在这里插入图片描述

(3)Debug启动

启动服务器上面的项目,可以看到首行有监听5005端口的信息:

在这里插入图片描述

在项目中启动远程Debug程序,没有报错,另外可以看到打的断点都卡住了。

在这里插入图片描述

这时,再调用一下线上项目的接口,断点进入到本地IDEA中了:

在这里插入图片描述

非常Nice,这时就可以排查问题了。

在这里插入图片描述

总结

本文介绍了如何使用IDEA中的Remote JVM Debug功能对线上的项目进行Debug,排查BUG。本文案例在个人的云服务器上演示,大家操作,需要注意开放相关接口(8080、5005)。

相关文章:

  • C语言希尔排序详解!!!速过
  • redis的缓存穿透,缓存并发,缓存雪崩,缓存问题及解决方案
  • 【MySQL】事务的一致性究竟怎么理解?
  • Spring Boot项目打包及依赖管理-瘦身
  • css中选择器的优先级
  • flink operator 1.7 更换日志框架log4j 到logback
  • 最近火的一键穿衣AI,这款服装设计软件也不赖
  • 【动态规划专栏】专题二:路径问题--------6.地下城游戏
  • 2024-02-20(数位DP)
  • RuntimeError: CUDA out of memory.【多种场景下的解决方案】
  • Delphi语言教程
  • Uipath 读取Word模板实现录用通知书PDF批量生成
  • CSS篇--transform
  • 基于Java SSM框架实现老年人食谱管理系统项目【项目源码+论文说明】
  • 微众银行:始于数字原生,立于普惠金融
  • Node + FFmpeg 实现Canvas动画导出视频
  • React Native移动开发实战-3-实现页面间的数据传递
  • spring-boot List转Page
  • supervisor 永不挂掉的进程 安装以及使用
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 你不可错过的前端面试题(一)
  • 移动端唤起键盘时取消position:fixed定位
  • 以太坊客户端Geth命令参数详解
  • 国内开源镜像站点
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • !!java web学习笔记(一到五)
  • #、%和$符号在OGNL表达式中经常出现
  • #1014 : Trie树
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (2015)JS ES6 必知的十个 特性
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (笔试题)合法字符串
  • (蓝桥杯每日一题)love
  • (力扣)1314.矩阵区域和
  • (七)Knockout 创建自定义绑定
  • (四)Android布局类型(线性布局LinearLayout)
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • *Django中的Ajax 纯js的书写样式1
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET4.0并行计算技术基础(1)
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • //解决validator验证插件多个name相同只验证第一的问题
  • @RequestBody与@ModelAttribute
  • @RequestMapping-占位符映射
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [145] 二叉树的后序遍历 js
  • [1525]字符统计2 (哈希)SDUT