调试
你可以在Visual Studio Code中使用Microsoft C#扩展来调试C#应用程序。
运行和调试
该C#扩展以及C# Dev Kit提供了多种运行和调试C#应用程序的方法。
若要在没有 C# Dev Kit 的情况下运行和调试,请参阅 Microsoft C# 扩展的 GitHub 页面 以获取文档。
使用 F5 调试
安装了 C# Dev Kit 扩展,并且在“调试”视图中没有可用的调试配置可供选择,您可以开始调试您的项目,通过拥有一个.cs 文件打开后按 F5。调试器将自动找到你的项目并开始调试。如果你有多个项目,它将提示你选择要开始调试的项目。
你也可以从 VS Code 的侧边栏中的 运行和调试 视图开始一个调试会话。查看更多信息请参见 VS Code 调试。

使用解决方案资源管理器调试
安装了 C# Dev Kit 扩展后,在解决方案资源管理器中右键单击项目时,会有调试上下文菜单。
有三个选项:
- 启动新实例 - 这将启动你的项目并附加调试器。
- 开始不调试 - 这将运行您的项目,而不会附加调试器。
- 进入新实例 - 这将启动你的项目并附加调试器,但在你的代码入口点处停止。

使用命令面板进行调试
安装了 C# Dev Kit 扩展后,您还可以从命令面板开始调试⇧⌘P(Windows, LinuxCtrl+Shift+P),使用调试:选择并开始调试命令。
注意:这会在你的调试下拉列表中添加一个启动配置条目。

使用动态(内存中)启动配置进行调试
安装了 C# Dev Kit 扩展后,您可以创建动态启动配置。创建它们的方式取决于您的项目是否有现有的launch.json文件。
现有的 launch.json
如果您已经有launch.json,您可以进入调试视图,选择下拉菜单,并选择C# 选项。这将为您提供一组启动目标,您可以将其添加到下拉列表中。选择后,您可以按 F5 或 开始调试 ,使用新生成的配置。

没有 launch.json
如果您没有一个launch.json在你的项目中,你可以在调试视图的“显示所有自动调试配置”中添加和访问这些动态配置。

移除动态(内存中)的启动配置
你可以通过命令面板移除生成的配置⇧⌘P(Windows, Linux Ctrl+Shift+P)并使用命令调试:选择并开始调试。
在下拉菜单中,列出所有现有的调试配置。如果将鼠标悬停在动态配置上,右侧会出现一个可点击的垃圾桶图标。您可以选择该图标以删除动态配置。

使用编辑器的调试/运行按钮进行调试
当一个.cs文件正在编辑器中打开,运行和调试选项可以通过编辑器Windows右上角的按钮访问。这些操作将使用当前文件查询项目系统,并确定要启动的相关项目。
两个选项是:
-
运行与该文件相关的项目这将启动你的程序noDebug: 真与调试适配器一起。 -
调试与本文件相关的项目这将启动你的程序在调试器下。

使用 launch.json 调试
如果您正在使用 C# Dev Kit,我们建议不要使用此选项。然而,如果您有直接修改调试配置的需求,请参阅为 C# 调试配置 launch.json。
附加到一个进程
你可以使用命令面板通过⇧⌘P(Windows, Linux Ctrl+Shift+P)并运行调试:附加到 .NET 5+ 或 .NET Core 进程命令。

配置选项
有许多选项和设置可以配置调试器。您可以使用launchSettings.json, VS Code 用户设置 以修改你的调试选项,或者直接修改你的 launch.json输入:.
launchSettings.json
如果你有launchSettings.json 从Visual Studio,你应该看到你的配置文件使用 从F5运行 或 从命令面板运行。

参考 配置 C# 调试 了解更多信息。
用户设置
如果您在使用 C# 调试器时希望更改设置,可以在 文件 > 首选项 > 设置 (⌘, (Windows, Linux Ctrl+,)) 中找到这些选项,并搜索这些选项。
csharp.debug.stopAtEntry- 如果为真,调试器应该在目标的入口点处停止。此选项默认为假的输入:.csharp.调试.控制台- 在启动控制台项目时,指示目标程序应启动到哪个控制台。注意: 此选项仅用于 'dotnet' 调试配置类型。内部控制台[默认] - VS Code 的调试控制台。此模式允许您在一个地方看到调试器和目标程序的消息。请参阅完整文档了解更多信息。集成终端- VS Code 的集成终端。外部终端- 可通过用户设置进行配置的外部终端。
csharp.debug.sourceFileMap- 地图将构建时路径映射到本地源位置。所有构建时路径的实例将被替换为本地源路径。
例如:
{"csharp调试只显示我的代码- 当启用时(默认),调试器仅显示并逐步执行用户代码("My Code"),忽略系统代码和其他经过优化或没有调试符号的代码。更多信息.csharp.debug.requireExactSource- Flag to require current source code to match the pdb. This option defaults to真输入:.csharp.debug.enableStepFiltering- 选项用于启用跳过属性和操作符。此选项默认为真输入:.csharp.调试.日志记录.异常- 标志,用于确定是否将异常消息记录到输出Windows。此选项默认为真输入:.csharp.调试.日志.模块加载- 标志,用于确定是否将模块加载事件记录到输出Windows。此选项默认为真输入:.csharp.调试.日志.程序输出- 标志,用于确定在不使用外部控制台时,程序输出是否应记录到输出Windows。此选项默认为真输入:.csharp.调试.日志记录.诊断日志- 用于诊断调试器问题的各种设置。csharp.debug.logging.browserStdOut- 标志,用于确定是否将启动网页浏览器时的 stdout 文本记录到输出Windows。此选项默认为真输入:.csharp.调试.日志.耗时- 如果是真的,引擎日志包括适配器耗时和引擎运行时间属性用于指示请求所花费的时间(以微秒为单位)。此选项默认为假的输入:.csharp.调试.日志.线程退出- 控制当目标进程中的线程退出时是否记录消息。此选项默认为假的输入:.csharp.调试.日志.进程退出- 控制当目标进程退出或调试停止时是否记录消息。此选项默认为真输入:.csharp.debug.suppressJITOptimizations- 如果为真,当优化模块(.dll在Release配置下编译)在目标进程中加载时,调试器会要求即时编译器生成未禁用优化的代码。更多信息csharp.debug.symbolOptions.searchPaths- 符号服务器URL数组(示例:http://MyExampleSymbolServer) 或目录(示例:/build/symbols)来搜索 .pdb 文件。这些目录将在模块旁边的默认位置以及最初放置 pdb 的路径之外进行搜索。csharp.debug.symbolOptions搜索Microsoft符号服务器- 如果真微软符号服务器https://msdl.microsoft.com/download/symbols) 被添加到符号搜索路径。如果未指定,此选项默认为假的输入:.csharp.debug.symbolOptions.searchNuGetOrgSymbolServer- 如果真NuGet.org 符号服务器 (https://symbols.nuget.org/download/symbols) 被添加到符号搜索路径。如果未指定,此选项默认为假的输入:.csharp.debug.symbolOptions.cachePath- 符号从符号服务器下载后应缓存的目录。如果未指定,在Windows上调试器默认为%TEMP%\\SymbolCache, 在 Linux 和 macOS 上,调试器默认为~/.dotnet/symbolcache输入:.csharp.debug.symbolOptions.moduleFilter.mode- 控制模块过滤器在两种基本操作模式中的哪一种模式中运行。加载所有但排除的- 除非模块在以下情况,否则加载所有模块的符号排除的模块数组。仅加载包含的- 除非模块在,否则不要尝试加载任何模块的符号包含的模块数组,或者它是通过包含模块旁边的符号设置。
csharp.debug.symbolOptions.moduleFilter.excludedModules- 调试器不应加载符号的模块数组。支持通配符(例如:MyCompany.*.dll)。除非模式设置为加载所有但排除的输入:.csharp.debug.symbolOptions.moduleFilter.includedModules- 调试器应加载符号的模块数组。支持通配符(例如:MyCompany.*.dll)。除非模式设置为仅加载包含的输入:.csharp.debug.symbolOptions.moduleFilter.includeSymbolsNextToModules- 如果是真的,对于任何不在包含的模块数组,调试器仍然会在模块本身和启动可执行文件旁边进行检查,但不会检查符号搜索路径列表上的路径。此选项默认为真除非满足以下条件,否则此属性将被忽略。模式设置为仅加载包含的csharp.debug允许快速评估- 当为真(默认状态)时,调试器将通过模拟执行简单属性和方法来尝试更快地评估。csharp.experimental.debug hotReload- 如果目标应用程序支持热重载,当为真时,调试器将在调试时启用应用更改。csharp.debug hotReloadOnSave- 当为真(默认状态)时,调试器将在保存文件时自动应用代码更改。csharp.debug hotReloadVerbosity- 控制 C# Hot Reload 输出Windows的日志详细程度。可以从最小的(默认),详细或诊断如果热重载开始表现出意外行为,建议增加详细程度级别。
断点
C# 调试器支持各种断点,例如源行断点、条件断点和日志点。
断点 - 条件断点
通过表达式评估的帮助,调试器还支持条件断点。您可以设置断点,以便在表达式评估为真时中断。

断点 - 函数断点
调试器还支持功能断点。您可以通过点击来设置断点以在特定函数上中断输入:+在调试窗格的断点部分。

断点 - 日志点
Logpoints(在Visual Studio中也称为Tracepoints)允许您在不编辑代码的情况下将输出发送到调试控制台。它们与断点不同,因为它们不会停止您应用程序的执行流程。
要添加日志点,请在代码行左侧的最左边缘右键单击。选择添加日志点,然后输入您要记录的消息。任何位于花括号('{'和'}')之间的表达式将在日志点被击中时进行评估。
以下日志消息中也支持这些标记:
| 代币 | 描述 | 示例输出 |
|---|---|---|
| $FILEPOS | 当前源文件位置 | C:\sources\repos\Project\Program.cs:4 |
| $功能 | 当前函数名称 | 程序.<主程序> |
| $地址 | 当前指令 | 0x00007FFF83A54001 |
| $TID | 线程 ID | 20668 |
| $进程标识符 | 进程ID | 10028 |
| $TNAME | 线程名称 | <无线程名> |
| $PNAME | 进程名称 | C:\sources\repos\Project\bin\Debug\net7.0\console.exe |
| $调用者 | 调用函数名称 | 空 void console.dll!Program.Foo() |
| $调用堆栈 | 调用堆栈 | void console.dll!Program.Bar() void console.dll!Program.Foo() void console.dll!Program.<Main>$(string[] args) [外部代码] |
| $股票代码 | 计数器计数(来自Windows GetTickCount) | 28194046 |
| $点击次数 | 这个断点被击中的次数 | 5 |

断点 - 触发断点
触发断点是在另一个断点被触发后自动启用的断点。当诊断仅在满足特定前提条件后才会发生的代码中的故障情况时,它们非常有用。
通过右键单击字形边缘,选择添加触发断点,然后选择哪个其他断点启用该断点。
在异常时停止
C# 调试器支持在抛出或捕获异常时调试器停止的配置选项。这通过 BREAKPOINTS 部分的 Run 视图中的两个不同条目来实现:

请注意,BREAKPOINTS部分在第一次使用C#调试器调试该文件夹之前将缺少这些条目。
检查所有异常将配置调试器在抛出异常时停止。如果仅我的代码启用(默认是启用的),调试器将在库代码内部抛出并捕获异常时不会中断。然而,如果异常在库代码中抛出并传递到用户代码,调试器将中断。
检查用户未处理的异常将配置调试器在捕获异常时停止,该异常是在用户代码中抛出或经过用户代码后抛出的非用户代码。成为用户未处理的异常并不总是调试过程中出现的错误——可能是用户代码正在实现一个API并预期会抛出异常。在许多情况下确实存在实际问题,因此,调试器默认会在异常成为用户未处理时停止。
异常情况
两个复选框都支持条件,以便仅在选定的异常类型上中断。要编辑条件,请选择铅笔图标(见上图)或右键单击条目并调用编辑条件。条件是用逗号分隔的异常类型列表,或者如果列表以'!'开头,则是忽略的异常类型列表。
示例条件:
| 示例条件值 | 结果 |
|---|---|
| 系统空引用异常 | 这只会在空引用异常时中断。 |
| 系统空引用异常,系统无效操作异常 | 这将同时处理空引用异常和无效操作异常。 |
| !系统.线程.任务已取消异常 | 这将捕获所有异常,除了任务取消。 |
| !系统.并行任务.任务取消异常, 系统.未实现异常 | 这将捕获所有异常,除了任务取消和未实现的异常。 |
表达式评估
调试器还允许您在观察Windows以及调试控制台中评估表达式。
热更新
安装了 C# Dev Kit 扩展后,调试器允许您在调试时应用 C# 代码更改。

为了启用热重载,csharp.experimental.debug hotReload 必须设置为 true,见 用户设置 了解更多信息。只有在目标调试器引擎支持应用代码更改时,热重载会话才会启动。
支持的项目和场景
C# Dev Kit 支持“经典”热重载体验,也称为编辑和继续。无论您是停在断点上还是程序正在运行,您都可以在调试时应用代码更改。
截至2023年11月,一些功能如元数据更新处理程序,这使得 ASP.NET Core 应用程序能够在更改后自动刷新浏览器,目前尚未提供。,在不调试的情况下应用代码更改也不受支持。
.NET 8+ 的运行时增加了在 Linux/macOS 上进行调试时应用更改的支持,因此当对在这些操作系统上运行的 .NET 应用程序进行代码更改时,需要 .NET 8+ 的运行时版本。
| 申请类型 | 支持 C# Dev Kit 的热重载 | 需要 .NET 8 或更高版本 |
|---|---|---|
| 控制台 | ✅ | 仅限 Linux/macOS |
| 测试项目 | ✅ | 仅限 Linux/macOS |
| 类库项目 | ✅ | 仅限 Linux/macOS |
| ASP.NET Core | ⚠️* 目前仅支持更改.cs文件 |
仅限 Linux/macOS |
| 毛伊 | ❌* 即将推出 | 输入:-- |
| 团结 | ❌ | 输入:-- |
查看支持的项目,以获取有关当前由C# Dev Kit支持的项目的更多信息。另请参阅C# Dev Kit常见问题,以获取有关解决其他不受支持场景的更多信息。
如何应用代码更改
一旦热重载会话开始并进行新的更改,您可以使用以下任何一种操作将这些更改应用到您的应用程序:
| 行动 | 解释 |
|---|---|
| 热重载 Ctrl+Shift+Enter |
应用代码更改,可从调试工具栏获取。 |
| 保存文件 ⌘S(Windows, LinuxCtrl+S) |
开始应用代码更改如果csharp.debug hotReloadOnSave 设置为 true。请参阅 用户设置 了解更多信息。 |
| 继续 / 跳过步骤 / 进入步骤 / 跳出步骤 F5 / F10 / F11 / ⇧F11 (Windows, Linux Shift+F11) |
当在暂停状态(例如,在断点处停止)时进行更改,这些命令将自动应用更改。 |

下一步
继续阅读,了解:
- 调试 - 了解如何在 VS Code 中使用调试器来调试您的项目,适用于任何语言。