2)字段断点(field breakpoints)
当指定的字段被读取或修改时会进入端点,暂停程序。
- 如果在一个复杂的过程结束时,某个字段出现了明显的错误值,设置一个字段观察点可能有助于确定故障的来源。
在定义字段的代码行的 左侧数字栏
直接鼠标单机设置的断点就是字段断点;
鼠标右键点击该断点图标 ,弹出该断点配置,会有Field access和Field modification选项;这两个选项项是字段类型断点特有的,分别对应 访问该字段、修改该字段触发断点,两项同时选中,则访问、修改该字段都会触发断点。
默认只有修改字段时才会触发断点。
3)方法断点(method breakpoints)
在进入或退出指定的方法或其实现之一时暂停程序;允许我们检查该方法的进入/退出条件。
1> 加载类名上的断点
当断点加在class类名这一行,并且该类中没有编写构造函数(只有默认无参构造函数)时,当调用默认无参构造函数时会触发此断点,程序挂起;所以虽然这个断点的图标是行断点类型图标,但实际上其属于方法类型断点。
2> 正常方法断点
在方法名这一行加断点,鼠标右键点击该断点图标 ,弹出该断点配置,会有Emulated、Method entry、Method exit选项,此选项是方法类型断点特有的。
- Emulated勾选中,会将方法断点优化成方法中第一条和最后一条语句的行断点,这样会优化调试的性能,因此在IDE中会默认选中。
3> 通过匹配符批量添加方法断点
鼠标右键点击某一个方法断点图标,然后点击More
,会弹出断点列表页;
在断点列表页中,做如下操作:
- 点击
+
号,弹出下列选择框;
- 选择
Java Method Breakpoints
,弹出如下窗口;
Class pattern 和 Method name中输入的匹配符规则示例如下:
Class | Method | Result |
* | print | 匹配所有类的 |
DebugTest | * | 匹配 |
DebugTest | set* | 匹配 |
4)异常断点(exception breakpoints)
当程序抛出指定异常时会激活异常断点,与行断点不同,异常断点不需要与源代码映射,因为异常断点应用程序级别的。
异常断点分为两种:
- 一种是Any Exception,任意Throwable异常被捕获或未被捕获就会触发断点;
- 另一种是指定类型的异常及其该异常子类被捕获或未被捕获会触发断点;
异常断点的添加方式:在断点列表页中,做如下操作:
- 点击
+
号,弹出下列选择框;- 选择
Java Exception Breakpoints
,弹出如下窗口;
假如我们选择了java.lang.NullPointerException:
异常断点有两个特有的配置:Caught exception
和 Uncaught 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 reached
at 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 是否满足。