IDEA 断点(高级)
ztj100 2025-01-08 18:45 25 浏览 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 日志各种使用姿势,是时候捋清楚了
- 下一篇:如何阅读文献
相关推荐
- 其实TensorFlow真的很水无非就这30篇熬夜练
-
好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...
- 交叉验证和超参数调整:如何优化你的机器学习模型
-
准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...
- 机器学习交叉验证全指南:原理、类型与实战技巧
-
机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...
- 深度学习中的类别激活热图可视化
-
作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...
- 超强,必会的机器学习评估指标
-
大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...
- 机器学习入门教程-第六课:监督学习与非监督学习
-
1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...
- Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置
-
你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...
- 神经网络与传统统计方法的简单对比
-
传统的统计方法如...
- 自回归滞后模型进行多变量时间序列预测
-
下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...
- 苹果AI策略:慢哲学——科技行业的“长期主义”试金石
-
苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...
- 时间序列预测全攻略,6大模型代码实操
-
如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 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)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- 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)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)