尝试以扩展 VS Code 中的代理模式!

使用 Visual Studio Code 调试代码

Visual Studio Code 对各种应用程序的调试提供了丰富的支持。VS Code 内置支持 JavaScript、TypeScript 和 Node.js 调试。Visual Studio Marketplace 中有各种各样的调试扩展,可以为 VS Code 添加对其他语言和运行时的调试支持。

本文介绍了 VS Code 的调试功能以及如何在 VS Code 中开始调试。您还将了解如何使用 VS Code 中的 Copilot 加速设置调试配置并启动调试会话。

以下视频展示了如何开始在 VS Code 中进行调试。

调试器用户界面

下图显示了调试器用户界面的主要组件

Debugging diagram

  1. 运行和调试视图:显示与运行、调试和管理调试配置设置相关的所有信息。
  2. 调试工具栏:包含最常见的调试操作按钮。
  3. 调试控制台:允许查看和与在调试器中运行的代码的输出进行交互。
  4. 调试侧边栏:在调试会话期间,允许您与调用堆栈、断点、变量和监视变量进行交互。
  5. 运行菜单:包含最常见的运行和调试命令。

开始调试之前

  1. 从适用于您的语言或运行时的Visual Studio Marketplace 安装调试扩展。

    VS Code 内置支持 JavaScript、TypeScript 和 Node.js 调试。

  2. 为您的项目定义调试配置。

    对于简单的应用程序,VS Code 会尝试运行和调试当前活动文件。对于更复杂的应用程序或调试场景,您需要创建一个 launch.json 文件来指定调试器配置。有关创建调试配置的更多信息。

    提示

    VS Code 中的 Copilot 可以帮助您生成 launch.json 文件。有关更多信息,请参阅使用 Copilot 生成调试配置

  3. 在代码中设置断点。

    断点是您可以在代码行上设置的标记,用于指示调试器在到达该行时暂停执行。您可以通过单击编辑器中行号旁边的边槽来设置断点。

    有关断点的更多信息,请参阅使用断点

启动调试会话

要在 VS Code 中启动调试会话,请执行以下步骤

  1. 打开包含您要调试的代码的文件。

  2. 使用F5键或在运行和调试视图(workbench.view.debug)中选择运行和调试来启动调试会话。

    Simplified initial Run and Debug view

    对于更复杂的调试场景,例如附加到正在运行的进程,您需要创建一个 launch.json 文件来指定调试器配置。获取有关调试配置的更多信息。

  3. 从可用调试器列表中选择您要使用的调试器。

    VS Code 会尝试运行和调试当前活动文件。对于 Node.js,VS Code 会检查 package.json 文件中的 start 脚本以确定应用程序的入口点。

  4. 当调试会话开始时,会显示调试控制台面板并显示调试输出,并且状态栏会改变颜色(默认颜色主题为橙色)。

    debug session

  5. 状态栏中的调试状态显示活动的调试配置。选择调试状态以更改活动启动配置,并无需打开运行和调试视图即可开始调试。

    Debug status

调试操作

一旦调试会话开始,调试工具栏会出现在窗口顶部。工具栏包含控制调试会话流程的操作,例如单步执行代码、暂停执行和停止调试会话。

Screenshot that shows the Debug toolbar, with icons to control the flow of the debug session.

下表描述了调试工具栏中可用的操作

操作 描述
继续 / 暂停
F5
继续:恢复正常的程序/脚本执行(直到下一个断点)。
暂停:检查当前行正在执行的代码并逐行调试。
步过
F10
将下一个方法作为单个命令执行,而不检查或跟踪其组件步骤。
步入
F11
进入下一个方法,逐行跟踪其执行。
步出
⇧F11 (Windows, Linux Shift+F11)
在方法或子例程内部时,通过将当前方法的剩余行作为单个命令完成,返回到早期的执行上下文。
重新启动
⇧⌘F5 (Windows, Linux Ctrl+Shift+F5)
终止当前程序执行并使用当前运行配置再次开始调试。
停止
⇧F5 (Windows, Linux Shift+F5)
终止当前程序执行。

如果您的调试会话涉及多个目标(例如,客户端和服务器),调试工具栏会显示会话列表并允许您在它们之间切换。

提示

使用debug.toolBarLocation设置控制调试工具栏的位置。它可以是默认的floating(浮动)、docked(停靠)到运行和调试视图,或hidden(隐藏)。浮动调试工具栏可以水平拖动,也可以向下拖动到编辑器区域(距离顶部边缘一定距离内)。

断点

断点是一种特殊的标记,它会暂停代码在特定点的执行,以便您可以在该点检查应用程序的状态。VS Code 支持多种类型的断点。

设置断点

要设置或取消设置断点,请单击编辑器边距或在当前行上使用F9

  • 编辑器边距中的断点通常显示为红色实心圆。
  • 禁用的断点显示为灰色实心圆。
  • 当调试会话开始时,无法向调试器注册的断点会变为灰色空心圆。如果源代码在没有实时编辑支持的调试会话运行期间被编辑,也可能发生这种情况。

可以选择在编辑器的概览标尺中显示断点,通过启用设置debug.showBreakpointsInOverviewRuler

breakpoints in overview ruler

要更精细地控制断点,请使用运行和调试视图的断点部分。此部分列出代码中的所有断点,并提供额外的操作来管理它们。

Breakpoints

断点类型

条件断点

VS Code 强大的调试功能之一是能够根据表达式、命中次数或两者的组合来设置条件。

  • 表达式条件:当表达式评估为 true 时,断点被命中。
  • 命中次数:命中次数控制断点在中断执行之前需要被命中的次数。命中次数是否受支持以及表达式的确切语法可能因调试器扩展而异。
  • 等待断点:当另一个断点被命中时,该断点被激活(触发的断点)。

要添加条件断点

  1. 创建条件断点

    • 右键单击编辑器边距并选择添加条件断点
    • 使用命令面板中的添加条件断点命令(⇧⌘P (Windows, Linux Ctrl+Shift+P))。
  2. 选择您要设置的条件类型(表达式、命中次数或等待断点)。

    HitCount

为现有断点添加条件

  1. 编辑现有断点

    • 右键单击编辑器边距中的断点并选择编辑断点
    • 运行和调试视图的断点部分中,选择现有断点旁边的铅笔图标。
  2. 编辑条件(表达式、命中次数或等待断点)。

如果调试器不支持条件断点,则添加条件断点编辑条件操作将不可用。

触发断点

触发断点是一种条件断点,它在另一个断点被命中后才被启用。当诊断仅在特定前置条件后发生的代码故障时,它们非常有用。

可以通过右键单击字形边距,选择 添加触发断点,然后选择哪个其他断点启用此断点来设置触发断点。

行内断点

行内断点仅当执行到达与行内断点关联的列时才被命中。这在调试包含多条语句的压缩代码时非常有用。

行内断点可以通过⇧F9 (Windows, Linux Shift+F9)或在调试会话期间通过上下文菜单设置。行内断点在编辑器中显示为行内。

行内断点也可以有条件。通过编辑器左侧边距中的上下文菜单可以编辑一行上的多个断点。

函数断点

除了直接在源代码中放置断点外,调试器还可以通过指定函数名来支持创建断点。这在源不可用但函数名已知的情况下非常有用。

要创建函数断点,请在断点部分标题中选择+按钮并输入函数名。函数断点在断点部分中显示为红色三角形。

数据断点

如果调试器支持数据断点,可以从变量视图的上下文菜单中设置它们。值更改时中断/读取时中断/访问时中断命令会添加一个数据断点,当基础变量的值更改/被读取/被访问时,该断点会被命中。数据断点在断点部分中显示为红色六边形。

日志点

日志点是断点的一种变体,它不会中断调试器,而是向调试控制台记录消息。日志点可以帮助您节省时间,因为您无需在代码中添加或删除日志语句。

日志点由菱形图标表示。日志消息是纯文本,但也可以包含在花括号 ('{}') 中进行求值的表达式。

要添加日志点,请右键单击编辑器左侧边距并选择添加日志点,或使用命令面板中的调试:添加日志点...命令(⇧⌘P (Windows, Linux Ctrl+Shift+P))。您还可以配置设置debug.gutterMiddleClickAction,以便在编辑器边槽中按下鼠标中键时切换日志点。

Logpoints

与常规断点一样,日志点可以启用或禁用,也可以由条件和/或命中次数控制。

注意

调试器扩展可以选择是否实现日志点。

数据检查

运行和调试视图

在调试会话期间,您可以在运行和调试视图的变量部分中检查变量和表达式,或者通过将鼠标悬停在编辑器中的源代码上来检查。变量值和表达式求值与调用堆栈部分中选定的堆栈帧相关。

Screenshot of the Variables section in the Run and Debug view.

要在调试会话期间更改变量的值,请在变量部分中右键单击变量并选择设置值Enter (Windows, Linux F2))。

此外,您可以使用复制值操作复制变量的值,或使用复制为表达式操作复制访问变量的表达式。然后,您可以在监视部分中使用此表达式。

变量和表达式也可以在运行和调试视图的监视部分中进行求值和监视。

Screenshot of the Watch section in the Run and Debug view.

要按名称或值筛选变量,请在焦点位于变量部分时使用键盘快捷键⌥⌘F (Windows, Linux Ctrl+Alt+F),然后键入搜索词。

Screenshot of the filter control in the Variables section.

调试控制台 REPL

表达式可以通过调试控制台 REPL (读取-求值-打印循环) 功能进行求值。要打开调试控制台,请使用调试窗格顶部的调试控制台操作,或使用视图:调试控制台命令(⇧⌘Y (Windows, Linux Ctrl+Shift+Y))。

在您按下Enter后会评估表达式,调试控制台 REPL 会在您键入时显示建议。如果您需要输入多行,请在行之间使用Shift+Enter,然后按Enter发送所有行进行求值。

调试控制台输入使用活动编辑器的模式,这意味着调试控制台输入支持语法着色、缩进、引号自动关闭以及其他语言功能。

Screenshot of the Debug Console.

注意

您必须处于活动的调试会话中才能使用调试控制台 REPL。

多目标调试

对于涉及多个进程(例如,客户端和服务器)的复杂场景,VS Code 支持多目标调试。启动第一个调试会话后,您可以启动另一个调试会话。一旦第二个会话启动并运行,VS Code 用户界面将切换到多目标模式

  • 现在,各个会话在调用堆栈视图中显示为顶级元素。

    Callstack View

  • 调试工具栏显示当前活动会话(所有其他会话都可在下拉菜单中获取)。

    Debug Actions Widget

  • 调试操作(例如,调试工具栏中的所有操作)都在活动会话上执行。活动会话可以通过使用调试工具栏中的下拉菜单或在调用堆栈视图中选择不同的元素来更改。

远程调试

VS Code 不支持所有语言的内置远程调试。远程调试是您正在使用的调试扩展的一个功能,您应该查阅Marketplace中该扩展的页面以获取支持和详细信息。

但是,有一个例外:VS Code 中包含的 Node.js 调试器支持远程调试。有关更多信息,请参阅Node.js 调试

调试器扩展

VS Code 内置了对 Node.js 运行时的调试支持,并且可以调试 JavaScript、TypeScript 或任何其他转换为 JavaScript 的语言。

对于调试其他语言和运行时(包括 PHPRubyGoC#PythonC++PowerShell许多其他),请在 Visual Studio Marketplace 中查找 Debuggers 扩展,或在顶层“运行”菜单中选择安装其他调试器

以下是几个包含调试支持的流行扩展

后续步骤

要了解 VS Code 的 Node.js 调试支持,请查看

  • Node.js - 描述了 VS Code 中包含的 Node.js 调试器。
  • TypeScript - Node.js 调试器也支持 TypeScript 调试。

要查看调试基础知识的教程,请观看此视频

要了解有关 Copilot 和 VS Code 中 AI 辅助调试的更多信息

要了解通过 VS Code 扩展对其他编程语言的调试支持

要了解 VS Code 的任务运行支持,请访问

  • 任务 - 描述了如何使用 Gulp、Grunt 和 Jake 运行任务以及如何显示错误和警告。

要编写您自己的调试器扩展,请访问

  • 调试器扩展 - 使用模拟示例说明创建 VS Code 调试扩展所需的步骤。

常见问题

支持哪些调试场景?

VS Code 开箱即用地支持在 Linux、macOS 和 Windows 上调试基于 Node.js 的应用程序。Marketplace 中提供的VS Code 扩展支持许多其他场景。