【IDE】【实战系列】掌握这些技巧发现阅读源码不过如此简单

news2025/3/9 10:41:00

文章目录

  • IDE 版本
  • 前言
  • IDE Debug
    • 主界面介绍
    • 字段断点(field breakpoints)
      • 使用方式
      • 配置
        • Enabled
        • Suspend
        • Log
    • 行断点(line breakpoints)
      • 使用方式
      • 配置方式
    • 方法断点(method breakpoints)
      • 使用方式
      • 配置方式
    • 异常断点(exception breakpoints)
      • 使用方式
      • 配置方式
  • IDE Debug 调试技巧
    • 1、排查一个隐蔽错误时到处打印日志?如果是第三方源码怎么办呢?下载源码调试?
    • 2、源码调试时,一个类有多个实现,我们想知道调用了哪个实现?一步步断点进去?
    • 3、源码调试时,调用链路很长,一不小心调用到哪里去了怎么办?我以前曾经被绕晕过
    • 4、源码调试时想跳过某段逻辑执行自己的逻辑怎么办呢?
    • 5、调试程序中某个变量在哪里被改变或者被访问?
    • 6、如何进行多线程断点调试?
  • 个人简介

IDE 版本

  • 2023.1(Ultimate Edition)

前言

在这里插入图片描述

  • 不知道大家对这样一张图片是不是很熟悉,当我们的程序需要排查一个很隐蔽的问题时,各处打印日志进行排查错误,排查完之后又将所有的排查日志进行一个一个删除。不知道你们有没有干过,我以前是经常这么干哈哈哈。
  • 在分享之前,大家可以先思考一下以下几个问题,看看大家在日常工作中是怎么处理的,我会在文章末尾给出一些解决思路供大家参考:
1、排查一个隐蔽错误时到处打印日志?如果是第三方源码怎么办呢?下载源码调试?
2、源码调试时,一个类有多个实现,我们想知道调用了哪个实现?一步步断点进去?
3、源码调试时,调用链路很长,一不小心调用到哪里去了怎么办?我以前曾经被绕晕过
4、源码调试时想跳过某段逻辑执行自己的逻辑怎么办呢?
5、调试程序中某个变量在哪里被改变或者被访问?
6、如何进行多线程断点调试?

IDE Debug

  • IDE Debug 是一个非常强大的功能,可以帮助我们非常便捷的进行程序调试,支持 字段断点、行断点、方法断点、异常断点等 多种调试方式,下面我们来看看如何正确的使用这些调试方式。

主界面介绍

  • 我们先看看 Debug 的主界面:

在这里插入图片描述

  • 横向功能区

1694963256344.png

Show Execution Point (Alt + F10):如果你的光标在其它行或其它页面,点击按钮可跳转到当前代码执行所在行。
Step Over (F8):步过,一行一行地往下走,如果这一行上有方法不会进入方法。
Step Into (F7):步入,如果当前行有方法,可以进入方法内部。
Step Out (Shift + F8):步出,从步入的方法内退出到方法调用处,此时方法已执行完毕。
Drop Frame (默认无):回退断点,后面章节详细说明。
Run to Cursor (Alt + F9):运行到光标处,你可以将光标定位到你需要查看的那一行,然后使用这个功能,代码会运行至光标行,而不需要打断点。
Evaluate Expression (Alt + F8):计算表达式,用于执行自己想执行的代码,这个是一个比较重要的功能。
Trace Current Stream Chain:用于 Stream 调试。
  • 纵向功能区

1694964769173.png

Rerun 'xxxx':重新 Debug 程序,会关闭服务后重新启动程序进行 Debug。
Modify Run Configuration:更改程序运行配置。
Resume Program (F9):恢复程序继续运行,若有断点则会运行到下一个断点,若无断点,则直接运行到程序结束。
Pause Program:暂停程序,以便检查代码的运行情况、查看变量的值。
Stop 'xxx' (Ctrl + F2):关闭程序。
View Breakpoints (Ctrl + Shift + F8):查看所有断点。
Mute Breakpoints:失效断点,选择这个后,所有断点变为灰色,断点失效,按F9则可以直接运行完程序。再次点击,断点变为红色,有效。如果只想使某一个断点失效,可以在断点上右键取消Enabled。
Get Thrad Dump:获取线程转储或线程快照,用于获取线程的堆栈信息。

字段断点(field breakpoints)

  • 当指定的字段被读取或修改时会进入断点,暂停程序,常用于观察变量在何处被修改和访问。
对方法内部的局部变量无法使用字段断点,只能使用行断点,可以使用 Condition 条件判断实现这个字段监测功能。

使用方式

  • 在需要断点的字段前左键点击,会出现一个眼睛的标志。

1694965069865.png

配置

  • 右键眼睛标志,选择 More 进行配置。

在这里插入图片描述

  • 上面是一些 字段断点、行断点、方法断点 的通用配置,字段断点的特性化配置在于 Field access、Field Modification ,即当字段被访问或被修改时进入断点,在观察变量什么时候被使用和什么时候被修改时十分有用。
Enabled
  • 是否启用断点。
Suspend
  • 当断点的 Suppend 属性被勾选,触发该断点时,程序挂起;当该属性未选中时,程序触发该断点时,程序不会挂起。常用于和Log联合使用,在不暂停程序的情况输出打印日志。
当断点的 All 属性被勾选,触发该断点时,会挂起所有线程;
当断点的 Thead 属性被勾选,触发该断点时,只会挂起触发该断点的那个线程,不影响其他线程;
Log
  • Log 是一个很有用的属性,可以帮助我们在不修改源码的情况下,打印排查日志。
  • 常见的两个配置项:
Breakpoint hit message:触发断点是打印日志信息
Stack trace:输出触发断点时的堆栈信息
  • 示例:

1694993713805.png

// Breakpoint hit message
Breakpoint reached at org.example.TestA.main(TestA.java:17)
// Stack trace
Breakpoint reached
	at org.example.TestA.main(TestA.java:17)
// Evaluate and log 计算表达式和日志
执行methodA 前 monitorNum = 1

行断点(line breakpoints)

  • 在指定代码行设置断点,程序在到达设置断点的代码行时暂停程序。这种类型的断点可以设置在任何可执行的代码行上。这是我们最常使用的断点方式。

使用方式

  • 在需要断点的行前左键点击,会出现一个红色的小圆点。

1694965954453.png

配置方式

  • 右键小圆点标志,选择 More 进行配置,主要是一些通用化配置,无特殊配置。

1694966113867.png

方法断点(method breakpoints)

  • 在进入某个方法或者退出某个方法时暂停程序进行断点。
  • 这个功能在阅读源码时非常有用,比如一个接口有很多的实现类,我们并不知道实际调用了哪个方法,我们可以使用方法断点直接进入实际使用的实现类方法中。

使用方式

  • 在定义的方法名或接口方法前左键点击,会出现一个菱形。

在这里插入图片描述

配置方式

  • 右键菱形标志,选择 More 进行配置。

1694966694552.png

Emulated:会将方法断点优化成方法中第一条和最后一条语句的行断点,这样会优化调试的性能,因此在IDE中会默认选中。
Method Entry:方法进入第一行时进行断点。
Method exit:方法退出时最后一条语句进行断点。

异常断点(exception breakpoints)

  • 异常断点和上述几种断点不同,不会与源代码映射,而是程序抛出异常时就会激活对应的异常断点,属于程序级别断点。
  • 在我们程序调试的时候推荐开启这个功能,帮助我们在异常发生时观察变量的状态,以及如何发生的,而不需要重新运行程序 Debug 进行断点。
异常断点分为两类:
1、Any Exception,任意Throwable异常被捕获或未被捕获就会触发断点
2、指定类型的异常及其该异常子类被捕获或未被捕获会触发断点

使用方式

  • 点击 View Breakpoints,添加异常断点。

在这里插入图片描述

在这里插入图片描述

配置方式

Caught exception:当指定的异常被捕获时,触发断点程序挂起;
Uncaught exception:当指定的异常未被捕获时,触发断点程序挂起;

IDE Debug 调试技巧

1、排查一个隐蔽错误时到处打印日志?如果是第三方源码怎么办呢?下载源码调试?

  • 我们可以使用 Log 打印辅助日志而不用改动源码。

2、源码调试时,一个类有多个实现,我们想知道调用了哪个实现?一步步断点进去?

  • 我们可以使用 方法断点(method breakpoints)在进入方法和退出方法时断点,帮助我们快速找到实际调用的类。

3、源码调试时,调用链路很长,一不小心调用到哪里去了怎么办?我以前曾经被绕晕过

  • 这里介绍 debug 的另一个功能 BookMarks(书签),可以帮助我们整理排序我们整个流程,并进行快速跳转。

  • 在需要标记位置右键添加书签并制定快捷键。

在这里插入图片描述

  • 按快捷键 Ctrl + 3、Ctrl + 4 快速跳转待对应标签处,并支持拖动标签按照我们想要的顺序显示。

4、源码调试时想跳过某段逻辑执行自己的逻辑怎么办呢?

  • 这里有几种思路:
  • 1、如果需要增加逻辑进行简单的调试可以使用上面的提到的一个重要工具 Evaluate Expression(计算表达式)这个工具我们执行我们的代码。

在这里插入图片描述

  • 2、Evaluate Expression(计算表达式)支持一些简单的改动,如果需要大量改动源代码(比如删除某段逻辑),且如果是第三方代码库时(不下载源代码的情况下),我们可以考虑另外两种思路:1、现在第三方框架有很多拓展点,在拓展点引入我们的类。2、是否支持 SPI 使用 SPI 的方式注入。

5、调试程序中某个变量在哪里被改变或者被访问?

  • 类属性我们可以使用 字段断点(field breakpoints)的 Field access、Field Modification 功能。
  • 方法内的局部变量我们可以使用,Condition 条件表达式,在一些循环处理逻辑中十分有效,可以帮助我们快速跳断点到我们想要的变量状态时刻。

6、如何进行多线程断点调试?

  • 使用 Suspend 功能根据我们实际需求进行断点调试。

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

📖 保持关注我的博客,让我们共同追求技术卓越。

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

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

相关文章

Linux编译器---gcc/g++的使用

一、背景知识 在Linux系统中,GCC是一个非常重要的工具,因为它使得开发者可以使用C和C等语言编写高性能的程序。它主要包括四个方面: 预处理(进行宏替换) 编译(生成汇编) 汇编(生成机器可识别代码&#xff0…

ECharts:显示暂无数据

ECharts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求,实现各种炫酷的统计图表效果。 如上图所示,有数据的时候固然好看,但是当它没有数据的时候,就是光秃秃的一片,所…

Peter算法小课堂—自定义容器

太戈编程第308题 暴力法 cin>>n>>m; for(int i0;i<n;i) cin>>name[i]>>year[i]; for(int i0;i<m;i){int x;string y;cin>>x>>y;int OK0;for(int j0;j<n;j){if(name[j]y&&year[j]x){OK1;break;}}cout<<OK<<…

彭州市民政局“四个聚焦” 推动未成年人保护工作

聚焦机制完善。以“六大保护”为主导&#xff0c;聚焦“27&#xff08;市级部门&#xff09;13&#xff08;镇、街道&#xff09;”整体联动&#xff0c;定期开展信息交流会、跨部门协同工作培训会等活动&#xff0c;不断健全协调机制、完善协同体系&#xff0c;进一步提升全市…

springboot vue mysql的在线竞拍拍卖系统

基于SpringBoot的在线拍卖系统,springboot vue mysql (毕业论文10168字以上,共34页,程序代码,MySQL数据库) 【运行环境】 IDEA, JDK1.8, Mysql, Node, Vue 【技术栈】 Java, SpringBoot, Jquery, Layui, MYSQL, HTML, CSS, JAVASCRIPT, Ajax 7707 java毕业设计 springboot v…

进博会再现上亿大单 EZZ携手HIC海橙嗨选签署2024年度合作备忘录

正在举行的第六届中国国际进口博览会上&#xff0c;再现上亿大单。11月6日&#xff0c;在澳大利亚新南威尔士州政府代表的见证下&#xff0c;澳交所基因组龙头上市公司EZZ生命科学和中国跨境社交电商龙头HIC海橙嗨选签署2024合作备忘录&#xff0c;在未来的一年&#xff0c;EZZ…

vue 数字软键盘 插件 封装 可拖动

1、效果图 2、使用方式 <Keyboard v-if"show" close"show false" :inputDom"$refs.input" /> 封装的数字键盘 Keyboard.vue 组件代码 <template><divclass"keyboard"ref"keyboard":style"{ left: …

日本it培训班,如何选择靠谱的赴日IT培训班?

随着科技的发展&#xff0c;信息技术行业在全球范围内迅速发展&#xff0c;并呈现出蓬勃的发展态势&#xff0c;在日本&#xff0c;IT行业也成为一种极为热门的职业选择。日本专门学校在这个领域内培养了许多IT从业者&#xff0c;成为了众多IT公司的培养基地。如果你对IT产业感…

【前端异常】JavaScript错误处理:分析 Uncaught(in promise) error

这里写目录标题 一、Promise是什么二、什么是 Uncaught(in promise) error三、解决方案3.1 使用catch方法处理Promise的错误3.2 使用 async/await 处理Promise的错误3.3 全局异常处理 四、结论 在开发过程中&#xff0c;JavaScript的错误处理是一个老生常谈的话题。当应用程序发…

AI机器人软件定制流程

一、项目概述 AI机器人软件定制流程是根据客户的需求&#xff0c;定制开发一款具有人工智能功能的机器人软件。本方案将详细介绍AI机器人软件定制的整个流程&#xff0c;包括需求分析、设计、开发、测试和交付等环节。 二、需求分析 在定制AI机器人软件之前&#xff0c;需要…

Linux系统上配置MySQL自动备份

1、编写Shell脚本&#xff0c;并保存为.sh文件 #!/bin/bash# 获取当前日期和时间 current_date$(date %Y%m%d) current_time$(date %H%M%S)# 设置备份文件名 path"/usr/local/mysql5.7/bak" bakFileName"dbname_backup_${current_date}_${current_time}.sql&qu…

阿里云国际站:应用实时监控服务

文章目录 一、阿里云应用实时监控服务的概念 二、阿里云应用实时监控服务的优势 三、阿里云应用实时监控服务的功能 四、写在最后 一、阿里云应用实时监控服务的概念 应用实时监控服务 (Application Real-Time Monitoring Service) 作为一款云原生可观测产品平台&#xff…

React Native简介 说明为什么要学习React Native

首先 什么是 React Native &#xff1f; React Native 是 Facebook 在 React.js Conf 2015 上推出了开源框架 React Native (简称 RN)是 React 的一个原生 (Native) 扩展 它允许我们通过 React 语法&#xff0c;来开发ios 和Android 原生应用 简单说 由Facebook发布 是一种Re…

笔尖笔帽检测1:笔尖笔帽检测数据集(含下载链接)

笔尖笔帽检测1&#xff1a;笔尖笔帽检测数据集(含下载链接) 目录 笔尖笔帽检测1&#xff1a;笔尖笔帽检测数据集(含下载链接) 1. 前言 2. 手笔检测数据集 &#xff08;1&#xff09;Hand-voc1 &#xff08;2&#xff09;Hand-voc2 &#xff08;3&#xff09;Hand-voc3 …

【OpenCV(3)】linux arm aarch 是 opencv 交叉编译与使用

文章目录 1、直接找github 别人编译好的2、自主编译参考 3使用CMake检查 参考 1、直接找github 别人编译好的 测试很多&#xff0c;找到一个可用的。 https://github.com/dog-qiuqiu/libopencv 它用了超级模块&#xff01; OpenCV的world模块也称为超级模块&#xff08;supe…

gStore入选BenchCouncil年度世界开源系统杰出成果

“只以贡献分高下” BenchCouncil&#xff08;国际测试委员会&#xff09; 邀请了多位独立科学家 从2022至2023年度数万项开源相关成果中 遴选出了102项代表性成果 在确定主要贡献者的基础上 产生了开源领域 年度人才榜、机构榜、国家榜 共195人进入榜单 中国在“开源…

Marin说PCB之 PCB封装和原理图封装的藕断丝连

最近天气开始降温了&#xff0c;小编我不得不拿出珍藏多年的秋裤穿上了&#xff0c;就是走路不太方便&#xff0c;有点紧啊&#xff0c;可能是当时衣服尺码买小了吧&#xff0c;不可能是我吃胖了&#xff0c;这个绝对不可能。 话说小编我今年属实有点走霉运啊&#xff0c;下班和…

Camtasia2024全新中文版电脑录屏工具

在这个视频的大舞台上&#xff0c;每一帧都是你炫耀的机会&#xff0c;每一秒都是让观众瞪大眼睛的瞬间。现在&#xff0c;让我们一起飞跃时空&#xff0c;用更少的时间创作更多的惊喜吧&#xff01; 就算你是个小白&#xff0c;毫无经验&#xff0c;别担心&#xff0c;Camtas…

Jmeter添加变量的四种方法

一、在样本中添加同请求一起发送的参数。根据服务器设置的数据类型&#xff0c;来添加不同类型的参数 二、用户定义的变量 1、创建&#xff1a;添加->配置元件->用户定义的变量 2、作用&#xff1a;当前的线程组内所有Sampler都可以引用变量&#xff0c;方便脚本更新&a…

2023年阿里云服务器最新日常价、活动价格、可使用优惠券金额及券后价格参考

阿里云服务器最新实际购买价格参考&#xff0c;轻量应用服务器2核2G3M带宽配置日常价720.00元/1年&#xff0c;最新活动价格为87元/1年&#xff0c;订单满300元以上即可使用满减优惠券&#xff0c;例如经济型e实例2核4G2M带宽日常价格为1802.40元&#xff0c;最新的活动价格为8…