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

文章目录

  • 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编程。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

datax 搭建使用

文章目录 datax 环境搭建使用一、解压文件二、配置 json 文件三、执行命令 datax 环境搭建使用 用于全量同步 一、解压文件 将包上传至服务器 输入命令: tar -zxvf datax.tar.gz -C /opt/module/ 将包 解压到 /opt/module 目录 解压完之后,不需要任何…

在线教育与跨境电商:数字时代的知识传播

随着数字技术的不断发展和全球互联网的普及,在线教育和跨境电商在数字时代崭露头角,共同推动了知识的全球传播。 这两个领域的结合为学生、教育者和知识提供者创造了新的机遇和可能性,同时也带来了一系列有趣的挑战。本文将深入探讨在线教育…

【01】Istio-1.17 部署

1.1 部署Istio控制平面 部署方法 istioctl istio的专用管理工具,支持定制控制平面和数据平面通过命令行的选项支持完整的IstioOperator API命令行各选项可用于单独设置,以及接收包含IstioOperator自定义资源(CR)的yaml文件 Istio Operator Istio相关的自…

linux 安装 mini conda,linux下安装 Miniconda

下载地址 https://docs.conda.io/projects/miniconda/en/latest/index.html 安装conda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh bash ~/miniconda3/miniconda.sh -b -u -p ~/mini…

数据结构上机实验——图的实现(以无向邻接表为例)、图的深度优先搜索(DFS)、图的广度优先搜索(BFS)

文章目录 数据结构上机实验1.要求2.图的实现(以无向邻接表为例)2.1创建图2.1.1定义图的顶点、边及类定义2.1.2创建无向图和查找2.1.3插入边2.1.4打印函数 2.2图的深度优先搜索(DFS)2.3图的广度优先搜索(BFS&#xff09…

C/C++ #define与编译器的预处理

文章目录 预处理#define新版本特性旧版本特性#define除了定义明示常量的其他用途 #define的组成#define本身:预处理指令宏替换列表或替换体宏展开 参考资料 预处理 在预处理之前,编译器必须对该程序进行一些翻译处理。首先,编译器 把源代码中…

WampServer下载安装并结合内网穿透实现本地服务的公网访问

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站,…

【Kettle实战】数据分批处理及参数化传递子作业任务

对于大表操作,本来离线数据需要分批处理,刚开始只会用具体日期去做,通过复制多分转换和作业来处理。当日期范围大了后,这是个苦力活儿,kettle里面有参数化传递功能,多动手实操,懂得灵活变通自然…

宝塔开心版hostcli的广告去除

首先感谢hostcli把宝塔7.6剥离了,直接安装我这里是缺少pyenv的包。 直接进入正题吧。 定位到页面左下方的广告位于 /www/server/panel/BTPanel/templates/default/layout.html “退出”按钮下方有条线开始去掉 去掉之前的忘了截图了,就这样吧&#xff…

力扣每日一道系列 --- LeetCode 160. 相交链表

📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅LeetCode每日一道 🌅 有航道的人,再渺小也不会迷途。 文章目录 LeetCode 160. 相交链表 思路: 首先计算两个链表的长度,然后判…

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

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

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

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

高效筛选的秘密武器:JVS智能BI的‘and’与‘or’逻辑

在这个信息爆炸的时代,数据被誉为新时代的黄金和石油,蕴含着无尽的价值和潜力。然而,随着数据的爆炸式增长,如何高效、准确地从海量数据中提取出真正有价值的信息,成为摆在我们面前的一大挑战。我们需要用数据筛选工具…

虚拟仪器软件结构VISA

1、什么是VISA VISA是虚拟仪器软件结构(Virtual Instrument Software Architectuere)的简称,是由VXI plug & play系统联盟所统一制定的I/O接口软件标准及其相关规范的总称。一般称这个I/O函数库为VISA库(用于仪器编程的标准I/O函数库)。…

链动2+1模式系统开发之区域代理深度解析

区域代理的保护机制:在链动商城系统里设定的代理有唯一性,每个省只有一个省代,每个市只有一个市代,每个区县只有一个区县代。这样也是保护每个代理的收益权益。 区域代理包含的权益类别:购物奖励折扣;区域实…

OpenAI DALL·E 3文生图模型技术揭秘(建议收藏)

欢迎来到魔法宝库,传递AIGC的前沿知识,做有格调的分享❗ 喜欢的话记得点个关注吧! DALLE 3是OpenAI发布的一款文生成图AI系统,它无缝接入ChatGPT,通过接受文本提示作为输入,生成相应的图像作为输出。先来看…

字典管理怎么使用,vue3项目使用若依的的字典管理模块

若依框架数据字典的使用_若依数据字典_哈哈水水水水的博客-CSDN博客 【精选】关于数据字典的理解与设计_数据字典怎么设计-CSDN博客 若依的字典值如何使用(超详细图文教程)_若依字典管理_丿BAIKAL巛的博客-CSDN博客 Vue3组合式API:getCurr…

基于ssm的高校失物招领管理系统

基于ssm的高校失物招领管理系统 摘要 失物招领管理系统是一种利用现代信息技术,为高校提供高效、便捷的失物招领服务的平台。本系统基于SSM框架(Spring SpringMVC MyBatis),充分利用了各框架的优势,实现了系统的稳定…

Docker 和 Kubernetes:技术相同和不同之处

Docker和Kubernetes是当今最流行的容器化技术解决方案。本文将探讨Docker和Kubernetes的技术相似之处和不同之处,以帮助读者更好地理解这两种技术。 Docker和Kubernetes:当今最流行的容器化技术解决方案 在当今的IT领域,Docker和Kubernetes无…

Python实现WOA智能鲸鱼优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…