断点
最后修改时间:2023 年 10 月 16 日切换行断点:CtrlF8
编辑断点属性:CtrlShiftF8
断点是在特定点暂停程序执行的特殊标记。这使您可以检查程序状态和行为。断点可以很简单(例如,在到达某行代码时暂停程序),也可以涉及更复杂的逻辑(检查附加条件、写入日志消息等)。
设置后,断点将保留在您的项目中,直到您明确删除它为止,临时断点除外。
笔记
如果带有断点的文件被外部修改,例如通过 VCS 更新或在外部编辑器中更改,并且行号已更改,断点将相应移动。请注意,进行此类更改时,IntelliJ IDEA 必须正在运行,否则它们将不会被注意到。
断点类型
IntelliJ IDEA 中提供以下类型的断点:
行断点:在到达设置断点的代码行时暂停程序。这种类型的断点可以设置在任何可执行代码行上。
方法断点:在进入或退出指定方法或其实现之一时暂停程序,允许您检查方法的进入/退出条件。
字段观察点:当读取或写入指定字段时暂停程序。这允许您对与特定实例变量的交互做出反应。例如,如果在一个复杂的过程结束时,您在某个字段上得到明显错误的值,那么设置字段观察点可能有助于确定故障的根源。
异常断点
Throwable
:当抛出异常或其子类时,暂停程序 。它们全局适用于异常情况,不需要特定的源代码参考。
设置断点
设置行断点
单击要设置断点的可执行代码行的装订线。或者,将插入符号放在该行并按。CtrlF8
如果该行包含 lambda 表达式,您可以选择是否要设置常规行断点,或者仅在调用 lambda 时暂停程序。
设置方法断点
单击声明该方法的行处的装订线。或者,将插入符号放在该行并按。CtrlF8
要在调用某个类的默认构造函数时暂停程序,请单击声明该类的行处的装订线或将插入符号放在该行处,然后按。CtrlF8
要匹配多个类或方法,请单击“调试”工具窗口左侧的“查看断点” ,然后单击“添加”并指定类和方法。用于匹配开头、结尾或整个标识符。 AltInsert
*
语法示例:
班级
方法
结果
*
print
print()
所有类中的方法(带有任何参数列表)Printer
*
Printer
类中的任何方法Printer
set*
Printer
班级中的所有二传手
设置现场观察点
单击声明字段的行处的装订线。或者,将插入符号放在该行并按。CtrlF8
设置异常断点
按或选择运行 | 从主菜单查看断点。CtrlShiftF8
根据异常的类型:
如果您想在抛出 的任何实例时挂起程序
Throwable
,请选中Java 异常下的任何异常。如果要在引发特定异常或其子类时暂停程序,请单击对话框左上角的“添加”并输入异常的名称。 AltInsert
管理断点
删除断点
对于非异常断点:单击装订线中的断点。
对于所有断点:转到Run | 查看断点 ,选择断点,然后单击删除。CtrlShiftF8 Delete
为了避免意外删除断点并丢失其参数,您可以选择通过将断点拖动到编辑器或单击鼠标中键来删除断点。为此,请转至“设置”|“ 构建、执行、部署 | 调试器并选择“拖动到编辑器”或单击鼠标中键。单击断点将启用或禁用它。
静音断点
如果您不需要在断点处停止一段时间,可以将它们静音。这允许您在不离开调试器会话的情况下恢复正常的程序操作。之后,您可以取消断点静音并继续调试。
单击“调试”工具窗口工具栏中的“静音断点”按钮。
启用/禁用断点
当您删除断点时,其内部配置将丢失。要暂时关闭单个断点而不丢失其参数,您可以禁用它:
对于非异常断点:右键单击它并根据需要设置“启用”选项。如果未指定删除断点,您还可以使用鼠标中键切换它们。
对于所有断点:单击“查看断点” 并选中/取消选中列表上的断点。CtrlShiftF8
移动/复制断点
要移动断点,请将其拖动到另一行。
要复制断点,请按住断点并将其拖动到另一行。这将在目标处创建一个具有相同参数的断点。Ctrl
配置断点的属性
根据断点类型,您可以配置其他属性,以便根据特定需要定制其操作。最常用的选项可以通过意图获得。
要访问断点意图,请将插入符号放在断点所在行并按。当您需要快速配置基本断点属性时,请使用此选项。AltEnter
要访问完整的属性列表,请右键单击断点,然后单击更多或按。使用此选项可以鸟瞰所有断点并完全控制其配置。CtrlShiftF8
意向参考
断点的属性
清除该复选框可暂时禁用断点,而不将其从项目中删除。在单步执行期间会跳过禁用的断点。
您可以配置 IntelliJ IDEA 以在单击时启用/禁用断点,而不是完全删除它们。为此,请转至“设置”|“ 构建、执行、部署 | 调试器并将“删除断点”选项设置为“拖动到编辑器”或单击鼠标中键。
该选项用于指定每次命中断点时检查的条件。如果条件评估为true
,则执行所选操作。否则,断点将被忽略。
笔记
条件必须在设置断点的行有效。
表达式的结果取自 return 语句。当没有return语句时,结果取自最后一行代码。
在条件正文中,您可以使用:
多个语句,包括声明、循环、匿名类等
this
(在非静态上下文中),例如,引用当前异常:!(this.entries.isEmpty())
用于在表达式中包含跟踪实例或检查其布尔字段的标签:
trackedObject_DebugLabel.isComplete()
在计算表达式时,请确保您了解它们可能的副作用,因为它们可能会影响程序的行为和结果。
当命中断点时,可以将以下内容记录到控制台:
“断点命中”消息:类似的日志消息
Breakpoint reached at ocean.Whale.main(Whale.java:5)
堆栈跟踪:当前帧的堆栈跟踪。如果您想在不中断程序执行的情况下检查哪些路径导致了这一点,这非常有用。
计算并记录:任意表达式的结果,例如
"Initializing"
orusers.size()
。该表达式忽略任何访问修饰符,并在设置断点的行的上下文中进行计算。
表达式的结果取自 return 语句。当没有 return 语句时,结果取自最后一行代码,甚至不必是表达式:文字也可以。这可用于生成自定义消息或在程序执行时跟踪某些值。
在计算表达式时,请确保您了解它们可能的副作用,因为它们可能会影响程序的行为和结果。
IntelliJ IDEA 调试器使您能够通过过滤掉类、实例和调用者方法来微调断点操作,并且仅在需要时挂起程序。
可以使用以下类型的过滤器:
捕获类过滤器:允许您仅在指定类之一捕获异常时暂停程序。仅适用于异常断点。
实例过滤器:将断点操作限制到特定的对象实例。这种类型的过滤器仅在非静态上下文中生效。
类过滤器:将断点操作限制为特定类。
调用者过滤器:根据当前方法的调用者限制断点操作。选择是否仅当从某个方法调用(或未调用)当前方法时才需要在断点处停止。
要设置过滤器,您可以单击文本字段附近的按钮并使用对话框或以文本格式定义它。对于文本格式,请使用以下语法:
类和方法是使用完全限定名称指定的。如果通过类名指定过滤器,则它指向类本身以及通过继承使用其成员的所有子类。
您可以使用以通配符开头或结尾的模式
*
来定义类或方法组,例如*.Foo
或java.*
。通过模式指定的过滤器指向其完全限定名称与该模式匹配的类/方法。对象实例是使用实例 ID 指定的。当对象位于范围内或使用“内存”选项卡时,您可以在“变量”选项卡中找到对象 ID 。
类名、调用者方法、模式和实例 ID 用空格分隔。
要排除类或调用方方法,请
-
在其名称前键入。在调用者过滤器中,使用参数和返回类型的描述符,例如:
mypackage.MyObject.addString(Ljava/lang/String;)V
。关于描述符的详细信息,请参考Oracle官方文档。
过滤器示例:
|
|
|
|
| 一个类/捕获类过滤器,它将断点应用于 |
指定断点是否仅在命中断点一定次数后才起作用。这对于调试多次调用的循环或方法很有用。
计数完成后,重置并重新开始。这意味着如果Pass count设置为10
,断点将在每第十次命中时运行。
如果同时设置了Pass Count和Condition,IntelliJ IDEA 首先满足条件,然后检查Pass Count。
笔记
设置“通过计数”后,实例和类过滤器不可用。
断点状态
断点可以有以下状态:
地位 | 描述 |
---|---|
已验证 | 启动调试器会话后,调试器会检查技术上是否可以在断点处挂起程序。如果是,调试器将断点标记为已验证。 |
警告 | 如果技术上可以在断点处暂停程序,但存在与之相关的问题,调试器会向您发出警告。例如,当无法在方法的实现之一处挂起程序时,可能会发生这种情况。 |
无效的 | 如果技术上不可能在断点处暂停程序,调试器会将其标记为无效。最常见的原因是线路上没有可执行代码。 |
不活跃/依赖 | 当断点被配置为禁用直到命中另一个断点时,断点被标记为非活动/依赖,而这还没有发生。 |
静音 | 所有断点都暂时处于非活动状态,因为它们已被静音。 |
残疾人 | 该断点暂时处于非活动状态,因为它已被禁用。 |
非暂停 | 为该断点设置了暂停策略,以便在命中时不会暂停执行。 |
断点图标
线 | 方法 | 场地 | 例外 | |
---|---|---|---|---|
常规的 | ||||
残疾人 | ||||
已验证 | ||||
静音 | ||||
不活跃/依赖 | ||||
静音不活跃/依赖 | ||||
静音禁用 | ||||
非暂停 | ||||
已验证非暂停 | ||||
无效的 |
生产力技巧
- 更快地设置日志断点
要设置非暂停 日志记录断点,请按住并单击装订线。这不会暂停程序执行,而是记录类似的消息。如果您想在编辑器中记录您面前的某些表达式,请在按住并单击装订线之前选择它。Shift
Breakpoint reached at ocean.Whale.main(Whale.java:5)
Shift- 添加断点描述
如果您的项目中有很多断点,您可以为断点添加描述,以便于搜索。为此,请右键单击“断点”对话框中的断点,然后从菜单中选择“编辑描述” 。现在,当您开始输入断点名称时,它就会获得焦点。CtrlShiftF8
- Lambda 表达式与方法引用
由于 JVM 设计的原因,与 lambda 表达式相反,方法引用不会在堆栈跟踪中提供有意义的信息。而且,无法在方法引用上设置断点。如果方法引用降低了关键的可追溯性,请考虑使用 lambda。
感谢您的反馈意见!