IDEA优雅debug
目录
- 引言
- 一、断点分类🎄
- 1.1 行断点
- 1.2 方法断点
- 1.3 属性断点
- 1.4 异常断点
- 1.5 条件断点
- 1.6 源断点
- 1.7 多线程断点
- 1.8 Stream断点
- 二、调试动作✨
- 三、Debug高级技巧🎉
- 3.1 watch
- 3.2 设置变量
- 3.3 异常抛出
- 3.4 监控JVM堆大小
- 3.5 数组过滤和筛选
引言
使用IDEA进行调试的基础知识和高级用法。调试(debug)是开发中最快解决问题的方式。详细介绍了IDEA中的四种基本断点类型,并介绍了8种不同类型的断点,包括条件断点、原断点、多线程断点、Stream断点等。通过这些断点,开发者可以更好地控制代码的运行流程,以找到问题所在。这些知识可以帮助开发者更高效地进行调试和排错。
一、断点分类🎄
1.1 行断点
在 IntelliJ IDEA 中,行断点(Line Breakpoint)是一种最常见的调试工具,用于在代码中的某一行设置一个中断点,以便调试程序时暂停执行,从而检查程序的状态。
使用
当你在调试模式下运行程序时,程序会在设置的断点处停止执行。
在调试过程中,你可以:
- 查看变量值:在“变量”窗口中查看当前的局部变量和全局变量的值。
- 检查堆栈:查看调用堆栈信息,了解程序执行的调用顺序。
- 控制程序流:使用工具栏中的控制按钮(如继续、单步执行等)来控制程序的执行流程。
1.2 方法断点
方法断点(Method Breakpoint)是 IntelliJ IDEA 中的另一种调试工具,用于在方法的入口或出口处暂停程序的执行。与行断点不同,方法断点无需指定具体的代码行,而是直接绑定到方法本身,在进入和退出方法都会在断点处被停止。
使用
触发时机:
- 方法断点可以在方法 调用时(入口) 或 方法返回时(出口) 暂停程序。
- 支持捕获方法的所有调用方,无论调用来自哪里。
适用场景:
- 调试一个方法被调用的频率或调用路径。
- 检查某方法的入参和返回值。
- 分析哪些地方调用了方法(特别是工具类或公共方法)。
性能开销:
- 方法断点性能较低,特别是高频调用的方法,可能导致调试器反应缓慢或程序变卡。因此,慎用方法断点。
1.3 属性断点
属性断点(Field Breakpoint 或 Watchpoint)是 IntelliJ IDEA 中的一种断点类型,专门用于监控某个字段(属性)的 值变化 或 访问。当程序对指定的属性执行读取(Read)或写入(Write)操作时,调试器会暂停程序,允许你查看运行状态。
使用
触发时机:
- 读操作(Field Access):当代码读取该字段的值时触发。
- 写操作(Field Modification):当代码对该字段的值进行修改时触发。
适用场景:
- 检查属性的值何时被读取或修改。
- 排查意外的属性值变化问题(如多线程导致的值被修改)。
- 监控静态字段或常用的全局变量。
性能开销:
- 属性断点可能会对性能产生较大的影响,特别是高频访问的字段。因此,建议在调试时使用,调试结束后移除或禁用。
在属性处打上断点,并右键断点并勾选Field access,此时以debug模式运行,所有属性发生变化的方法中的行都会被拦截
1.4 异常断点
异常断点(Exception Breakpoint)是 IntelliJ IDEA 提供的一种调试工具,用于在程序抛出指定异常时自动暂停程序的执行,无论异常发生在何处。这对于排查未捕获异常或异常传播链是非常高效的工具,这个断点在排查报错抛异常时,非常好用!!!它可以捕获所有异常,也可以捕获指定异常(此处以最常见的空指针为例)
使用
触发时机:
- 当程序抛出指定异常时(无论是否被捕获)。
- 默认情况下,只在异常未被捕获(Uncaught)时触发,但可以配置为 在捕获时(Caught) 也暂停。
适用场景:
- 调试运行时异常(如
NullPointerException
、IllegalArgumentException
)。 - 追踪异常是如何发生的以及调用链。
- 排查捕获异常后处理逻辑的行为。
作用范围:
- 异常断点适用于整个应用,无需手动在每个方法中设置断点。
使用快捷键ctrl+shift+f8(部分机型为ctrl+shift+f8+fn)打开断点面板,点击左上角的"+",添加Java Exception BreakPoint,再输入NullPointerException
此时,不用在代码中手动打断点,当出现空指针时,会自动定位到出现空指针的代码行
1.5 条件断点
条件断点(Conditional Breakpoint)是调试器中的一种高级功能,用于在断点设置的代码位置,只有满足指定条件时才会暂停程序的执行。这使得调试更加高效,因为你可以过滤掉不感兴趣的程序状态,聚焦于特定情况。
使用
触发条件:
- 断点会在指定的代码行被执行时,检查用户提供的条件表达式。
- 只有条件表达式的结果为
true
时,断点才会触发。
适用场景:
- 跟踪某一特定值时的代码行为。
- 排查循环中某些特定迭代的异常问题。
- 监控特定条件下的变量值或状态。
无干扰调试:
- 避免程序在每次执行断点时都暂停,只在条件满足时中断,减少不必要的干扰。
在你需要打打断点的代码行打上断点,右键,输入条件,当条件为true时,断点才会生效。
此处,在for循环中i等于5时,断点才会生效,否则继续执行。
1.6 源断点
设置这个断点,只需按住shift+鼠标左键,并设置需要输出的到控制台的变量
运行时,程序不会在断点处停止,但是会把设置的变量都打印到控制台。
1.7 多线程断点
多线程断点 是调试器在多线程环境中提供的一种功能,用于帮助开发者调试和分析多线程程序的行为。由于多线程程序中的代码会被多个线程并发执行,断点可能会在不同的线程上触发,调试起来相对复杂。
使用
线程相关性:
- 断点可以在特定线程上触发,也可以暂停所有线程。
- 可以查看和分析不同线程的调用堆栈和变量状态。
独立线程调试:
- IDEA 允许你选择仅调试特定线程而不影响其他线程。
线程竞争分析:
- 配合条件断点和日志功能,可以分析线程间资源竞争和同步问题。
分别在两处多线程的代码行,打上断点,并右键断点选择Thread
开始运行时,可以手动切换线程运行顺序,以此模拟线程的轮询执行
1.8 Stream断点
在使用了Stream流式操作的语句上打上断点,此时我们先过滤大于5的数字,在过滤小于8的数字
点击菜单,选择Trace Current Stream Chain,此时将会展示整个流式操作处理。
二、调试动作✨
- Step Over:一行一行的执行代码,不会进入方法中,但是方法中有断点时,会进入方法内的断点中
- Force Step Over:一行一行的执行代码,和Step Over最大的区别时,就算方法中存在断点也不会进去。
- Step Into:进入方法内部,外部jar包无法进入
- Force Step Into:进入方法内部,也可以进入外部jar包
- Smart Step Into:当一行代码中存在多个方法,比如方法嵌套,使用Smart Step Into可以任意选择进入想要进入的方法。
- Step Out:当进入方法内部时,使用Step Out可以退出至方法调用处。
- Setp Out of Block:当调试for循环或while循环时,可以使用它跳出循环
- Run to Cursor:跳到鼠标光标所在处(相当于,鼠标在的位置打了断点),但是前一个执行到的位置和光标之间还有断点时,就会先跳转到中的断点处
- Force Run to Cursor:强制跳到光标所在位置,哪怕前一个执行到的位置和光标之间还有断点时,也会直接跳到光标的位置(忽略中途的断点)
- Force return:当debug时,想要结束运行,但是后面的代码仍然会执行(有插入数据的操作时,不想执行后面的插入数据的代码,又不想结束项目),这时可以使用它来强制返回,返回值为void时,直接结束,有返回时,直接输入null,返回空就行。
- Resume Program:一直执行到下一个断点,直到程序结束或方法调用完成。
三、Debug高级技巧🎉
3.1 watch
在 IntelliJ IDEA 中,Watch(监视) 是一个非常强大的调试功能,它可以帮助你实时观察变量、表达式或方法的值,尤其在复杂的调试场景中非常有用。
使用
在debug时,右键想要监视的变量,点击Add to Watchs,idea就会将监视的变量单独列出
注意:如果监视了变量但红色框中的区域没有出现,需要手动开启,点击红框上方的Layout setting,再勾选watches即可
3.2 设置变量
当在有if判断时,如果触发true的代码非常复杂,则可以使用变量设置来修改if的判断条件,或者当传参时某一个变量或对象缺失,可以直接设置变量来查看代码运行的效果。
将其修改为true
3.3 异常抛出
当我们希望测试抛出异常后的代码逻辑,就可以使用debug中的throw exception
此时手动抛出一个空指针异常
此时便可以捕获到异常观察异常抛出后的代码逻辑
3.4 监控JVM堆大小
该方法可以监控JVM创建了多少次实例,没有该面板的话需要点击上方的layout setting打开(和watches打开方式相同)
3.5 数组过滤和筛选
在使用数组或列表时(Map也可以),想要观察某个特定的对象是否存在,可以使用筛选的功能通过表达式将其筛选出来。
通过表达式将其筛选出(写表达式时,需要注意其中的元素类型)
相关文章:

IDEA优雅debug
目录 引言一、断点分类🎄1.1 行断点1.2 方法断点1.3 属性断点1.4 异常断点1.5 条件断点1.6 源断点1.7 多线程断点1.8 Stream断点 二、调试动作✨三、Debug高级技巧🎉3.1 watch3.2 设置变量3.3 异常抛出3.4 监控JVM堆大小3.5 数组过滤和筛选 引言 使用ID…...

wp the_posts_pagination 与分类页面搭配使用
<ul> <?php while( have_posts() ) : the_post(); <li > <a href"<?php the_permalink(); ?>"> <?php xizhitbu_get_thumbnail(thumb-pro); ?> </a> <p > <a href&q…...

大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop࿰…...

【Python】分割秘籍!掌握split()方法,让你的字符串处理轻松无敌!
在Python开发中,字符串处理是最常见也是最基础的任务之一。而在众多字符串操作方法中,split()函数无疑是最为重要和常用的一个。无论你是Python新手,还是经验丰富的开发者,深入理解并熟练运用split()方法,都将大大提升…...

免费实用在线AI工具集合 - 加菲工具
免费在线工具-加菲工具 https://orcc.online/ 在线录屏 https://orcc.online/recorder 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA1/SHA256…) 计算 https://orcc.online/h…...

正则表达式灾难:重新认识“KISS原则”的意义
RSS Feed 文章标题整理 微积分在生活中的应用与思维启发 捕鹿到瞬时速度的趣味探索 微积分是一扇通往更广阔世界的门,从生活中学习思维的工具。 数据库才是最强架构 你还在被“复杂架构”误导吗? 把业务逻辑写入数据库,重新定义简单与效率。…...

eNSP-缺省路由配置
缺省路由是一种特殊的静态路由,其目的地址为0.0.0.0,子网掩码为0.0.0.0。 1.拓扑图搭建 2.配置路由器 AR2 <Huawei>sys #进入系统视图 [Huawei]ip route-static 0.0.0.0 0.0.0.0 192.168.3.2 #设置缺省路由 [Huawei]q #返回上一层 <Huawe…...

solr 远程命令执行 (CVE-2019-17558)
漏洞描述 Apache Velocity是一个基于Java的模板引擎,它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目,旨在确保Web应用程序在表示层和业务逻辑层之间的隔离(即MVC设计模式)。 Apa…...

STM32端口模拟编码器输入
文章目录 前言一、正交编码器是什么?二、使用步骤2.1开启时钟2.2配置编码器引脚 TIM3 CH1(PA6) CH2 (PA7)上拉输入2.3.初始化编码器时基2.4 初始化编码器输入2.5 配置编码器接口2.6 开启定时器2.7获取编码器数据 三、参考程序四、测试结果4.1测试方法4.2串口输出结果…...

Centos 8, add repo
Centos repo前言 Centos 8更换在线阿里云创建一键更换repo 自动化脚本 华为Centos 源 , 阿里云Centos 源 华为epel 源 , 阿里云epel 源vim /centos8_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.han...

MYSQL- 查看存储过程调式信息语句(二十七)
13.7.5.27 SHOW PROCEDURE CODE 语句 SHOW PROCEDURE CODE proc_name此语句是MySQL扩展,仅适用于已构建有调试支持的服务器。它显示了命名存储过程的内部实现的表示。类似的语句SHOW FUNCTION CODE显示有关存储函数的信息(见第13.7.5.19节“SHOW FUNTIO…...

C#基础上机练习题
21.计算500-800区间内素数的个数cn,并按所求素数的值从大到小的顺序排列,再计算其间隔加、减之和,即第1个素数-第2个素数第3个素数-第4个素数第5个素数……的值sum。请编写函数实现程序的要求,把结果cn和sum输出。 22.在三位整数…...

5.5 W5500 TCP服务端与客户端
文章目录 1、TCP介绍2、W5500简介2.1 关键函数socketlistensendgetSn_RX_RSRrecv自动心跳包检测getSn_SR 1、TCP介绍 TCP 服务端: 创建套接字[socket]:服务器首先创建一个套接字,这是网络通信的端点。绑定套接字[bind]:服务器将…...

一区北方苍鹰算法优化+创新改进Transformer!NGO-Transformer-LSTM多变量回归预测
一区北方苍鹰算法优化创新改进Transformer!NGO-Transformer-LSTM多变量回归预测 目录 一区北方苍鹰算法优化创新改进Transformer!NGO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab NGO-Transformer-LST…...

深入理解 MyBatis 的缓存机制:一级缓存与二级缓存
MyBatis 是目前 Java 开发中常用的一种 ORM(对象关系映射)框架,它不仅简化了 SQL 语句的编写和管理,还提供了强大的缓存机制,用以提高数据库访问的性能。MyBatis 的缓存分为一级缓存和二级缓存,分别应用于不…...

移远通信推出全新5G RedCap模组RG255AA系列,以更高性价比加速5G轻量化大规模商用
11月20,全球领先的物联网整体解决方案供应商移远通信宣布,正式推出其全新5G RedCap模组RG255AA系列。该系列模组支持5G NR独立组网(SA)和LTE Cat 4双模通信,具有高性能高集成度、低功耗、小尺寸、高性价比等优势&#…...

架构-微服务-环境搭建
文章目录 前言一、案例准备1. 技术选型2. 模块设计3. 微服务调用 二、创建父工程三、创建基础模块四、创建用户微服务五、创建商品微服务六、创建订单微服务 前言 微服务环境搭建 使用的电商项目中的商品、订单、用户为案例进行讲解。 一、案例准备 1. 技术选型 maven&a…...

conda下载与pip下载的区别
一、conda下载与pip下载的区别 最重要是依赖关系: pip安装包时,尽管也对当前包的依赖做检查,但是并不保证当前环境的所有包的所有依赖关系都同时满足。 当某个环境所安装的包越来越多,产生冲突的可能性就越来越大。conda会检查当…...

MySQL获取数据库内所有表格数据总数
在 MySQL 中,要获取数据库内所有表格的数据总数,可以编写一个查询脚本来遍历每个表并计算其行数。你可以使用 INFORMATION_SCHEMA 数据库,它包含了关于数据库元数据的表格,如 TABLES 和 COLUMNS。 以下是一个示例脚本,…...

Matlab 深度学习工具箱 案例学习与测试————求二阶微分方程
clc clear% 定义输入变量 x linspace(0,2,10000);% 定义网络的层参数 inputSize 1; layers [featureInputLayer(inputSize,Normalization"none")fullyConnectedLayer(10)sigmoidLayerfullyConnectedLayer(1)sigmoidLayer]; % 创建网络 net dlnetwork(layers);% 训…...

django authentication 登录注册
文章目录 前言一、django配置二、后端实现1.新建app2.编写view3.配置路由 三、前端编写1、index.html2、register.html3、 login.html 总结 前言 之前,写了django制作简易登录系统,这次利用django内置的authentication功能实现注册、登录 提示ÿ…...

三种蓝牙架构实现方案
一、蓝牙架构方案 1、hostcontroller双芯片标准架构 手机里面包含很多SoC或者模块,每颗SoC或者模块都有自己独有的功能,比如手机应用跑在AP芯片上,显示屏,3G/4G通信,WiFi/蓝牙等都有自己专门的SoC或者模块࿰…...

ffmpeg 视频滤镜:高斯模糊-gblur
滤镜描述 gblur 官网地址 > FFmpeg Filters Documentation 这个滤镜会将视频变得模糊。 滤镜使用 参数 gblur AVOptions:sigma <float> ..FV.....T. set sigma (from 0 to 1024) (default 0.5)steps <int> ..FV.....T…...

期权懂|在期权市场中,如何用好双买期权?
期权小懂每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 在期权市场中,如何用好双买期权? 期权双买操作,即同时买入认购期权(看涨期权)和认沽期权(看跌期权…...

【Linux学习】【Ubuntu入门】2-3 make工具和makefile引入
1.使用命令新建三个.c文件vi main.c,vi input.c,vi caclcu.c,两个.h文件vi input.h,vi caclcu.h 2.vi Makefile:新建Makefile文件,输入一下内容 注意:命令列表中每条命令前用TAB键,不…...

《黑神话:悟空》游戏辅助修改器工具下载指南与操作方法详解
《黑神话:悟空》是一款备受期待的动作冒险游戏,目前尚未正式发布。游戏开发团队一直在强调游戏的完整性和公平性,因此官方并不支持任何形式的作弊或修改行为。然而,对于一些玩家而言,使用辅助修改器可能会成为他们体验…...

C语言菜鸟入门·关键字·union的用法
目录 1. 简介 2. 访问成员 2.1 声明 2.2 赋值 3. 共用体的大小 4. 与typedef联合使用 5. 更多关键字 1. 简介 共用体(union)是一种数据结构,它允许在同一内存位置存储不同的数据类型,但每次只能存储其中一种类型的…...

ensp静态路由实验
一、实验目的 1、熟练掌握交换机的基本配置命令 2、熟练掌握静态路由的使用方法 3. 熟练掌握交换机端口模式 二、实验内容 需求: 根据要求利用现有实验设备组建小型局域网 实验设备: 交换机S37002台;PC机2台;路由器2台。 …...

构建 Java Web 应用程序:从 Servlet 到数据库交互(Eclipse使用JDBC连接Mysql数据库)
第 1 部分:环境设置 安装 Java Development Kit (JDK):下载并安装 JDK。设置 IDE:安装并配置 IDE(如 IntelliJ IDEA 或 Eclipse)。安装数据库:下载并安装 MySQL 数据库。配置数据库:创建数据库…...

mfc100u.dll是什么?分享几种mfc100u.dll丢失的解决方法
mfc100u.dll 是一个动态链接库(DLL)文件,属于 Microsoft Foundation Classes (MFC) 库的一部分。MFC 是微软公司开发的一套用于快速开发 Windows 应用程序的 C 类库。mfc100u.dll 文件包含了 MFC 库中一些常用的函数和类的定义,这…...