了解 Visual Studio Code 中的 .NET 调试器
在上一单元中,你了解了调试器可帮助你控制程序的执行并观察其状态。 在本部分中,你将了解如何在 Visual Studio Code 中执行这两项任务。
首先,了解如何配置 Visual Studio Code 调试器以将其用于 .NET。
配置 Visual Studio Code 用于 .NET 调试
首次在 Visual Studio Code 中打开 C# 文件时,你将收到一条提示,提示你安装推荐的 C# 扩展。
Visual Studio Code 将安装 C# 扩展,并显示添加所需的资产以生成和调试项目的其他提示。
注释
Visual Studio Code 中的 C# 语言支持是市场中的可选安装。 如果尚未打开 C# 文件时,Visual Studio Code 会自动提示你安装此扩展。 如果在 Visual Studio Code 中生成或调试 .NET 应用程序时遇到问题,则应 验证项目是否具有 C# 语言支持所需的资产。
断点
正如你在上一单元中了解到,调试器可帮助你分析和控制程序的执行。 启动 Visual Studio Code 调试器时,它会立即开始执行代码。 由于代码的执行速度非常快,因此你需要能够对任何语句暂停程序。 你将使用 断点 来实现这一点。
可以通过单击要中断的行上的行号左侧,在 Visual Studio Code 中添加断点。 启用断点后,应该会看到一个红色圆圈。 若要将其删除,再次选择该红色圆圈。
如果右键单击以添加断点,还可以选择“ 添加条件断点”。 这种特殊类型的断点允许你为中断执行输入一个条件。 仅当满足指定条件时,此断点才会处于活动状态。 还可以通过右键单击现有断点并选择 “编辑断点”来修改现有断点。
Visual Studio Code 调试器概述
设置断点并启动应用后,屏幕上会显示新的信息面板和控件。
- 调试器启动控件
- 变量状态
- 监视的变量状态
- 当前调用堆栈
- 断点
- 执行控件
- 当前执行步骤
- 调试控制台
调试器启动控件
在边栏顶部,可以找到启动控件:
- 开始调试。
- 选择活动启动配置。
- 编辑
launch.json文件。 如有需要,可创建它。 - 打开调试终端。
查看和编辑变量状态
分析程序缺陷的原因时,请观察变量状态以查找意外的更改。 可以使用 “变量 ”面板执行此作。
变量按范围划分:
- 局部变量:在当前作用域中可访问,通常是当前函数。
- 全局变量:可从程序中的任何地方访问。 JavaScript 运行时的系统对象也包括在内,因此,如果你在其中看到很多东西,请不要感到惊讶。
- 关闭变量:可从当前关闭访问(如果有)。 关闭将函数的本地范围与它所属的外部函数中的作用域组合在一起。
可以通过选择箭头展开范围和变量。 展开对象时,可以看到对象中定义的所有属性。
可通过双击变量动态地更改该变量的值。
还可以通过在编辑器窗口中将鼠标直接悬停在函数参数或变量上来查看其值。
监视变量
每次要跨时间或不同的函数跟踪变量状态时,搜索变量状态可能很繁琐。 这就是 “监视 ”面板派上用场的地方。
可以选择 Plus 按钮以输入变量名或要监视的表达式。 或者,可以在 “变量 ”面板中右键单击变量,然后选择“ 添加以监视”。
监视面板中的所有表达式都会在代码运行时自动更新。
调用堆栈
每次程序输入函数时,都会向调用堆栈中添加一个条目。 当您的应用程序变得复杂,并且函数多次在函数内部被调用时,调用堆栈代表着函数调用的轨迹。
查找异常的来源很有用。 如果程序中出现意外故障,通常会在控制台中看到类似以下示例的内容:
Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array.
at OrderProcessor.OrderQueue.ProcessNewOrders(String[] orderIds) in C:\Users\Repos\OrderProcessor\OrderQueue.cs:line 12
at OrderProcessor.Program.Main(String[] args) in C:\Users\Repos\OrderProcessor\Program.cs:line 9
错误消息下方那一组 at [...] 行称为“堆栈跟踪”。 堆栈跟踪提供了出现异常前调用的每个函数的名称和源。 解码可能有点困难,因为它还包括 .NET 运行时的内部函数。
这就是 Visual Studio Code 中 调用堆栈 面板派上用场的地方。 默认情况下,它会筛选掉不需要的信息,仅显示你自己代码中的相关函数。 然后,你可以展开此调用堆栈以找出引发异常的位置。
断点面板
在 “断点 ”面板中,可以看到并切换代码中放置的所有断点。 还可以切换在捕获或未捕获异常时中断的选项。 可以使用“断点”面板检查程序状态,并在发生异常时使用“调用堆栈”追溯异常的来源。
控件执行
可以使用这些控件来控制程序的执行流。
从左到右,控件为:
- 继续或暂停执行:如果执行已暂停,它将持续到下一个断点命中。 如果程序正在运行,则按钮会切换到暂停按钮,可以使用该按钮来暂停执行。
- 单步跳过:执行当前上下文中的下一个代码语句。
- 单步进入:就像 单步越过,但如果下一个语句是函数调用,请继续到该函数体的首个代码语句(与
step命令相同)。 - 跳出:如果你在函数内部,完成该函数的剩余代码,然后跳回到初始函数调用后的语句。这与
out命令的功能相同。 - 重启:从头开始重启程序。
- 停止:结束执行并退出调试器。
使用调试控制台
可以通过选择适用于 Windows 和 Linux 的 Ctrl+Shift+Y 来显示或隐藏调试控制台。 对于 Mac,请选择“Cmd+Shift+Y”。 可以使用调试控制台可视化应用程序控制台日志。 还可以使用它来计算表达式或执行当前执行内容中的代码,例如内置 .NET 调试器中的命令或变量名称。
可以在调试控制台底部的输入字段中输入 .NET 表达式,然后选择 Enter 来计算它。 结果直接显示在控制台中。
通过使用调试控制台,可以快速检查变量值、测试具有不同值的函数或更改当前状态。
注释
虽然调试控制台对于执行和评估 .NET 代码非常有用,但在尝试执行或调试 .NET 控制台应用程序时可能会有点困惑,因为调试控制台不接受正在运行的程序的终端输入。
若要在调试时处理终端输入,可以使用集成终端(Visual Studio Code 窗口之一)或外部终端。 在本教程中,将使用集成终端。
打开 .vscode/launch.json。
将
console设置从以下项更改为integratedTerminal:"console": "internalConsole",收件人:
"console": "integratedTerminal",保存更改。
在下一单元中,你将了解如何使用调试器修复我们之前看到的 Fibonacci 代码中的 bug。