IDEA 断点(高级)
ztj100 2025-01-08 18:45 18 浏览 0 评论
1. 快捷方式
- 新增或删除断点(当前有效行):Ctrl+F8
- 编辑断点属性:Ctrl+Shrit+F8
2. 断点类型与设置
行断点
- 在到达设置断点的代码行时暂停程序。这种类型的断点可以设置在任何可执行的代码行上。
字段断点
- 当指定的字段被读取或写入时暂停程序。这允许你对与特定实例变量的交互作出反应。
- 例如,如果在一个复杂的过程结束时,你的某个字段出现了明显的错误值,设置一个字段观察点可能有助于确定故障的来源。
- 鼠标右键点击该断点图标 ,弹出该断点配置,会有Field access和Field modification选项,
- 此选项是字段类型断点特有的,分别对应访问该字段或修改该字段触发断点,两项同时选中,则访问与修改该字段都会触发断点。
方法断点
- 在进入或退出指定的方法或其实现之时暂停程序,允许你检查该方法的进入/退出条件。
- 当断点加在class类名这一行,且该类中没有编写构造函数(只有默认无参构造函数),当调用默认无参构造函数时会触发此断点,程序挂起,故该断点虽然图标是行断点类型图标,但实际上属于方法类型断点。
- 鼠标右键点击该断点图标 ,弹出该断点配置,会有Emulated、Method entry、Method exit选项,此选项是方法类型断点特有的。
Emulated勾选中,会将方法断点优化成方法中第一条和最后一条语句的行断点,这样会优化调试的性能,因此在IDE中会默认选中。
Method entry勾选中,将方法的第一条语句进行行断点
Method exit勾选中,将方法的最后一条语句进行行断点
- 通过匹配符批量添加方法断点,在断点列表页
- 匹配符示例:
Class pattern | Method name | 说明 |
* | run | 匹配所有类的run()方法 |
Student | * | 匹配Student类的所有方法 |
Student | run | 匹配Student类的run()方法 |
异常断点
- 异常断点分为两种,一种是Any Exception,任意Throwable异常被捕获或未被捕获就会触发断点,另一种是指定类型的异常及其该异常子类被捕获或未被捕获会触发断点
- 鼠标右键点击该断点图标 ,弹出该断点配置,会有Caught exception和Uncaught exception选项,此选项是字段类型断点特有的。
Caught exception选项选中时,当指定的异常被捕获时,触发断点程序挂起
Uncaught exception选中时,当指定的异常未被捕获时,触发断点程序挂起
3. 断点控制
删除断点
- 所有类型断点:断点设置中移除对应的即可。
- 快捷移除:行位置鼠标左键单击即可移除(异常断点除外)
禁用断点
- 如果某些时候不需要在断点处停留一段时间,可以将断点禁用。这样就可以在不离开调试器会话的情况下恢复正常的程序操作。之后,可以解除中断点的禁用,继续调试。
可以控制所有断点的禁用
可以控制单个断点的禁用
移动/复制断点(不常用)
- 断点移动:鼠标左键拖动
- 断点复制:按住ctrl,鼠标左键拖动
4. 断点属性配置
- 鼠标操作:右键断点:More(Ctrl+Shift+F8)
- 快捷键:Ctrl+Shift+F8
- 快捷键:光标所在行 Alt+Enter
断点有许多属性配置,如下图所示
Enabled
- 表示是否启用该断点,选中表示启用,取消选中表示不启用。
Supend
- 当断点的 Suppend 属性被勾选,触发该断点时,会触发程序挂起,当该属性未选中时,程序触发该断点时,程序不会挂起,常用于输出一些表达式结果日志。
- 当断点的 All 属性被勾选,触发该断点时,会挂起所有线程当断点的 Thead 属性被勾选,触发该断点时,只会挂起触发该断点的那个线程,不影响其他线程
- 当需要在不暂停程序的情况下记录一些表达式时(例如,需要知道一个方法被调用了多少次时),或者需要创建一个主断点,在击中后启用附属断点时,非暂停性断点是非常有用的。
- 实际生产实践中,可用于调试多线程并发的问题
Condition
- 可以输入一段能获得true或false的表达式,程序运行到断点处,且表达式条件为true才会触发断点
Log
- 下面三个属性选项经常配合 Suppend 属性一起使用,用于在不挂起的情况下,输出一些想要的日志信息
Breakpint hit message :控制台输出触发端点的日志信息,类似如: Breakpoint reached at com.project.info.test.TestOne.main(TestOne.java:18)
Stack trace :输出触发断点时的堆栈信息(非常实用,特别是代码嵌套比较深)
Evaluate and log :计算表达式结果并输出表达式结果到控制台,表达式的计算基于断点所在行的上下文,表达式的语句可以是字符串字面量,如 "我是字符串" ,也可以是方法调用,如users.size() ,也可以是多行语句块,表达式的结果取自return语句,如果没有return语句,会取表达式中的最后一行语句。
Remove once hit
- 是否在断点触发后移除该断点,后续不再触发
Disable until hitting the following breakpoint
- 指定在另一个断点触发后,该断点才启用,若该断点启用后,并且被触发
- 场景:当只需要在某些条件下或者某些操作后暂停程序时,这个选项很有用。在这种情况下,触发断点通常不需要停止程序的执行,而是做成非暂停状态。
Filters
- 前边说的大都数属性,都只针对方法程序运行上下文。
- 此属性更多关注通过过滤掉类、实例和调用者方法来微调断点操作,只在需要时暂停程序。
- Catch class filters :此选项只对异常类型的断点可用,可以让程序只在指定类和子类中抛出的异常才会触发断点或者不在指定的类和子类中触发断点(即排除一些类,排除通常以 - 开始,例如 -pacakge.ClassName )
- Instance filters :只有指定实例id号可以触发断点,多个实例id号以逗号隔开,实例id号可以在Variables和Memory面板中查看
- Class filters :可以让程序只在指定类和子类中才会触发断点或者不在指定的类和子类中触发断点(即排除一些类)。
- Caller filters :根据调用者来进行过滤,需指定方法的全限定名(包含方法签名),例如mypackage.MyObject.addString(Ljava/lang/String)
配置 | 说明 | 适用 |
-package1.Class1.method1([Ljava/lang/String;)Ljava/util/List; | 该示例中排除了来自package1.Class1类中method1方法并且方法签名是: List method1(String[] input) 的调用(即不触发断点) | caller filter |
package1.Class1 *s2 -package3.Class3 | 该示例中,断点仅在package1.Class1以及全限定名以 s2结尾的类中可以被触发,并且不在package3.Class3中触发( - 开头表示排除) | Class filters 和 catch class filter |
-java.* -sun.* | 该示例排除了 javaand sun包下的所有类(``- 开头表示排除) | Class filters 和 catch class filter |
Pass count
- 勾选中并输入一个正整数N,N>=1,那么程序会每N次命中断点才会触发挂起,如果同时设置了condition 与 pass count 属性,ide会优先判断 condition 表达式,再判断 pass count 是否满足,下例中, pass count 中传入的是5,每5次命中断点才会触发断点,挂起程序
5. 断点状态
状态 | 描述 |
Verified | 启动调试器会话后,调试器会检查在技术上是否可以在断点处暂停程序。如果是,调试器将该断点标记为已验证。 |
Warning | 如果在技术上可以在断点处暂停程序,但是有相关的问题,调试器会给你一个警告。例如,这可能发生在无法在某个方法的实现处暂停程序的情况下。 |
Invalid | 如果在技术上不可能在断点处暂停程序,调试器会将其标记为无效。最常见的原因是该行没有可执行的代码。 |
Inactive/dependent | 当一个断点被配置为禁用,直到另一个断点被击中,而这还没有发生时,该断点被标记为非活动/依赖性。 |
Muted | 所有的断点都是暂时不活动的,因为它们已经被静止了。 |
Disabled | 该断点暂时不活动,因为它已被禁用。 |
Non-suspending | 为该断点设置了暂停策略,因此,当击中该断点时不会暂停执行。 |
6. 远程调试
- 打开Idea的 Run/Debug Configurations 新增一个Remote。 JVM参数添加 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
- 远程项目启动添加参数:java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar xxx.jar
- idea启动remote,并打断点调试
7. 生产环境建议
1. 使用断点进行 "printf "调试
使用非暂停的日志断点,而不是在代码中插入打印语句。这为处理调试日志信息提供了一种更灵活和集中的方式。
场景:所有需要打印的地方,生产上禁止 System.out.print();
2. 调试无响应的应用程序
如果你的应用程序挂起,暂停会话,让调试器获得关于其当前状态的信息。然后你可以检查程序的状态并找出问题的原因。
场景:项目启动卡死等处理
3. 测试你的程序是否有并发性问题
发现多线程程序在并发方面是否健壮的一个好方法是使用断点,在碰到时只暂停一个线程。停止一个线程可能会揭示出应用程序设计中的问题,否则这些问题就不会显现出来。
- 上一篇:Spring Boot 日志各种使用姿势,是时候捋清楚了
- 下一篇:如何阅读文献
相关推荐
- Vue 技术栈(全家桶)(vue technology)
-
Vue技术栈(全家桶)尚硅谷前端研究院第1章:Vue核心Vue简介官网英文官网:https://vuejs.org/中文官网:https://cn.vuejs.org/...
- vue 基础- nextTick 的使用场景(vue的nexttick这个方法有什么用)
-
前言《vue基础》系列是再次回炉vue记的笔记,除了官网那部分知识点外,还会加入自己的一些理解。(里面会有部分和官网相同的文案,有经验的同学择感兴趣的阅读)在开发时,是不是遇到过这样的场景,响应...
- vue3 组件初始化流程(vue组件初始化顺序)
-
学习完成响应式系统后,咋们来看看vue3组件的初始化流程既然是看vue组件的初始化流程,咋们先来创建基本的代码,跑跑流程(在app.vue中写入以下内容,来跑流程)...
- vue3优雅的设置element-plus的table自动滚动到底部
-
场景我是需要在table最后添加一行数据,然后把滚动条滚动到最后。查网上的解决方案都是读取html结构,暴力的去获取,虽能解决问题,但是不喜欢这种打补丁的解决方案,我想着官方应该有相关的定义,于是就去...
- Vue3为什么推荐使用ref而不是reactive
-
为什么推荐使用ref而不是reactivereactive本身具有很大局限性导致使用过程需要额外注意,如果忽视这些问题将对开发造成不小的麻烦;ref更像是vue2时代optionapi的data的替...
- 9、echarts 在 vue 中怎么引用?(必会)
-
首先我们初始化一个vue项目,执行vueinitwebpackechart,接着我们进入初始化的项目下。安装echarts,npminstallecharts-S//或...
- 无所不能,将 Vue 渲染到嵌入式液晶屏
-
该文章转载自公众号@前端时刻,https://mp.weixin.qq.com/s/WDHW36zhfNFVFVv4jO2vrA前言...
- vue-element-admin 增删改查(五)(vue-element-admin怎么用)
-
此篇幅比较长,涉及到的小知识点也比较多,一定要耐心看完,记住学东西没有耐心可不行!!!一、添加和修改注:添加和编辑用到了同一个组件,也就是此篇文章你能学会如何封装组件及引用组件;第二能学会async和...
- 最全的 Vue 面试题+详解答案(vue面试题知识点大全)
-
前言本文整理了...
- 基于 vue3.0 桌面端朋友圈/登录验证+60s倒计时
-
今天给大家分享的是Vue3聊天实例中的朋友圈的实现及登录验证和倒计时操作。先上效果图这个是最新开发的vue3.x网页端聊天项目中的朋友圈模块。用到了ElementPlus...
- 不来看看这些 VUE 的生命周期钩子函数?| 原力计划
-
作者|huangfuyk责编|王晓曼出品|CSDN博客VUE的生命周期钩子函数:就是指在一个组件从创建到销毁的过程自动执行的函数,包含组件的变化。可以分为:创建、挂载、更新、销毁四个模块...
- Vue3.5正式上线,父传子props用法更丝滑简洁
-
前言Vue3.5在2024-09-03正式上线,目前在Vue官网显最新版本已经是Vue3.5,其中主要包含了几个小改动,我留意到日常最常用的改动就是props了,肯定是用Vue3的人必用的,所以针对性...
- Vue 3 生命周期完整指南(vue生命周期及使用)
-
Vue2和Vue3中的生命周期钩子的工作方式非常相似,我们仍然可以访问相同的钩子,也希望将它们能用于相同的场景。...
- 救命!这 10 个 Vue3 技巧藏太深了!性能翻倍 + 摸鱼神器全揭秘
-
前端打工人集合!是不是经常遇到这些崩溃瞬间:Vue3项目越写越卡,组件通信像走迷宫,复杂逻辑写得脑壳疼?别慌!作为在一线摸爬滚打多年的老前端,今天直接甩出10个超实用的Vue3实战技巧,手把...
- 怎么在 vue 中使用 form 清除校验状态?
-
在Vue中使用表单验证时,经常需要清除表单的校验状态。下面我将介绍一些方法来清除表单的校验状态。1.使用this.$refs...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Vue 技术栈(全家桶)(vue technology)
- vue 基础- nextTick 的使用场景(vue的nexttick这个方法有什么用)
- vue3 组件初始化流程(vue组件初始化顺序)
- vue3优雅的设置element-plus的table自动滚动到底部
- Vue3为什么推荐使用ref而不是reactive
- 9、echarts 在 vue 中怎么引用?(必会)
- 无所不能,将 Vue 渲染到嵌入式液晶屏
- vue-element-admin 增删改查(五)(vue-element-admin怎么用)
- 最全的 Vue 面试题+详解答案(vue面试题知识点大全)
- 基于 vue3.0 桌面端朋友圈/登录验证+60s倒计时
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- node卸载 (33)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- exceptionininitializererror (33)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)