IDEA 断点(高级) idea中断点调试
yuyutoo 2024-10-12 01:52 2 浏览 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. 测试你的程序是否有并发性问题
发现多线程程序在并发方面是否健壮的一个好方法是使用断点,在碰到时只暂停一个线程。停止一个线程可能会揭示出应用程序设计中的问题,否则这些问题就不会显现出来。
相关推荐
- 史上最全的浏览器兼容性问题和解决方案
-
微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...
-
- 平面设计基础知识_平面设计基础知识实验收获与总结
-
CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...
-
2025-02-21 16:01 yuyutoo
- 写作排版简单三步就行-工具篇_作文排版模板
-
和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...
- 写一个2048的游戏_2048小游戏功能实现
-
1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...
- 今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……
-
最近的天气暖和得让很多小伙伴们喊“热”!!! 昨天的气温到底升得有多高呢?你家有没有榜上有名?...
- CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式
-
之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...
- 你的自我界限够强大吗?_你的自我界限够强大吗英文
-
我的结果:A、该设立新的界限...
- 行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?
-
行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...
-
- 让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
-
去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...
-
2025-02-21 16:00 yuyutoo
- 今年国家综合性消防救援队伍计划招录消防员15000名
-
记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...
- 一起盘点最新 Chrome v133 的5大主流特性 ?
-
1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...
- 竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使
-
style="text-align:center;"data-mce-style="text-align:...
- 学物理能做什么?_学物理能做什么 卢昌海
-
作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...
-
- 你不知道的关于这只眯眼兔的6个小秘密
-
在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...
-
2025-02-21 16:00 yuyutoo
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)