# 逐步执行程序

> For the complete documentation index, see [llms.txt](https://www.jetbrains.com/zh-cn/help/idea/llms.txt).

> **TL;DR**
> 步过  ： `F8` (Windows), `F8` (macOS), `F8` (IntelliJ IDEA Classic (macOS)), `⌘ Quote` (macOS System Shortcuts), `F8` (XWin), `F8` (GNOME), `F8` (KDE), `F8` (Emacs), `F8` (Sublime Text), `F8` (Sublime Text (macOS)), `F10` (Visual Studio), `F10` (Visual Studio (macOS)), `F8` (NetBeans), `F6` (Eclipse), `F6` (Eclipse (macOS))
>
>
>
> 步入  ： `F7` (Windows), `F7` (macOS), `F7` (IntelliJ IDEA Classic (macOS)), `⌘ ;` (macOS System Shortcuts), `F7` (XWin), `F7` (GNOME), `F7` (KDE), `F7` (Emacs), `F7` (Sublime Text), `F7` (Sublime Text (macOS)), `F11` (Visual Studio), `⌘ F11` (Visual Studio (macOS)), `F7` (NetBeans), `F5` (Eclipse), `F5` (Eclipse (macOS))

逐步调试 是控制程序逐步执行的过程。

在 [启动](starting-the-debugger-session.html)调试会话并 [挂起程序](using-breakpoints.html)后，IntelliJ IDEA 会提供步进操作设置。 特定步进操作的选择取决于您的策略，例如是需要直接转到下一行，还是也需要 [检查](examining-suspended-program.html)中间方法调用。

步进按钮位于   调试   工具窗口的 [工具栏](debug-tool-window.html#Toolbar)上。

![调试工具窗口中的单步执行按钮](https://resources.jetbrains.com/help/img/idea/2026.3/debug_examining_stepping_buttons.png)

## 步过

> **TL;DR**
> 点击   步过   按钮 ![“步过”按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.run.stepOver.svg)，或按 `F8` (Windows), `F8` (macOS), `F8` (IntelliJ IDEA Classic (macOS)), `⌘ Quote` (macOS System Shortcuts), `F8` (XWin), `F8` (GNOME), `F8` (KDE), `F8` (Emacs), `F8` (Sublime Text), `F8` (Sublime Text (macOS)), `F10` (Visual Studio), `F10` (Visual Studio (macOS)), `F8` (NetBeans), `F6` (Eclipse), `F6` (Eclipse (macOS))。

逐步执行当前代码行，并转到下一行，即使高亮行中有方法调用。 方法的实现被跳过，您将直接移动到调用者方法的下一行。

```JAVA
public static void main(String[] args) {
    // the program is suspended here
    count(10);
    System.out.printIn("Count complete!");
}

```

在示例中，即将执行第 5 行。 如果步过，调试器将直接移至第 6 行，而不会访问  `count()`  方法。

```JAVA
public static void main(String[] args) {
    count(10);
    // execution point moves here after Step Over
    System.out.printIn("Count complete!");
}

```

如果跳过的方法中有断点，调试器将停在断点处。 要跳过执行过程中的任何断点，请使用 [强制步过](#force-step-over)。

## 步入

> **TL;DR**
> 点击   步入   按钮 ![单步调试按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.run.stepInto.svg)，或按 `F7` (Windows), `F7` (macOS), `F7` (IntelliJ IDEA Classic (macOS)), `⌘ ;` (macOS System Shortcuts), `F7` (XWin), `F7` (GNOME), `F7` (KDE), `F7` (Emacs), `F7` (Sublime Text), `F7` (Sublime Text (macOS)), `F11` (Visual Studio), `⌘ F11` (Visual Studio (macOS)), `F7` (NetBeans), `F5` (Eclipse), `F5` (Eclipse (macOS))。

进入方法以显示其内部发生的情况。

```JAVA
public static void main(String[] args) {
    // the program is suspended here
    count(10);
    System.out.printIn("Count complete!");
}

```

```JAVA
private static void count(int to) {
    // after Step Into, the program enters the count() method and
    for (int i = 0; i < 10; i++) {
        System.out.println(i);
    }
}

```

如果一行中有多个方法调用，IntelliJ IDEA 会询问您要进入哪个方法。 此功能称为 [智能步入](#smart-step-into)。

您可以配置   智能步入   使其在每次同一行有多个方法调用时自动使用。 或者，只有当您 [明确这样做](#smart-step-into)时才可以调用它。 要配置此功能，请前往  `设置 | 构建、执行、部署 | 调试器 | 单步执行` 并根据需要设置   始终使用智能步入  选项。

某些方法（例如，标准 Java 类的方法，如  `系统` ）会被   步入   跳过，因为您通常可能不需要调试它们。 您可以在  `构建、执行、部署 | 调试器 | 单步调试`  页面的   设置   对话框中（ `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS))）微调此列表。

## 智能步入

智能步入  在一行中有多个方法调用时非常有用，并且您希望具体指定要进入的方法。 此功能允许您选择您感兴趣的方法调用。

Procedure:

1. 从 ![](https://resources.jetbrains.com/help/img/idea/2026.3/app-client.expui.general.moreVertical.svg) 菜单中选择   智能步入  ，或按 `Shift+F7` (Windows), `⇧ F7` (macOS), `⇧ F7` (IntelliJ IDEA Classic (macOS)), `⌘ ⌥ ;` (macOS System Shortcuts), `Shift+F7` (XWin), `Shift+F7` (GNOME), `Shift+F7` (KDE), `Shift+F7` (Emacs), `Shift+F7` (Sublime Text), `⇧ F7` (Sublime Text (macOS)), `Shift+F7` (Visual Studio), `⇧ F7` (Visual Studio (macOS)), `Shift+F7` (NetBeans), `Ctrl+F5` (Eclipse), `⌥ F5` (Eclipse (macOS))。

2. 点击该方法。 或者，使用箭头键或 Tab 键选择方法，然后按 `Enter` (Windows), `⏎` (macOS), `⏎` (IntelliJ IDEA Classic (macOS)), `⏎` (macOS System Shortcuts), `Enter` (XWin), `Enter` (GNOME), `Enter` (KDE), `Enter` (Emacs), `Enter` (Sublime Text), `⏎` (Sublime Text (macOS)), `Enter` (Visual Studio), `⏎` (Visual Studio (macOS)), `Enter` (NetBeans), `Enter` (Eclipse), `⏎` (Eclipse (macOS)) 或 `F7` (Windows), `F7` (macOS), `F7` (IntelliJ IDEA Classic (macOS)), `⌘ ;` (macOS System Shortcuts), `F7` (XWin), `F7` (GNOME), `F7` (KDE), `F7` (Emacs), `F7` (Sublime Text), `F7` (Sublime Text (macOS)), `F11` (Visual Studio), `⌘ F11` (Visual Studio (macOS)), `F7` (NetBeans), `F5` (Eclipse), `F5` (Eclipse (macOS)) 确认选择。

![智能步入允许您决定进入哪个方法](https://resources.jetbrains.com/help/img/idea/2026.3/debug_examining_smart_step_into_1.png)

您可以配置   智能步入   以便在每次有多个方法调用时使用，而不是常规的   步入  。 这是在  `设置 | 构建、执行、部署 | 调试器 | 单步执行` 进行的。

## 步出

> **TL;DR**
> 点击   步出   按钮 ![单步跳出按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.run.stepOut.svg)，或按 `Shift+F8` (Windows), `⇧ F8` (macOS), `⇧ F8` (IntelliJ IDEA Classic (macOS)), `⌘ \` (macOS System Shortcuts), `Shift+F8` (XWin), `Shift+F8` (GNOME), `Shift+F8` (KDE), `Shift+F8` (Emacs), `Shift+F8` (Sublime Text), `⇧ F8` (Sublime Text (macOS)), `Shift+F11` (Visual Studio), `⇧ F11` (Visual Studio (macOS)), `Ctrl+F7` (NetBeans), `F7` (Eclipse), `F7` (Eclipse (macOS))。

跳出当前方法并将您带到调用方法。

```JAVA
private static void count(int to) {
    // the program is suspended here
    for (int i = 0; i < 10; i++) {
        System.out.println(i);
    }
}

```

```JAVA
public static void main(String[] args) {
    count(10);
    // after Step Out, the program exits the count() method
    System.out.printIn("Count complete!");
}

```

## 退出代码块

> **TL;DR**
> 从 ![](https://resources.jetbrains.com/help/img/idea/2026.3/app-client.expui.general.moreVertical.svg) 菜单中选择   退出代码块  。

退出当前执行的代码块，例如  `if`  语句或  `for`  循环，而不退出封闭方法。

```JAVA
static void count(int to) {
    for (int i = 0; i < to; i++) {
        // the program is suspended here
        System.out.println(i);
    }
    System.out.println("Complete!");
}

```

在示例中，该操作退出了  `for`  循环。 请注意，循环无论如何都会执行，并且会像逐步执行每次迭代一样，将所有数字打印到控制台。

```JAVA
static void count(int to) {
    for (int i = 0; i < to; i++) {
        System.out.println(i);
    }
    // Step Out of Code Block takes us here
    System.out.println("Complete!");
}

```

## 运行至光标处

直到光标位置为止继续执行。

Procedure:

1. 将文本光标放在希望程序暂停的行上。

2. 从 ![](https://resources.jetbrains.com/help/img/idea/2026.3/app-client.expui.general.moreVertical.svg) 菜单中选择   运行至光标处  ，或按 `Alt+F9` (Windows), `⌥ F9` (macOS), `⌥ F9` (IntelliJ IDEA Classic (macOS)), `⌃ ⇧ \` (macOS System Shortcuts), `Alt+Shift+9` (XWin), `Alt+Shift+9` (GNOME), `Alt+Shift+9` (KDE), `Alt+F9` (Emacs), `Alt+F9` (Sublime Text), `⌥ F9` (Sublime Text (macOS)), `Ctrl+F10` (Visual Studio), `⌘ F10` (Visual Studio (macOS)), `F4` (NetBeans), `Ctrl+R` (Eclipse), `⌘ R` (Eclipse (macOS))。

此外，您可以通过将鼠标悬停在行上并点击   运行至光标处   图标来   运行至光标处  。

![点击即可运行到光标处](https://resources.jetbrains.com/help/img/idea/2026.3/调试配置](run-debug-configuration.html) 分别启用此功能：转到  `运行 | 编辑配置` ，选择配置，点击   修改选项  ，然后在   Java   部分中选择   使用“运行到光标”记录性能   选项。 重启调试会话以使更改生效。

启用性能记录后，   运行至光标处   会测量执行时间，并将结果显示为相应行旁装订区域中的标签。 这些标签会保持可见，直到下一次   运行至光标处   操作或当前调试会话结束。

可以点击性能标签导航到方法实现。 如果该行调用多个方法，请从列表中选择一个。 实现的行也会标记有来自同一记录的性能标签。

![编辑器边栏中的性能统计](https://resources.jetbrains.com/help/img/idea/2026.3/record-with-run-to-cursor.png)

> **Note:**
> 性能记录需要本地运行的 x86-64 或 ARM64 HotSpot JDK。 不支持 OpenJ9、在 Windows ARM64 上运行的 x86-64 JDK，以及 [运行目标](run-targets.html)。 使用不受支持的 JDK 的运行/调试配置仍可运行，但不会记录性能数据。

> **Tip:**
> 运行至光标处   是一种快速测量代码片段性能的方法。 如果您需要分析整个程序，请考虑 [附加分析器](read-the-profiling-report.html#line-profiler)。

## 强制单步执行

> **TL;DR**
> 从 ![](https://resources.jetbrains.com/help/img/idea/2026.3/app-client.expui.general.moreVertical.svg) 菜单中选择   强制步入  ，或按 `Alt+Shift+F7` (Windows), `⌥ ⇧ F7` (macOS), `⌥ ⇧ F7` (IntelliJ IDEA Classic (macOS)), `⌥ ⇧ ;` (macOS System Shortcuts), `Alt+Shift+F7` (XWin), `Alt+Shift+F7` (GNOME), `Alt+Shift+F7` (KDE), `Alt+Shift+F7` (Emacs), `Alt+Shift+F7` (Sublime Text), `⌥ ⇧ F7` (Sublime Text (macOS)), `Alt+F11` (Visual Studio), `⌥ F11` (Visual Studio (macOS)), `Alt+Shift+F7` (NetBeans), `Alt+Shift+F7` (Eclipse), `⌘ ⌃ F5` (Eclipse (macOS))。

方法的步骤即使该方法被常规   步入   [跳过](#configuring-skipped-list)。

```JAVA
static void count(int to) {
    for (int i = 0; i < to; i++) {
        // the program is suspended here
            System.out.println(i);
        }
    System.out.println("Complete!");
}

```

在示例中，我们直接跳到  `System.out.println()`  方法的实现，而常规的   步入   会继续到循环的下一次迭代。

```JAVA
public void println(String x) {
    // Force Step Into enters the implementation of PrintStream.println()
    if (getClass() == PrintStream.class) {
        writeln(String.valueOf(x));
    } else {
        synchronized (this) {
            print(x);
            newLine();
        }
    }
}

```

## 强制运行到光标

[继续执行](#run-to-cursor)，直到到达文本光标位置。 所有中途的断点都将被忽略。

Procedure:

1. 将文本光标放在希望程序暂停的行上。

2. 从 ![](https://resources.jetbrains.com/help/img/idea/2026.3/app-client.expui.general.moreVertical.svg) 菜单中选择   强制运行至光标处  ，或按 `Ctrl+Alt+F9` (Windows), `⌘ ⌥ F9` (macOS), `⌘ ⌥ F9` (IntelliJ IDEA Classic (macOS)), `⌃ ⌥ ⇧ \` (macOS System Shortcuts), `Ctrl+Alt+9` (XWin), `Ctrl+Alt+9` (GNOME), `Ctrl+Alt+9` (KDE), `Ctrl+Alt+F9` (Emacs), `Ctrl+Alt+F9` (Sublime Text), `⌘ ⌥ F9` (Sublime Text (macOS)), `Ctrl+Alt+F9` (Visual Studio), `⌘ ⌥ F9` (Visual Studio (macOS)), `Ctrl+Alt+F9` (NetBeans), `Ctrl+Alt+F9` (Eclipse), `⌘ ⌥ F9` (Eclipse (macOS))。

## 强制步过

> **TL;DR**
> 从 ![](https://resources.jetbrains.com/help/img/idea/2026.3/app-client.expui.general.moreVertical.svg) 菜单中选择   强制步过  ，或按 `Alt+Shift+F8` (Windows), `⌥ ⇧ F8` (macOS), `⌥ ⇧ F8` (IntelliJ IDEA Classic (macOS)), `⌥ ⇧ Quote` (macOS System Shortcuts), `Alt+Shift+F8` (XWin), `Alt+Shift+F8` (GNOME), `Alt+Shift+F8` (KDE), `Alt+Shift+F8` (Emacs), `Alt+Shift+F8` (Sublime Text), `⌥ ⇧ F8` (Sublime Text (macOS)), `Alt+Shift+F8` (Visual Studio), `⌥ ⇧ F8` (Visual Studio (macOS)), `Alt+Shift+F8` (NetBeans), `Alt+Shift+F8` (Eclipse), `⌘ ⌃ F6` (Eclipse (macOS))。

[步过](#step-over)当前代码行并转到下一行，即使当前行中包含方法调用。 如果在被调用方法中有断点，它们会被忽略。

##  重置帧 

允许您撤销最后一个帧并恢复堆栈中的前一个帧。 例如，如果您不小心走得太远，或者想重新进入错过了关键点的函数，这可能会很有用。

请注意，此选项仅影响局部变量，并不会恢复整个程序的状态，因为它不会恢复静态和实例变量的值。 这可能导致程序流程发生变化。

Procedure:

* 在   线程   选项卡中，将鼠标悬停在要重置的帧上，然后点击出现的   重置帧   按钮。

![线程选项卡中的重置帧按钮](https://resources.jetbrains.com/help/img/idea/2026.3/reset-frame.png)

```JAVA
public static void main(String[] args) {
    count(10);
    System.out.println("Count complete!");
}

private static void count(int to) {
    for (int i = 0; i < to; i++) {
        // the program is suspended here
        System.out.println(i);
    }
}

```

在示例中，丢弃帧会将您返回到  `main()` ，仿佛  `count`  从未执行过。 没有受到影响的静态变量或实例变量，但控制台输出，已经生成并且可以视为副作用，仍然存在。

```JAVA
public static void main(String[] args) {
    // Reset Frame returns the execution to the line preceding the last method call
    count(10);
    System.out.println("Count complete!");
}

private static void count(int to) {
    for (int i = 0; i < to; i++) {
        System.out.println(i);
    }
}

```

> **Note:**
> 重置帧   不等于回到过去。 调试您的应用程序时请牢记这一点。

## 排查被跳过的断点

IntelliJ IDEA 可能会在以下情况下跳过断点：

* 在单步执行或执行 运行至光标处 时，另一个线程中触发了断点

* 断点在代码块中被命中，该代码块由自动表达式或监视等功能进行评估。

如果这种情况发生在对您的调试会话至关重要的断点上，请按照以下步骤操作，以防止IntelliJ IDEA丢失它们：

* 执行单步操作或 运行至光标处 从一个 [仅暂停当前线程](using-breakpoints.html#suspend_policy)的断点

* 关闭以下功能： * [变量视图中的自动表达式](customizing-views.html#auto-expressions) * [集合类的备用视图](customizing-views.html#data-view-properties) * [toString() 对象视图](customizing-views.html#data-view-properties)

> **Tip:**
> 您可以在   外观与行为 | 通知  设置页面 `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS))配置调试器通知。 如需更多信息，请参阅 [通知](notifications.html)。

## 提高单步执行速度

调试器功能会消耗资源，并可能影响单步性能。 如果性能不理想，请按照本章提供的建议进行优化。

Procedure:

* 使用 [Overhead](monitor-debugger-overhead.html) 功能来识别性能下降的原因。

* 如果您的项目不需要，请禁用或最小化使用以下功能：

* [方法断点和字段观察点](using-breakpoints.html)

* 显示方法返回值 选项。 您可以在调试器工具栏的 `更多 | 调试器设置` 下访问它。

* 用于集合类的备用视图 选项 ( `设置 | 构建、执行、部署 | 调试器 | 数据视图 | Java` )

* “toString”对象视图 （ `设置 | 构建、执行、部署 | 调试器 | 数据视图 | Java` ）

* 简化 [断点和观察点](using-breakpoints.html) 的条件，尤其是那些经常触发的。

* 在调试会话期间，切换到包含更少元素的视图。

## 配置单步执行行为

Procedure:

* 按 `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS)) 打开设置，然后选择  `构建、执行、部署 | 调试器 | 单步调试` 。

|  选项  |  描述  |
| --- | --- |
|  跳过合成方法  |  选中此复选框可在调试时禁止进入合成方法（由编译器生成的方法）。  |
|  跳过构造函数  |  选中此复选框以在调试时禁止进入构造函数。  |
|  跳过加载器  |  选中此复选框以在调试时阻止进入类加载器。  |
|  跳过简单的getter  |  选中此复选框以在调试时抑制进入简单的 getter 方法（即，仅用于返回必要值的方法）。  |
|  不要进入类  |  选中此复选框以在调试时禁止进入指定类。 类列表包含两种类型的条目：     * 完全限定类名。    * 正则表达式（精确匹配，或以 "*" 开头或结尾的模式，例如 `java.*` ）。      默认情况下，该列表包含一些标准的 Java SDK 类模式，这样您就不必浪费时间进入 Java 类库。 请使用列表中的复选框临时禁用/启用特定模式。       请使用 ![添加类](https://resources.jetbrains.com/help/img/idea/2026.3/app.toolbarDecorator.addClass.svg)、 ![添加模式](https://resources.jetbrains.com/help/img/idea/2026.3/app.toolbarDecorator.addPattern.svg) 和 ![移除](https://resources.jetbrains.com/help/img/idea/2026.3/app.expui.general.remove.svg) 按钮管理列表。     |
|  在弹出帧时评估 finally 块  |  选择您是否希望在弹出框中评估  `finally` 块，或者您希望在评估之前收到通知。  |
|  只恢复当前线程  |  如果需要在单步操作时仅恢复活动线程，请选中此复选框。  |

