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)是一种最常见的调试工具,用于在代码中的某一行设置一个中断点,以便调试程序时暂停执行,从而检查程序的状态。

使用

当你在调试模式下运行程序时,程序会在设置的断点处停止执行

在调试过程中,你可以:

  • 查看变量值:在“变量”窗口中查看当前的局部变量和全局变量的值。
  • 检查堆栈:查看调用堆栈信息,了解程序执行的调用顺序。
  • 控制程序流:使用工具栏中的控制按钮(如继续、单步执行等)来控制程序的执行流程。

image-20241116204042537

1.2 方法断点

方法断点(Method Breakpoint)是 IntelliJ IDEA 中的另一种调试工具,用于在方法的入口或出口处暂停程序的执行。与行断点不同,方法断点无需指定具体的代码行,而是直接绑定到方法本身,在进入和退出方法都会在断点处被停止。

使用

触发时机

  • 方法断点可以在方法 调用时(入口)方法返回时(出口) 暂停程序。
  • 支持捕获方法的所有调用方,无论调用来自哪里。

适用场景

  • 调试一个方法被调用的频率或调用路径。
  • 检查某方法的入参和返回值。
  • 分析哪些地方调用了方法(特别是工具类或公共方法)。

性能开销

  • 方法断点性能较低,特别是高频调用的方法,可能导致调试器反应缓慢或程序变卡。因此,慎用方法断点。

image-20241116204442258

1.3 属性断点

属性断点(Field Breakpoint 或 Watchpoint)是 IntelliJ IDEA 中的一种断点类型,专门用于监控某个字段(属性)的 值变化访问。当程序对指定的属性执行读取(Read)或写入(Write)操作时,调试器会暂停程序,允许你查看运行状态。

使用

触发时机

  • 读操作(Field Access):当代码读取该字段的值时触发。
  • 写操作(Field Modification):当代码对该字段的值进行修改时触发。

适用场景

  • 检查属性的值何时被读取或修改。
  • 排查意外的属性值变化问题(如多线程导致的值被修改)。
  • 监控静态字段或常用的全局变量。

性能开销

  • 属性断点可能会对性能产生较大的影响,特别是高频访问的字段。因此,建议在调试时使用,调试结束后移除或禁用。

image-20241116205320965

在属性处打上断点,并右键断点并勾选Field access,此时以debug模式运行,所有属性发生变化的方法中的行都会被拦截

image-20241116205615662

1.4 异常断点

异常断点(Exception Breakpoint)是 IntelliJ IDEA 提供的一种调试工具,用于在程序抛出指定异常时自动暂停程序的执行,无论异常发生在何处。这对于排查未捕获异常或异常传播链是非常高效的工具,这个断点在排查报错抛异常时,非常好用!!!它可以捕获所有异常,也可以捕获指定异常(此处以最常见的空指针为例)

使用

触发时机

  • 当程序抛出指定异常时(无论是否被捕获)。
  • 默认情况下,只在异常未被捕获(Uncaught)时触发,但可以配置为 在捕获时(Caught) 也暂停。

适用场景

  • 调试运行时异常(如 NullPointerExceptionIllegalArgumentException)。
  • 追踪异常是如何发生的以及调用链。
  • 排查捕获异常后处理逻辑的行为。

作用范围

  • 异常断点适用于整个应用,无需手动在每个方法中设置断点

使用快捷键ctrl+shift+f8(部分机型为ctrl+shift+f8+fn)打开断点面板,点击左上角的"+",添加Java Exception BreakPoint,再输入NullPointerException

image-20241116210253484

此时,不用在代码中手动打断点,当出现空指针时,会自动定位到出现空指针的代码行

image-20241116210622608

1.5 条件断点

条件断点(Conditional Breakpoint)是调试器中的一种高级功能,用于在断点设置的代码位置,只有满足指定条件时才会暂停程序的执行。这使得调试更加高效,因为你可以过滤掉不感兴趣的程序状态,聚焦于特定情况。

使用

触发条件

  • 断点会在指定的代码行被执行时,检查用户提供的条件表达式。
  • 只有条件表达式的结果为 true 时,断点才会触发。

适用场景

  • 跟踪某一特定值时的代码行为。
  • 排查循环中某些特定迭代的异常问题。
  • 监控特定条件下的变量值或状态。

无干扰调试

  • 避免程序在每次执行断点时都暂停,只在条件满足时中断,减少不必要的干扰。

在你需要打打断点的代码行打上断点,右键,输入条件,当条件为true时,断点才会生效。

此处,在for循环中i等于5时,断点才会生效,否则继续执行。

image-20241116211934038

1.6 源断点

设置这个断点,只需按住shift+鼠标左键,并设置需要输出的到控制台的变量

image-20241116213901543

运行时,程序不会在断点处停止,但是会把设置的变量都打印到控制台。

image-20241116214003767

1.7 多线程断点

多线程断点 是调试器在多线程环境中提供的一种功能,用于帮助开发者调试和分析多线程程序的行为。由于多线程程序中的代码会被多个线程并发执行,断点可能会在不同的线程上触发,调试起来相对复杂。

使用

线程相关性

  • 断点可以在特定线程上触发,也可以暂停所有线程。
  • 可以查看和分析不同线程的调用堆栈和变量状态。

独立线程调试

  • IDEA 允许你选择仅调试特定线程而不影响其他线程。

线程竞争分析

  • 配合条件断点和日志功能,可以分析线程间资源竞争和同步问题。

分别在两处多线程的代码行,打上断点,并右键断点选择Thread

开始运行时,可以手动切换线程运行顺序,以此模拟线程的轮询执行

image-20241116221809981

1.8 Stream断点

在使用了Stream流式操作的语句上打上断点,此时我们先过滤大于5的数字,在过滤小于8的数字

image-20241116222722594

点击菜单,选择Trace Current Stream Chain,此时将会展示整个流式操作处理。

image-20241116222811503

二、调试动作✨

image-20241116223538482

  1. Step Over:一行一行的执行代码,不会进入方法中,但是方法中有断点时,会进入方法内的断点中
  2. Force Step Over:一行一行的执行代码,和Step Over最大的区别时,就算方法中存在断点也不会进去。
  3. Step Into:进入方法内部,外部jar包无法进入
  4. Force Step Into:进入方法内部,也可以进入外部jar包
  5. Smart Step Into:当一行代码中存在多个方法,比如方法嵌套,使用Smart Step Into可以任意选择进入想要进入的方法。
  6. Step Out:当进入方法内部时,使用Step Out可以退出至方法调用处。
  7. Setp Out of Block:当调试for循环或while循环时,可以使用它跳出循环
  8. Run to Cursor:跳到鼠标光标所在处(相当于,鼠标在的位置打了断点),但是前一个执行到的位置和光标之间还有断点时,就会先跳转到中的断点处
  9. Force Run to Cursor:强制跳到光标所在位置,哪怕前一个执行到的位置和光标之间还有断点时,也会直接跳到光标的位置(忽略中途的断点)
  10. Force return:当debug时,想要结束运行,但是后面的代码仍然会执行(有插入数据的操作时,不想执行后面的插入数据的代码,又不想结束项目),这时可以使用它来强制返回,返回值为void时,直接结束,有返回时,直接输入null,返回空就行。
  11. Resume Program:一直执行到下一个断点,直到程序结束或方法调用完成。

三、Debug高级技巧🎉

3.1 watch

在 IntelliJ IDEA 中,Watch(监视) 是一个非常强大的调试功能,它可以帮助你实时观察变量、表达式或方法的值,尤其在复杂的调试场景中非常有用。

使用

在debug时,右键想要监视的变量,点击Add to Watchs,idea就会将监视的变量单独列出

image-20241117084530485

注意:如果监视了变量但红色框中的区域没有出现,需要手动开启,点击红框上方的Layout setting,再勾选watches即可image-20241117084758912

3.2 设置变量

当在有if判断时,如果触发true的代码非常复杂,则可以使用变量设置来修改if的判断条件,或者当传参时某一个变量或对象缺失,可以直接设置变量来查看代码运行的效果。

image-20241117085120499

将其修改为true

image-20241117085146956

3.3 异常抛出

当我们希望测试抛出异常后的代码逻辑,就可以使用debug中的throw exception

image-20241117085553986

此时手动抛出一个空指针异常

image-20241117085720720

此时便可以捕获到异常观察异常抛出后的代码逻辑

image-20241117085754045

3.4 监控JVM堆大小

该方法可以监控JVM创建了多少次实例,没有该面板的话需要点击上方的layout setting打开(和watches打开方式相同)

image-20241117090014622

3.5 数组过滤和筛选

在使用数组或列表时(Map也可以),想要观察某个特定的对象是否存在,可以使用筛选的功能通过表达式将其筛选出来。

image-20241117090315423

通过表达式将其筛选出(写表达式时,需要注意其中的元素类型)

image-20241117090408093

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

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

相关文章

鸿蒙学习生态应用开发能力全景图-赋能套件(1)

文章目录 赋能套件鸿蒙生态应用开发能力全景图 赋能套件 鸿蒙生态白皮书: 全面阐释了鸿蒙生态下应用开发核心理念、关键能力以及创新体验,旨在帮助开发者快速、准确、全面的了解鸿蒙开发套件给开发者提供的能力全景和未来的愿景。 视频课程: 基于真实的开发场景,提供向导式…

贴代码框架PasteForm特性介绍之select,selects,lselect和reload

简介 PasteForm是贴代码推出的 “新一代CRUD” ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代码生成器,你可以快速的为自己的项目构建后台管理端!目前管…

人工智能技术的应用前景与我们的应对策略

​ 大家好,我是程序员小羊! 随着人工智能(AI)技术的快速发展,其在社会生活、产业转型以及科技进步中发挥着日益重要的作用。AI正逐步改变着我们的生活和工作方式,同时也带来了技术和伦理上的诸多挑战。本文…

Unreal engine5实现类似鬼泣5维吉尔二段跳

系列文章目录 文章目录 系列文章目录前言一、实现思路二、具体使用蓝图状态机蓝图接口三、中间遇到的问题 前言 先看下使用Unreal engine5实现二段跳的效果 一、实现思路 在Unreal Engine 5 (UE5) 中使用蓝图系统实现类似于《鬼泣5》中维吉尔的二段跳效果,可以通…

Python Excel XLS或XLSX转PDF详解:七大实用转换设置

目录 使用工具 Python将Excel文件转换为PDF Python将Excel文件转换为带页码的PDF Python将Excel文件转换为特定页面尺寸的PDF Python将Excel文件转换为PDF并将内容适应到一页 Python将Excel文件转换为PDF/A Python将Excel文件中的工作表转换为单独的PDF Python将Excel工…

Linux网络——网络初识

目录 1. 认识协议 2. 协议的分层 3. OSI 七层模型 && TCP/IP 五层(四层)模型 4. 网络传输的基本流程 5. 以太网的通信原理 6. 数据的跨网络传播 7. 认识 IP 地址 ① IP 是什么 ② IP 与 MAC 的关系 ③ 为什么需要 IP 在谈及网络之前,我们要先对学…

RedHat7—Linux中kickstart自动安装脚本制作

本实验使用虚拟机版本为rhel7,从rhel7后的版本kickstart工具进行收费使用。 1.在VMware关闭dhcp自动获取ip地址功能 2.安装并启动httpd [rootlocalhost ~]# yum install httpd [rootlocalhost ~]# systemctl start httpd [rootlocalhost ~]#systemctl stop firewal…

基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络

一、介绍 垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集(‘塑料’, ‘玻璃’, ‘纸张’, ‘纸板’, ‘金属’),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进…

OMV7 树莓派 tf卡安装

​ 升级7之后,问题多多,不是docker不行了,就是代理不好使 今天又重装了一遍,用官方的链接,重新再折腾一遍…… 使用raspberry pi imager安装最新版lite OS。 注意是无桌面 Lite版 配置好树莓派初始化设置&#xff0…

前端无感刷新token

摘要: Axios 无感知刷新令牌是一种在前端应用中实现自动刷新访问令牌(access token)的技术,确保用户在进行 API 请求时不会因为令牌过期而中断操作 目录概览 XMLHttpRequestAxiosFetch APIJQuni.request注意事项: 访问…

STM32 独立看门狗(IWDG)详解

目录 一、引言 二、独立看门狗的作用 三、独立看门狗的工作原理 1.时钟源 2.计数器 3.喂狗操作 4.超时时间计算 5.复位机制 四、独立看门狗相关寄存器 1.键寄存器(IWDG_KR) 2.预分频寄存器(IWDG_PR) 3.重载寄存器&…

RHCE的练习(12)

写一个脚本,完成以下要求: 给定一个用户: 如果其UID为0,就显示此为管理员;否则,就显示其为普通用户; #!/bin/bash ​ # 使用read命令获取用户名 read -p "请输入用户名: " username ​…

游戏引擎学习第15天

视频参考:https://www.bilibili.com/video/BV1mbUBY7E24 关于游戏中文件输入输出(IO)操作的讨论。主要分为两类: 只读资产的加载 这部分主要涉及游戏中用于展示和运行的只读资源,例如音乐、音效、美术资源(如 3D 模型和…

探索 HTML 和 CSS 实现的 3D旋转相册

效果演示 这段HTML与CSS代码创建了一个包含10张卡片的3D旋转效果&#xff0c;每张卡片都有自己的边框颜色和图片。通过CSS的3D变换和动画&#xff0c;实现了一个动态的旋转展示效果 HTML <div class"wrapper"><div class"inner" style"-…

什么是Hadoop

Hadoop 介绍 Hadoop 是由 Apache 开发的开源框架&#xff0c;用于处理分布式环境中的海量数据。Hadoop 使用 Java 编写&#xff0c;通过简单的编程模型允许在集群中进行大规模数据集的存储和计算。它具备高可靠性、容错性和扩展性。 分布式存储&#xff1a;Hadoop 支持跨集群…

逆向攻防世界CTF系列39-debug

逆向攻防世界CTF系列39-debug 查了资料说.NET要用其它调试器&#xff0c;下载了ILSPY和dnSPY ILSPY比较适合静态分析代码最好了&#xff0c;函数名虽然可能乱码不显示&#xff0c;但是单击函数名还是能跟踪的&#xff0c;而dnSPY在动态调试上效果好&#xff0c;它的函数名不仅…

华为开源自研AI框架昇思MindSpore应用案例:人体关键点检测模型Lite-HRNet

如果你对MindSpore感兴趣&#xff0c;可以关注昇思MindSpore社区 一、环境准备 1.进入ModelArts官网 云平台帮助用户快速创建和部署模型&#xff0c;管理全周期AI工作流&#xff0c;选择下面的云平台以开始使用昇思MindSpore&#xff0c;获取安装命令&#xff0c;安装MindSpo…

Cellebrite VS IOS18Rebooting

Cellebrite VS IOS18Rebooting我们想分享一些有关 iOS 18 重启“功能”的信息。在过去一周左右的时间里&#xff0c;人们对 iOS 18 中一项新的未记录功能产生了极大关注&#xff0c;该功能会导致设备在一段时间不活动后重新启动。 这意味着&#xff0c;如果设备在一定时间不活…

使用 Axios 拦截器优化 HTTP 请求与响应的实践

目录 前言1. Axios 简介与拦截器概念1.1 Axios 的特点1.2 什么是拦截器 2. 请求拦截器的应用与实践2.1 请求拦截器的作用2.2 请求拦截器实现 3. 响应拦截器的应用与实践3.1 响应拦截器的作用3.2 响应拦截器实现 4. 综合实例&#xff1a;一个完整的 Axios 配置5. 使用拦截器的好…

【最大子矩阵——双指针 / 二分】

题目 双指针&#xff1a; 代码 #include <bits/stdc.h> using namespace std; const int N 85, M 1e510; int g[N][M]; int n, m, lim; int ans 1; int main() {ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m;for(int i 1; i < n; i)for(int …