调试

您可以使用Microsoft C#扩展在 Visual Studio Code 中调试 C# 应用程序。

运行和调试

C #扩展和C# 开发工具包提供了多种运行和调试 C# 应用程序的方法。

要在不使用 C# 开发工具包的情况下运行和调试,请参阅Microsoft C# 扩展的 GitHub 页面以获取文档。

使用 F5 调试

安装了 C# Dev Kit 扩展并且在“调试”视图中没有可供选择的调试配置后,您可以通过打开文件.cs然后按F5来开始调试项目。调试器将自动找到您的项目并开始调试。如果您有多个项目,它会提示您要开始调试哪个项目。

您还可以从 VS Code 侧边栏的“运行和调试”视图启动调试会话。有关更多信息,请参阅在 VS Code 中进行调试

使用“运行”和“调试”进行调试

使用解决方案资源管理器进行调试

安装 C# Dev Kit 扩展后,当您在解决方案资源管理器中右键单击您的项目时,会出现一个“调试”上下文菜单。

有以下三种选择:

  • 启动新实例- 这将启动带有附加调试器的项目。
  • 启动而不调试- 这将在不附加调试器的情况下运行您的项目。
  • 进入新实例- 这会启动带有附加调试器的项目,但会在代码的入口点停止。

使用解决方案资源管理器进行调试

使用命令面板进行调试

安装 C# 开发工具包扩展后,您还可以使用“调试:选择并开始调试”命令从命令面板⇧⌘P(Windows、Linux Ctrl+Shift+P)开始调试。

注意:这会将启动配置条目添加到调试下拉列表中。

使用命令面板进行调试

使用动态(内存中)启动配置进行调试

安装 C# Dev Kit 扩展后,您可以创建动态启动配置。如何创建它们取决于您的项目是否有现有launch.json文件。

现有的launch.json

如果您有现有的launch.json,您可以转到“调试”视图,选择下拉列表,然后选择该C#选项。这将为您提供一系列启动目标,您可以将其添加到下拉列表中。选择后,您可以按F5或使用新生成的配置开始调试。

添加动态 C# 配置

没有启动.json

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

使用显示所有自动调试配置进行调试

删除动态(内存中)启动配置

您可以使用命令面板⇧⌘P(Windows、Linux Ctrl+Shift+P并使用命令Debug: Select and Start Debugging删除生成的配置。

在下拉列表中,它列出了所有现有的调试配置。如果将鼠标悬停在动态配置上,右侧会出现一个可单击的垃圾桶图标。您可以选择该图标来删除动态配置。

删除动态配置

使用 launch.json 进行调试

如果您使用的是 C# 开发工具包,我们建议不要使用此选项。但是,如果您需要直接修改调试配置,请参阅配置 launch.json 以进行 C# 调试

附加到进程

您可以使用命令面板⇧⌘P(Windows、Linux Ctrl+Shift+P附加到 C# 进程并运行“调试:附加到 .NET 5+ 或 .NET Core 进程”命令。

附加到 C# 进程

配置选项

有许多选项和设置可用于配置调试器。您可以使用launchSettings.jsonVS Code用户设置来修改您的调试选项,或直接修改您的launch.json.

启动设置.json

如果您使用launchSettings.jsonVisual Studio,您应该会看到使用从 F5 运行从命令面板运行列出的配置文件。

使用 launchSettings.json 进行调试

有关更多详细信息,请参阅配置 C# 调试。

用户设置

如果您希望在使用 C# 调试器时更改设置,可以在“文件” > “首选项”> “设置”⌘,(Windows、Linux Ctrl+,)下找到这些选项并搜索这些选项。

  • csharp.debug.stopAtEntry- 如果为 true,则调试器应停止在目标的入口点。该选项默认为false.
  • csharp.debug.console- 启动控制台项目时,指示目标程序应启动到哪个控制台。注意:此选项仅用于“dotnet”调试配置类型。
    • internalConsole[默认] - VS Code 的调试控制台。此模式允许您在一个地方查看来自调试器和目标程序的消息。有关更多详细信息,请参阅完整文档。
    • integratedTerminal- VS Code 的集成终端。
    • externalTerminal- 可以通过用户设置进行配置的外部终端。
  • csharp.debug.sourceFileMap- 将构建时路径映射到本地源位置。构建时路径的所有实例都将替换为本地源路径。
      例子:
        {\"<build-path>\":\"<local-source-path>\"}
  • csharp.debug.justMyCode- 启用后(默认),调试器仅显示并单步执行用户代码(“我的代码”),忽略系统代码和其他经过优化或没有调试符号的代码。更多信息
  • csharp.debug.requireExactSource- 标记要求当前源代码与 pdb 匹配。该选项默认为true.
  • csharp.debug.enableStepFiltering- 启用跳过属性和运算符的标志。该选项默认为true.
  • csharp.debug.logging.exceptions- 确定是否应将异常消息记录到输出窗口的标志。该选项默认为true.
  • csharp.debug.logging.moduleLoad- 确定是否应将模块加载事件记录到输出窗口的标志。该选项默认为true.
  • csharp.debug.logging.programOutput- 标记以确定在不使用外部控制台时是否应将程序输出记录到输出窗口。该选项默认为true.
  • csharp.debug.logging.diagnosticsLog- 用于诊断调试器问题的各种设置。
  • csharp.debug.logging.browserStdOut- 确定启动 Web 浏览器时的标准输出文本是否应记录到输出窗口的标志。该选项默认为true.
  • csharp.debug.logging.elapsedTiming- 如果为 true,则引擎日志记录包含adapterElapsedTime指示engineElapsedTime请求所花费的时间(以微秒为单位)的属性。该选项默认为false.
  • csharp.debug.logging.threadExit- 控制当目标进程中的线程退出时是否记录消息。该选项默认为false.
  • csharp.debug.logging.processExit- 控制当目标进程退出或调试停止时是否记录消息。该选项默认为true.
  • csharp.debug.suppressJITOptimizations- 如果为 true,则当优化模块(在发布配置中编译的 .dll)加载到目标进程中时,调试器会要求即时编译器生成禁用优化的代码。更多信息
  • csharp.debug.symbolOptions.searchPathshttp://MyExampleSymbolServer-用于搜索 .pdb 文件的符号服务器 URL 数组(例如: )或目录(例如:/build/symbols)。除了模块旁边的默认位置和 pdb 最初放置到的路径之外,还将搜索这些目录。
  • csharp.debug.symbolOptions.searchMicrosoftSymbolServer- 如果trueMicrosoft 符号服务器 ( https://msdl.microsoft.com/download/symbols) 添加到符号搜索路径。如果未指定,此选项默认为false
  • csharp.debug.symbolOptions.searchNuGetOrgSymbolServer- 如果trueNuGet.org 符号服务器 ( https://symbols.nuget.org/download/symbols) 添加到符号搜索路径。如果未指定,此选项默认为false
  • csharp.debug.symbolOptions.cachePath- 应缓存从符号服务器下载的符号的目录。如果未指定,则在 Windows 上调试器默认为%TEMP%\\SymbolCache,在 Linux 和 macOS 上调试器默认为~/.dotnet/symbolcache。*- csharp.debug.symbolOptions.moduleFilter.mode- 控制模块滤波器在两种基本操作模式中的哪一种操作。
    • loadAllButExcluded- 加载所有模块的符号,除非该模块位于excludedModules数组中。
    • loadOnlyIncluded- 不要尝试加载任何模块的符号,除非它位于数组中includedModules,或者通过设置包含在内includeSymbolsNextToModules
  • csharp.debug.symbolOptions.moduleFilter.excludedModules- 调试器不应为其加载符号的模块数组。支持通配符(例如:MyCompany.*.dll)。mode除非设置为,否则该属性将被忽略loadAllButExcluded
  • csharp.debug.symbolOptions.moduleFilter.includedModules- 调试器应为其加载符号的模块数组。支持通配符(例如:MyCompany.*.dll)。mode除非设置为,否则该属性将被忽略loadOnlyIncluded
  • csharp.debug.symbolOptions.moduleFilter.includeSymbolsNextToModules- 如果为 true,对于不在includedModules数组中的任何模块,调试器仍将检查模块本身和启动的可执行文件,但不会检查符号搜索列表上的路径。该选项默认为true. mode除非设置为,否则该属性将被忽略loadOnlyIncluded
  • csharp.debug.allowFastEvaluate- 当为 true(默认状态)时,调试器将通过模拟简单属性和方法的执行来尝试更快的评估。

断点

C# 调试器支持各种断点,例如源代码行断点、条件断点和日志点。

断点 - 条件断点

借助表达式求值,调试器还支持条件断点。您可以将断点设置为在表达式计算结果为 true 时中断。

条件断点

断点 - 日志点

日志点(在 Visual Studio 中也称为跟踪点)允许您将输出发送到调试控制台,而无需编辑代码。它们与断点不同,因为它们不会停止应用程序的执行流程。

要添加日志点,请右键单击代码行旁边的最左边距。选择添加日志点并键入您要记录的消息。当命中日志点时,将计算大括号(“{”和“}”)之间的任何表达式。

日志消息中还支持以下标记:

代币 描述 示例输出
$FILEPOS 当前源文件位置 C:\sources\repos\Project\Program.cs:4
$FUNCTION 当前函数名称 程序.<主>$
$ADDRESS 当前指令 0x00007FFF83A54001
$TID 线程ID 20668
$PID 进程号 10028
$TNAME 线程名称 <无线程名称>
$PNAME 进程名称 C:\sources\repos\Project\bin\Debug\net7.0\console.exe
$CALLER 调用函数名称 void console.dll!Program.Foo()
$CALLSTACK 调用栈 void console.dll!Program.Bar()
void console.dll!Program.Foo()
void console.dll!Program.<Main>$(string[] args)
[外部代码]
$TICK 刻度计数(来自 Windows GetTickCount) 28194046
$HITCOUNT 命中断点的次数 5

日志消息断点

出现异常时停止

C# 调试器支持在引发或捕获异常时调试器何时停止的配置选项。这是通过“运行”视图的“断点”部分中的两个不同条目来完成的:

BREAKPOINTS 运行视图中的异常设置

请注意,BREAKPOINTS部分将丢失这些条目,直到第一次使用 C# 调试器调试该文件夹。

检查所有异常会将调试器配置为在引发异常时停止。如果启用“仅我的代码”(默认情况下),则即使在内部引发异常并在库代码中捕获异常,调试器也不会中断。但是,如果异常在库代码中引发并返回到用户代码,则调试器将中断。

检查用户未处理的异常会将调试器配置为在异常在用户代码中引发或遍历用户代码后在非用户代码中捕获时停止。用户未处理的异常并不总是正在调试的进程中的错误 - 可能是用户代码正在实现 API 并且预计会引发异常。在许多情况下,存在实际问题,因此默认情况下,当异常变为用户未处理时,调试器将停止。

例外情况

两个复选框都支持仅在选定的异常类型上中断的条件。要编辑条件,请选择铅笔图标(参见上图)或右键单击条目并调用“编辑条件”。条件是要中断的异常类型的逗号分隔列表,或者如果列表以“!”开头,则为要忽略的异常类型列表。

示例条件:

条件值示例 结果
System.NullReferenceException 这只会在空引用异常时中断。
System.NullReferenceException, System.InvalidOperationException 这将在空引用异常和无效操作异常时中断。
!System.Threading.Tasks.TaskCanceledException 这将在除任务取消之外的所有异常上中断。
!System.Threading.Tasks.TaskCanceledException, System.NotImplementedException 除了任务取消和未执行之外,这将在所有异常情况下中断。

表达评估

调试器还允许您在WATCH窗口以及调试控制台中计算表达式。

下一步

继续阅读以了解:

  • 调试- 了解如何在任何语言的项目中使用 VS Code 中的调试器。