断点
断点是能够使程序在特定点暂停执行的特殊标记。 这使您能够检查程序状态和行为。 断点可以是简单的,例如,在达到某行代码时暂停程序,或者涉及更复杂的逻辑,例如检验 附加条件、 写入日志 等等。
一旦设置了断点,除非明确移除,否则它将一直保留在您的项目中, 临时断点除外。
断点类型
在 IntelliJ IDEA 中有以下类型的断点:
行断点 :在到达设置断点的代码行时暂停程序。 这种类型的断点可以设置在任何可执行的代码行上。
Method breakpoints :程序在进入或退出指定方法或其实现之一时暂停,使您可以检查方法的进入/退出条件。
字段监视点 :当指定字段被读取或写入时暂停程序。 这允许您对特定实例变量的交互做出反应。 例如,如果在一个复杂的过程中,您的某个字段的值明显错误,设置字段观察点可能有助于确定故障的起因。
异常断点 :当抛出
Throwable或其子类时暂停程序。 它们在任何情况下都适用,不需要特定的源代码引用。 与堆栈跟踪不同,在异常时暂停应用程序可让您检查周围的上下文或数据,同时这些数据仍然可用。
设置断点
设置行断点
点击可执行代码行的装订区域,设置断点。 或者,将文本光标放在该行并按 Ctrl+F8。

要定位某行内特定的 lambda 或 if-return 语句,请使用出现在这些语句附近的断点图标。

在 lambda 是行内唯一有意义的调试代码的情况下,例如 Java Stream 操作的情况,IntelliJ IDEA 将自动为该 lambda 设置断点,而不是为整行设置断点。
要设置临时行断点,请按 Ctrl+Alt+Shift+F8。 或者按住 Alt 并点击栏边。 此断点将在命中后立即从您的项目中删除。
设置方法断点
点击方法声明行的装订区域。 或者,将文本光标置于方法声明处并按 Ctrl+F8。

要在调用类的默认构造函数时挂起程序,请点击声明类所在行的标记栏。 或者,将文本光标放在类声明处并按 Ctrl+F8。

要定位多个类或方法,请从主菜单中选择 ,然后点击 添加 Alt+Insert ,选择 Java 方法断点 并指定类和方法。 使用
*来匹配标识符的开头、结尾或整个标识符。
语法示例:
类
方法
结果
*printprint()所有类中的方法(具有任何参数列表)Printer*Printer类中的任何方法Printerset*Printer类中的所有设置器**所有方法(例如,若您希望在启动后立即暂停应用程序)
设置字段断点
点击声明字段所在行的边距。 或者,将文本光标放在该行并按 Ctrl+F8。

设置异常断点
按 Ctrl+Shift+F8 或从主菜单中选择 。 然后,根据异常的类型:
如果您在控制台中有异常的堆栈跟踪,可以使用异常名称附近的 创建断点 按钮为该异常设置断点。

在编辑器中声明或使用异常时,您可以使用上下文菜单 Alt+Enter 为该异常设置断点。

管理断点
移除断点
对于非异常断点:点击装订区域的断点。
对于所有断点:转到主菜单中的 Ctrl+Shift+F8 ,选择断点,然后点击 移除 或按 Delete。
为了避免意外删除断点及其参数,您可以选择通过将它们拖到编辑器或点击鼠标中键来删除断点。 为此,请前往 并选择 拖动到编辑器或使用中键点击。 点击断点将 启用或禁用它。
静音断点
如果您暂时不需要在断点处暂停,可以将其 静音。 这使您能够在不离开调试器会话的情况下恢复正常程序操作。 之后,您可以取消静音断点并继续调试。
点击 忽略断点 按钮
在 调试 工具窗口的工具栏中。
启用/禁用断点
当您移除断点时,其 内部配置会丢失。 若要在不丢失断点参数的情况下暂时关闭单个断点,您可以 disable 它:
对于非异常断点:右键点击并根据需要设置 已启用 选项。 您还可以用中键切换它们,如果移除断点没有 assigned 到它。
对所有断点:点击 运行 | 查看断点 Ctrl+Shift+F8 ,然后在列表中选中/取消选中断点。
移动 / 复制断点
要移动断点,请将其拖到另一行。
要复制断点,请按住 Ctrl 并将断点拖到另一行。 这将在目标位置创建具有相同参数的断点。
查看所有设置的断点
您可以在 书签 工具窗口中查看所有断点的列表。 当您在代码中设置断点后,断点会自动添加到工具窗口中的专用列表中。
在主菜单中,转到 或按 Alt+2 ,并展开 断点 列表。

分组断点
您可以将断点组织到组中,例如,如果您需要标记出针对特定问题的断点。
在 断点 对话框 Ctrl+Shift+F8 中,选择您想要放置在组中的断点,然后从菜单中选择 。
配置断点的属性
根据断点类型,您可以配置附加属性,从而使其操作符合特定需求。 最常用的选项通过 意图可用。
要访问断点意图,请将文本光标放在有断点的行上,然后按 Alt+Enter。 在需要快速配置基本断点属性时,请使用此选项。
要访问完整的属性列表,请右键点击断点并点击 更多 或按 Ctrl+Shift+F8。
意图参考
断点属性参考
在本章中,您可以找到有关断点功能的信息。
已启用
取消选中此复选框以暂时禁用断点,而不将其从项目中移除。 禁用的断点将在单步执行期间被 跳过。
您可以配置 IntelliJ IDEA 以通过点击启用/禁用断点,而不是完全移除它们。 要执行此操作,请转到 并将 移除断点 选项设置为 拖动到编辑器中或使用鼠标中键点击。
挂起
指定在断点命中时是否暂停程序执行。
非挂起断点在您需要记录某个表达式而不暂停程序时非常有用(例如,当您需要知道方法被调用的次数时)或在您需要创建一个 触发断点以在触发时启用 依赖断点。
以下策略适用于暂停程序执行的断点:
所有 :当任一线程触发断点时,所有线程都将被挂起。
会话 :只有命中断点的线程会被挂起。
如果您想将某个策略用作默认策略,请点击 设为默认 按钮。
条件
该选项用于指定在每次命中断点时检查的条件。 如果条件计算结果为 true ,则执行所选操作。 否则,断点将被忽略。
表达式的结果取自 return 语句。 当没有 return 语句时,结果取自代码的最后一行。
在条件主体中,您可以使用:
多条语句,包括声明、循环、匿名类等
this(在非静态上下文中),例如,引用当前异常:!(this.entries.isEmpty())标签以在您的表达式中包含跟踪的实例或检查其布尔字段:
trackedObject_DebugLabel.isComplete()
在评估表达式时,请确保您意识到它们可能的副作用,因为它们可能会影响程序的行为和结果。
日志选项
当断点被触发时,可将以下内容记录到控制台:
“断点命中”消息(M) :一条类似
Breakpoint reached at ocean.Whale.main(Whale.java:5)的日志消息。堆栈跟踪(K) :当前帧的堆栈跟踪。 如果您想在不中断程序执行的情况下检查导致此点的路径,这将非常有用。
求值并记录(E) :任意表达式的结果,例如,
"Initializing"或users.size()。表达式会忽略任何访问修饰符,并在设置断点的行的上下文中进行求值。
表达式的结果取自 return 语句。 当没有 return 语句时,结果取自代码的最后一行,这行代码不必是表达式:文字常量也适用。 这可以用来生成自定义消息或在程序执行时跟踪一些值。
在评估表达式时,请确保您意识到它们可能的副作用,因为它们可能会影响程序的行为和结果。
设置日志断点
(可选)如果您想要记录的表达式在编辑器中显示在您面前,请选择它。
按住 Shift 并点击边栏。
命中后移除
指定断点在被命中一次后是否应从项目中移除。
筛选器
IntelliJ IDEA调试器使您能够通过筛选类、实例和调用方法来微调断点操作,并仅在需要的地方暂停程序。
可用的筛选器类型如下:
捕获 class 过滤器 :仅当异常将在指定类之一中被捕获时才允许您暂停程序。 仅适用于异常断点。
实例过滤器 :仅在某些对象实例上调用方法时才挂起程序。 这种类型的过滤器仅在非静态上下文中生效。
类筛选器 :仅在特定类中挂起程序。 对于异常情况,此筛选器会匹配抛出位置的类。
呼叫者过滤器 :根据当前方法的调用者挂起程序。 选择是否仅在当前方法从某个特定方法调用(或未调用)时停在断点。 该筛选器仅适用于直接调用者;调用堆栈的其余部分不会影响断点。
如需设置过滤器,请点击文本字段附近的按钮并使用对话框,或以文本格式定义。 对于文本格式,请使用以下语法:
类和方法使用完全限定名指定。 如果通过类名指定过滤器,它会指向类本身及其所有通过继承使用其成员的子类。
您可以使用以
*通配符开头或结尾的模式来定义类或方法组,例如*.Foo或java.*。 通过模式指定的过滤器指向完全限定名称与此模式匹配的类/方法。对象实例使用实例 ID 指定。 当对象在范围内时,您可以在 变量 选项卡中找到对象 ID,也可以使用 Memory选项卡。
类名、调用方法、模式和实例 ID 用空格分隔。
要排除某个类或调用者方法,请在其名称前键入
-。在调用者过滤器中,请使用描述符来表示参数和返回类型,例如:
mypackage.MyObject.addString(Ljava/lang/String;)V。 有关描述符的详细信息,请参阅 官方 Oracle 文档。
筛选示例:
| 一个忽略 |
| 一个调用者筛选器,用于排除 |
| 一个类/捕获类过滤器,将断点应用于 |
合格次数
指定断点仅在被触发一定次数后才会生效。 这对于涉及在长时间运行的循环中暂停应用程序或选择性记录频繁事件的调试场景非常有用。
计数完成后,它会重置并重新开始。 这意味着如果 合格次数 设置为 10 ,断点将在每第十次被触发时生效。
如果同时设置了 通过计数 和 条件 ,IntelliJ IDEA 首先满足条件,然后检查 通过计数。
字段访问/修改
字段访问 | 选择在读取字段时使观察点起作用。 |
字段修改 | 选择使监视点在字段被写入时工作。 |
模拟
启用此选项后,IntelliJ IDEA 会在方法的首尾语句处设置组合行断点,而不是使用较慢的“真实”方法断点。 模拟方法断点提高了调试性能,因此默认使用。
仅当您在调试远程代码,或者需要在没有行号信息的本机方法或类中设置断点时,我们才建议禁用此选项。
方法入口/出口
方法入口 | 选择在进入方法或其子代后使断点生效。 |
方法退出 | 选择在方法或其子方法返回之前使断点生效。 |
捕获/未捕获的异常
捕获异常 | 选择在捕获到指定异常时使断点起作用。 |
未捕获的异常 | 选择在未捕获指定异常时使断点起作用。 这使您能够检查程序状态,并在程序或线程因未处理的异常崩溃之前检测原因。 |
断点状态
断点可能具有以下状态:
状态 | 描述 |
|---|---|
已验证 | 当您开始调试器会话后,调试器会检查是否技术上可以在断点处暂停程序。 如果是,则调试器将断点标记为 已验证。 |
警告 | 如果技术上可以在断点处暂停程序,但存在相关问题,调试器会将断点状态设置为 warning。 例如,当无法在某个方法的某个实现处暂停程序时,可能会发生这种情况。 |
无效 | 如果在断点处技术上无法暂停程序,调试器会将其标记为 无效。 这经常发生是因为该行没有可执行代码。 |
非活动/依赖 | 当断点 配置为在另一个断点被触发前禁用时,它会被标记为非活动/依赖状态,并且此事件尚未发生。 |
静音 | 所有断点都已暂时失效,因为它们已被 静音。 |
已禁用 | 此断点暂时处于非活动状态,因为它已被 禁用。 |
非挂起 | 此断点的 挂起策略设置为命中时不挂起执行。 |
断点图标
折线图 | 方法 | 字段 | 异常 | |
|---|---|---|---|---|
Regular | ||||
已禁用 | ||||
已验证 | ||||
静音 | ||||
非活动/依赖 | ||||
静音状态的非活动/依赖 | ||||
静音已禁用 | ||||
非挂起 | ||||
已验证的非挂起 | ||||
无效 | ||||
效率提示
- 将断点用于“printf”调试
请使用 非中断 日志断点(在其他调试器中有时称为监视点)代替在您的代码中插入打印语句。 这提供了一种更灵活且集中的方式来处理调试日志消息。
- 更快速地设置日志断点
要设置一个 不断点 日志断点,请按住 Shift 并点击边栏。 这不会暂停程序执行,而是记录一条类似
Breakpoint reached at ocean.Whale.main(Whale.java:5)的消息。 如果您想记录编辑器中面前的某个表达式,请在按住 Shift 并点击装订线之前先选择它。- 添加断点描述
如果您的项目中有许多断点,您可以为这些断点添加描述以便于搜索。 要执行此操作,请右键点击 断点 对话框 Ctrl+Shift+F8 中的一个断点,然后从菜单中选择 编辑说明。 现在当您开始输入断点名称时,它会获得焦点。
- Lambda 表达式与方法引用
由于 JVM 设计,方法引用不像 lambda 表达式那样在堆栈跟踪中提供有意义的信息。 此外,无法在方法引用上设置断点。 如果方法引用在关键地方降低了可追溯性,请考虑使用 lambda 来代替。
- 诊断致命错误的原因
当异常断点与
Throwable一起工作时,您也可以使用它们在抛出Error的子类时暂停程序。 这对于调查诸如OutOfMemoryError和StackOverflowError之类错误的原因非常有用。 为它们设置异常断点后,您将能够查看程序崩溃前发生的情况。- 测试您的程序是否存在并发问题
判断一个多线程程序在并发性方面是否稳健的一个好方法是使用仅在一个线程被命中时才中断的断点。 停止单个线程可能会暴露应用程序设计中的问题,这些问题在其他情况下不会显现。