学会IDEA这些断点操作,生产问题解决的越来越快了

news/2024/5/4 3:48:47/文章来源:https://blog.csdn.net/Saintmm/article/details/128335143

文章目录

  • IDEA断点高级用法
    • 1、断点类型
      • 1)行断点(line breakpoints)
      • 2)字段断点(field breakpoints)
      • 3)方法断点(method breakpoints)
        • 1> 加载类名上的断点
        • 2> 正常方法断点
        • 3> 通过匹配符批量添加方法断点
      • 4)异常断点(exception breakpoints)
    • 2、断点控制
      • 1)断点删除
      • 2)断点静音
    • 3、断点属性配置
      • 1)Enabled
      • 2)Suspend
      • 3)Condition
      • 4)Log
        • 效果展示
      • 5)Remove once hit
      • 6)Disable until hitting the following breakpoint
      • 7)Pass count
    • 4、断点的状态
      • 对应的图标
    • 5、Stream的调试
    • 6、远程debug
  • 使用建议
    • IDEA查看类实例所占内存

IDEA断点高级用法

1、断点类型

1)行断点(line breakpoints)

在指定代码行设置断点,程序在到达设置断点的代码行时暂停程序。这种类型的断点可以设置在任何可执行的代码行上。

一般我们在代码的左侧数字栏直接鼠标单机设置的断点就是行断点;

在这里插入图片描述

2)字段断点(field breakpoints)

当指定的字段被读取或修改时会进入端点,暂停程序。

  • 如果在一个复杂的过程结束时,某个字段出现了明显的错误值,设置一个字段观察点可能有助于确定故障的来源。

在定义字段的代码行的 左侧数字栏直接鼠标单机设置的断点就是字段断点;

在这里插入图片描述

鼠标右键点击该断点图标 ,弹出该断点配置,会有Field access和Field modification选项;这两个选项项是字段类型断点特有的,分别对应 访问该字段、修改该字段触发断点,两项同时选中,则访问、修改该字段都会触发断点。

默认只有修改字段时才会触发断点。

在这里插入图片描述

3)方法断点(method breakpoints)

在进入或退出指定的方法或其实现之一时暂停程序;允许我们检查该方法的进入/退出条件。

在这里插入图片描述

1> 加载类名上的断点

当断点加在class类名这一行,并且该类中没有编写构造函数(只有默认无参构造函数)时,当调用默认无参构造函数时会触发此断点,程序挂起;所以虽然这个断点的图标是行断点类型图标,但实际上其属于方法类型断点。

在这里插入图片描述

2> 正常方法断点

在方法名这一行加断点,鼠标右键点击该断点图标 ,弹出该断点配置,会有Emulated、Method entry、Method exit选项,此选项是方法类型断点特有的。

  • Emulated勾选中,会将方法断点优化成方法中第一条和最后一条语句的行断点,这样会优化调试的性能,因此在IDE中会默认选中。

在这里插入图片描述

3> 通过匹配符批量添加方法断点

鼠标右键点击某一个方法断点图标,然后点击More,会弹出断点列表页;

在这里插入图片描述
在这里插入图片描述

在断点列表页中,做如下操作:

  1. 点击+号,弹出下列选择框;
    在这里插入图片描述
  2. 选择Java Method Breakpoints,弹出如下窗口;
    在这里插入图片描述

Class pattern 和 Method name中输入的匹配符规则示例如下:

ClassMethodResult
*print匹配所有类的 print() 方法
DebugTest*匹配 DebugTest 类中的所有方法
DebugTestset*匹配 DebugTest 类中的所有方法名set开头的方法

4)异常断点(exception breakpoints)

当程序抛出指定异常时会激活异常断点,与行断点不同,异常断点不需要与源代码映射,因为异常断点应用程序级别的。

异常断点分为两种:

  • 一种是Any Exception,任意Throwable异常被捕获或未被捕获就会触发断点;
  • 另一种是指定类型的异常及其该异常子类被捕获或未被捕获会触发断点;

异常断点的添加方式:在断点列表页中,做如下操作:

  1. 点击+号,弹出下列选择框;
    在这里插入图片描述
  1. 选择Java Exception Breakpoints,弹出如下窗口;
    在这里插入图片描述

假如我们选择了java.lang.NullPointerException:

在这里插入图片描述

异常断点有两个特有的配置:Caught exceptionUncaught exception 选项。

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

2、断点控制

1)断点删除

1> 所有类型的断点:在断点列表中用 - 号可以移除相应的断点;

在这里插入图片描述

2> 快捷移除:行位置鼠标左键单击即可移除(异常断点除外)。

2)断点静音

如果某些时候不需要在断点处停留一段时间,可以将断点静音。这样就可以在不离开调试器会话的情况下恢复程序的正常运行。之后,可以解除断点的静音,继续DEBUG调试。

断点静音会静音所有断点。

在这里插入图片描述

3、断点属性配置

鼠标操作:右键断点;

在这里插入图片描述

再点击:More(Ctrl+Shift+F8),进入断点列表;

在这里插入图片描述

断点有许多属性配置,如上图所示;下面对各个属性的作用以及使用进行说明。

1)Enabled

表示是否启用该断点,选中表示启用,取消选中表示不启用。

2)Suspend

Suspend属性除了自身是否勾选之外,还有两个选项:All、Thread;

  • 当断点的 Suppend 属性被勾选,触发该断点时,程序挂起;当该属性未选中时,程序触发该断点时,程序不会挂起,不勾选Suspend属性的操作,常用于输出一些表达式结果日志。
  • 当断点的 All 属性被勾选,触发该断点时,会挂起所有线程;
  • 当断点的 Thead 属性被勾选,触发该断点时,只会挂起触发该断点的那个线程,不影响其他线程;
    • 实际生产实践中,可用于调试多线程并发的问题。

3)Condition

输入一段能获得true或false的表达式,程序运行到断点处,且表达式条件为true才会触发断点。

比如下图:当stop属性为true时才触发断点;

在这里插入图片描述

4)Log

Log有三个属性选项经常配合 Suppend 属性不勾选时 一起使用,用于在不挂起程序的情况下,输出一些想要的日志信息;

  • Breakpoint hit message :控制台输出触发断点的日志信息;
    • 比如:Breakpoint reached at com.saint.debug.DebugTest.print(DebugTest.java:10)
  • Stack trace:输出触发断点时的堆栈信息;
    • 比如:
      Breakpoint reachedat com.saint.debug.DebugTest.print(DebugTest.java:10)at com.saint.debug.DebugTest.main(DebugTest.java:15)
      
  • Evaluate and log:计算表达式结果并输出表达式结果到控制台;
    • 表达式的计算基于断点所在行的上下文,表达式的语句可以是字符串字面量、方法调用、也可以是多行语句块;

效果展示

断点配置如下:在不挂起程序的情况下输出日志
在这里插入图片描述

DEBUG后的控制台输出:

在这里插入图片描述

5)Remove once hit

是否在断点触发后移除该断点,后续不再触发;

在这里插入图片描述

6)Disable until hitting the following breakpoint

选择的另一个断点被触发后,该断点才启用。

在这里插入图片描述

7)Pass count

勾选中并输入一个正整数N,N>=1,那么程序会每N次命中断点才会触发挂起。

如果同时设置了condition 与 pass count 属性,ide会优先判断 condition 表达式,再判断 pass count 是否满足。

比如:Pass count 设置为15,每15次命中断点才会触发断点,挂起程序。

在这里插入图片描述
DEBUG测试效果:
在这里插入图片描述

4、断点的状态

状态描述
Verified启动调试器会话后,调试器会检查在技术上是否可以在断点处暂停程序。
Warning如果是,调试器将该断点标记为已验证。如果在技术上可以在断点处暂停程序,但是有相关的问题,调试器会给你
Invalid一个警告。例如,这可能发生在无法在某个方法的实现处暂停程序的情况如果在技术上不可能在断点处暂停程序,调试器会将其标记为无效。最常
Inactive/dependent下。见的原因是该行没有可执行的代码。当一个断点被配置为禁用,直到另一个断点被击中,而这还没有发生时,
Muted该断点被标记为非活动/依赖性。所有的断点都是暂时不活动的,因为它们已经被静止了。
Disabled该断点暂时不活动,因为它已被禁用。
Non-suspending为该断点设置了暂停策略,因此,当击中该断点时不会暂停执行。

对应的图标

在这里插入图片描述

5、Stream的调试

这个看看就行,IDEA做的不怎么好,实际几乎也不用。

1> 在stream()方法处打个行断点;
在这里插入图片描述
2> 查看 Steam Trace;
在这里插入图片描述

6、远程debug

一般我们仅在开发环境和测试环境允许remote debug,UAT、Prod环境肯定不允许。

具体的步骤;

1> 启动远程服务时加入如下参数:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar xxx.jar

2> 本地打开相应项目的 Edit Configurations,新增一个Remote

在这里插入图片描述
在这里插入图片描述
JVM参数添加 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
在这里插入图片描述

3> Idea中启动remote,并打断点调试。

使用建议

  • 使用非暂停的日志断点进行“printf”调试,而不是在代码中插入打印语句。
    • 为处理调试日志信息提供了一种更灵活和集中的方式。
    • 场景: 所有需要打印的地方,生产上禁止 System.out.print();
  • 测试程序是否有并发性问题
    • 发现多线程程序在并发方面是否健壮的一个好方法是使用断点,在碰到时只暂停一个线程。
    • 停止一个线程可能会揭示出应用程序设计中的问题,否则这些问题就不会显现出来。

IDEA查看类实例所占内存

IDEA在比较高的版本提供了查看类实例所占的保留内存大小能力,笔者的IDEA版本没那么高,这里简单提一下。

  • 对于每个类的实例,你可以计算它的保留大小。保留大小是指对象本身和它所引用的所有对象以及没有被其他对象引用的对象所占据的内存量。
  • 估算重型单体或从磁盘上读取的数据(例如,复杂的JSON)的内存占用时,可能很有用。
  • 决定使用哪种数据结构时(例如,ArrayList与LinkedList),它也很有用。

使用方式:运行应用程序之前,确保在设置/首选项|构建、执行、部署|调试器中启用附加内存代理选项。

请添加图片描述

在查看类的实例时,右键单击一个实例并单击计算保留大小。

请添加图片描述

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

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

相关文章

M.2、PCIe 和 NVMe 的定义和区别

资料来源:维基百科,电商平台等 文章目录结论M.2PCIeNVMe结论 基于阅读的资料,对三者之间的关系,总结为如下层次结构: M.2 M.2定义了计算机内部扩展卡的外观尺寸和电气接口规范。 外观尺寸: M.2模块的外…

富芮坤蓝牙FR801xH开发环境搭建

富芮坤蓝牙FR801xH方案开发资源包网盘下载链接:网盘 提取码:30qu 搭建过程: 安装Keil开发工具:mdk525.exe 可以从Keil官网下载:http://www.keil.com/files/eval/MDK525.EXE 也可以使用网盘tools目录里的包装包 其中需要注意选择的…

编程常见的问题(三) 线程池

编程常见的问题(三) 线程池 今天,我来讲讲使用线程池需要注意的一些问题。 在程序中,我们会用各种池化技术来缓存创建昂贵的对象,比如线程池、连接池、内存池。一般是预先创建一些对象放入池中,使用的时候直接取出使用&#xff…

数字货币市场风暴肆虐,币圈人应该把握哪些新的赛道机遇

11月11日(周五)美股盘前,曾经为全球第二大加密货币交易所FTX在推特发布了申请破产保护的声明,创始人SBF已经辞去CEO职务。据声明,FTX已经任命John J. Ray III 担任CEO,SBF还将协助相关破产事宜。据FTX在推特…

99.(leaflet之家)leaflet军事标绘-分队战斗行动修改

地图之家总目录(订阅之前请先查看该博客) 地图之家:cesium+leaflet+echart+地图数据+地图工具等相关内容的介绍 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> …

QT 学习笔记(九)

文章目录一、事件的接收和忽略1. 准备工作2. 接收和忽略二、event() 函数1. 简介2. 实例演示3. 总结三、事件过滤器四、总结&#xff08;细看&#xff09;1. 知识点汇总2. QT 的事件处理五、事件、事件的接收和忽略、event() 函数和事件过滤器代码1. 主窗口头文件 mywidget.h2.…

音视频面试涨知识(四)

视频格式播放体验流量占用情况DASH统计直播推流端到播放端延时。支持和视频帧绑定的内容交互。比如&#xff0c;直播答题在播放端的弹窗等。小HLS对视频进行切片&#xff0c;按切片播放&#xff0c;缓存小起播快&#xff1b;拖动时间轴到任意时间播放时&#xff0c;可以快速定位…

【爬虫】JS调试解决反爬问题系列1

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

面向切面编程 AOP

AOPAOP的概念AOP &#xff08;底层原理&#xff09;AOP 底层使用动态代理AOP &#xff08; JDK 动态代理&#xff09;首先我们来看一下 Spring 的百度百科   Spring 框架是一个开放源代码的 J2EE 应用程序框架&#xff0c;由 Rod Johnson 发起&#xff0c;是针对 Bean 的生命…

《Linux运维总结:基于xtrabackup8工具全量物理备份Mysql8数据自动化工具(方案一)》

一、背景信息 说明&#xff1a;由于业务系统的特殊性&#xff0c;对数据的备份要求非常高&#xff0c;且数据量非常大&#xff0c;所以这里采用xtrabackup工具来对Mysql数据库进行全量物理备份。由于xtrabackup工具操作复杂&#xff0c;这里为了简便&#xff0c;基于xtrabackup…

这可能是2022最全的Java面试八股文!共计1658页,Java技术手册的天花板

前两天有个小伙伴在后台留言&#xff0c;最近的面试越来越难了&#xff0c;尤其是技术面&#xff0c;考察得越来越细&#xff0c;越来越底层&#xff0c;庆幸的是最终顺利找到了工作。 一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识 比如果这样的问题…

首次曝光,Alibaba大佬手撸堪称神级的SpringSecurity全彩手册

有人调侃我们说&#xff1a; 程序员不如送外卖。送外卖是搬运食物&#xff0c;自己是搬运代码&#xff0c;都不产出新的东西……透支体力&#xff0c;又消耗健康&#xff0c;可替代性极强&#xff0c;30岁之后就要面临被优化的危险……想跳槽&#xff0c;但是更高的平台难进&a…

MySQL的基础架构简述

文章目录一、一条SQL查询语句是如何执行的1、连接器2、查询缓存3、分析器4、优化器5、执行器一、一条SQL查询语句是如何执行的 开篇先上基本架构示意图&#x1f917;&#xff1a; 大体来说&#xff0c;MySQL可以分为 Server 层和存储引擎两部分。 Server 层包括连接…

重磅!阿里巴巴三入Java 全球管理组织执行委员会 龙蜥拥抱上游开源生态

近日&#xff0c;Java 全球管理组织 Java Community Process&#xff08;以下简称 JCP&#xff09;经过公平公正的投票&#xff0c;披露了入选最高执行委员会的成员名单&#xff0c;阿里巴巴作为唯一中国代表实现第三次连任。作为龙蜥社区理事长单位&#xff0c;阿里巴巴的此次…

【DevOps实战系列】第八章:详解Jenkins集成Docker私服Nexus3

个人亲自录制全套DevOps系列实战教程 &#xff1a;手把手教你玩转DevOps全栈技术 Jenkins集成Docker镜像仓库 docker私服已经搭建完毕&#xff0c;下边我们期望jenkins做的事是&#xff1a; ①通过git拉取代码②通过maven构建生成jar包③构建含有jar包的镜像④推送到docker仓库…

Halcon图像拼接

图像拼接在实际的应用场景很广&#xff0c;比如无人机航拍&#xff0c;遥感图像等等&#xff0c;图像拼接是进一步做图像理解基础步骤&#xff0c;拼接效果的好坏直接影响接下来的工作&#xff0c;所以一个好的图像拼接算法非常重要。 如按下图是将两张楼房图片拼接成一个图像。…

微服务框架 SpringCloud微服务架构 多级缓存 46 JVM 进程缓存 46.1 导入商品案例【MySQL环境准备】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存46 JVM 进程缓存46.1 导入商品案例【MySQL环境准备】46.1.1 导入商品管理案例46 JVM 进程缓存 用于在T…

Jmeter(十七):利用jmeter插件收集性能测试结果汇总报告和聚合报告,利用PerfMon插件收集监控服务器资源指标

利用jmeter插件收集性能测试结果 汇总报告&#xff08;Summary Report &#xff09; 用来收集性能测试过程中的请求以及事务各项指标。通过监听器--汇总报告 可以添加该元件。界面如下图所示 汇总报告界面介绍&#xff1a; 所有数据写入一个文件&#xff1a;保存测试结果到本地…

STM32F4 | 定时器中断实验

文章目录一、STM32F429 通用定时器简介二、硬件设计三、软件设计四、实验现象五、STM32CubeMX 配置定时器更新中断功能这一章介绍如何使用 STM32F429 的通用定时器&#xff0c; STM32F429 的定时器功能十分强大&#xff0c;有 TIME1 和 TIME8 等高级定时器&#xff0c;也有 …

零钱通项目(面向过程)

目录 项目需求 项目界面 思路 写代码 第一步 第二步 第三步 IDEA运行问题 日期问题 代码运行问题 第四步 第五步 第一种 第二种 第六步 第七步 完整代码 运行效果 项目需求 使用Java 开发 零钱通项目&#xff0c;可以完成收益入账&#xff0c;消费&#xff0…