单步执行程序
最后修改时间:2023 年 10 月 28 日跨步:F8
步入:F7
单步执行是控制程序逐步执行的过程。
IntelliJ IDEA 提供了一组步进操作,这些操作的使用取决于您的策略(例如,您是否需要直接转到下一行或输入在此处调用的方法)。
步进按钮位于调试窗口工具栏上。

跨过去
跳过当前代码行并将您带到下一行,即使突出显示的行中包含方法调用也是如此。方法的实现将被跳过,直接进入调用者方法的下一行。
单击“跳过”按钮
或按。F8
在示例中,第 5 行即将被执行。如果您跳过,调试器将直接移至第 6 行,而不会跳转到该count()
方法。

如果跳过的方法内有断点,调试器将在它们处停止。要跳过途中的任何断点,请使用Force step over。

步入
进入该方法以显示其中发生的情况。当您不确定该方法是否返回正确的结果时,请使用此选项。
单击“步入”按钮
或按。F7
在示例中,第 5 行即将被执行。如果您进入,调试器将跳转到该方法的实现,count(int to)
允许您详细检查其结果是如何生成的。

如果线路上有多个方法调用,IntelliJ IDEA 会询问您输入哪个方法。此功能称为智能步入。

您可以将智能单步配置为每次线路上有多个方法调用时自动使用。或者,只有当您明确这样做时才可以调用它。要配置此功能,请转至设置| 构建、执行、部署 | 调试器| 单步执行并根据需要设置始终执行智能单步执行选项。
某些方法(例如,标准 Java 类的方法,如)会被Step intoSystem
跳过,因为您通常可能不需要调试它们。该列表可以在构建、执行、部署 |上进行微调。调试器| 设置对话框的步进页面( )。CtrlAlt0S
智能步入
当一行上有多个方法调用并且您想要具体输入哪个方法时,智能单步执行会很有帮助。此功能允许您选择您感兴趣的方法调用。
从菜单中选择智能步入
或按。ShiftF7
单击该方法。您还可以使用箭头键或选项卡选择它,然后按/ 。EnterF7
您可以配置每次线路上有多个方法调用时使用智能单步执行,而不是常规单步执行。这是在设置 |中完成的。构建、执行、部署 | 调试器| 迈步。
走出去
跳出当前方法并转到调用者方法。
单击“步出”按钮
或按。ShiftF8
在示例中,单步执行会跳过循环的所有迭代,并直接进入方法main
(调用者)。

跳出代码块
跳出当前执行的代码块。这使您可以跳过 、 等的剩余迭代while
,for
而无需退出封闭方法。
转到“运行”| 调试操作| 跳出代码块。
在示例中,操作退出for
循环并将我们带到第 12 行。请注意,无论如何都会执行循环,并且输出在控制台中可见,就好像我们已经单步执行了每次迭代一样。

运行到光标处
继续执行,直到到达插入符号的位置。
将插入符号放在您希望程序暂停的行处。
从菜单中选择运行到光标处
或按。AltF9
此外,在经典 UI 中,您可以通过单击装订线中的行号来运行到光标。

您可以在“设置”|“设置”中配置是否希望“运行到光标”在单击行号时起作用。构建、执行、部署 | 调试器。
在示例中,运行到光标将继续执行并在第 7 行停止,就像存在断点一样。如果方法中有断点count()
,程序将暂停在那里。

要跳过途中的任何断点,请使用强制运行到光标。
强行步入
方法中的步骤,即使常规Step Into跳过此方法。
从菜单中选择强制步入
或按。AltShiftF7
在示例中,执行在即将调用 的行之前暂停System.out.println()
。

使用Force Step Into,我们可以直接跳到该方法的实现System.out.println()
,而常规的Step Into会将我们带到第 20 行。

强制运行到光标处
继续执行,直到到达插入符号的位置。途中的所有断点都将被忽略。
将插入符号放在您希望程序暂停的行处。
从菜单中选择强制运行到光标处
或按。CtrlAltF9
在示例中,强制运行到光标将继续执行并在第 7 行停止,就像存在断点一样。里面的断点count()
不会有任何影响。

用力跨过
跳过当前代码行并将您带到下一行,即使突出显示的行中包含方法调用也是如此。如果调用的方法中有断点,它们将被忽略。
从菜单中选择强制单步
或按。AltShiftF8
在示例中,强制单步执行会将您带到第 6 行的 print 语句,即使该方法中存在断点count()
,否则,使用单步执行时,会在循环的所有迭代中挂起应用程序。

重置框架
允许您撤消最后一帧并恢复堆栈中的前一帧。例如,如果您错误地走得太远,或者想要重新进入错过关键点的函数,这可能很有用。
请注意,此选项仅影响局部变量,不会恢复整个程序状态,因为它不会恢复静态变量和实例变量的值。这可能会导致程序流程发生改变。
将鼠标悬停在要重置的框架上,然后单击出现的“重置框架”按钮。
在下面的示例中,删除帧将返回到第 5 行,就好像count
从未执行过一样。没有受到影响的静态或实例变量,但是已经生成并且可以被视为副作用的控制台输出仍然存在。

笔记
重置帧并不等于回到过去。调试应用程序时请记住这一点。
解决跳过断点的问题
IntelliJ IDEA 在以下情况下可能会跳过断点:
单步执行或执行Run to Cursor时在另一个线程中命中断点
断点是在由自动表达式或监视等功能评估的代码块内命中的。
如果对调试会话至关重要的断点发生这种情况,请执行以下操作以防止 IntelliJ IDEA 丢失它们:
从仅暂停当前线程的断点执行单步执行或运行到光标
关闭以下功能:
提高迈步速度
调试器功能会消耗资源并可能影响步进性能。如果性能不理想,请按照本章提供的建议进行优化。
配置步进行为
按打开 IDE 设置,然后选择“构建”、“执行”、“部署”| 调试器| 迈步。CtrlAlt0S
根据需要配置步进行为。有关特定选项的更多信息,请参阅下表。
选项 | 描述 |
---|---|
跳过合成方法 | 选择此复选框可在调试时禁止单步执行合成方法(由编译器生成的方法)。 |
跳过构造函数 | 选择此复选框可在调试时禁止单步进入构造函数。 |
跳过类加载器 | 选择此复选框可在调试时禁止单步进入类加载器。 |
跳过简单的吸气剂 | 选择此复选框可在调试时禁止单步执行简单的 getter 方法(即,仅返回必要值的方法)。 |
请勿踏入课堂 | 选择此复选框可在调试时禁止单步执行指定的类。类列表包含两种类型的条目:
默认情况下,该列表包含一些标准 Java SDK 类模式,这样您就不必浪费时间进入 Java 类库。使用列表中的复选框暂时禁用/启用特定模式。 使用 |
评估弹出帧上的finally块 | 选择是否要评估 |
仅恢复当前线程 | 如果您需要在单步执行时仅恢复活动线程,请选择此复选框。 |
感谢您的反馈意见!