教程:使用 Visual Studio Code 调试 .NET 控制台应用程序

本教程介绍了 Visual Studio Code 中可用于处理 .NET 应用的调试工具。

先决条件

使用“调试”生成配置

“调试”和“发布”是 .NET 的内置生成配置 。 可使用“调试”生成配置进行调试,使用“发布”配置进行最终版本分发。

在“调试”配置中,程序使用完整符号调试信息编译,且不进行优化。 优化会使调试复杂化,因为源代码和生成的指令之间的关系更加复杂。 程序的发布配置进行了完全优化,且不包含任何符号调试信息。

默认情况下,Visual Studio Code 启动设置使用“调试”生成配置,因此不需要在调试之前对其进行更改。

  1. 启动 Visual Studio Code。

  2. 打开在使用 Visual Studio Code 中创建 .NET 控制台应用程序中创建的项目的文件夹。

设置断点

断点会在运行包含断点的代码行之前暂时中断执行应用程序。

  1. 打开 Program.cs 文件。

  2. 单击代码窗口的左边缘,在显示名称、日期和时间的行上设置断点。 左边缘在行号的左侧。 设置断点的其他方法是在选中代码行时按 F9 或从菜单中选择“运行”>“切换断点” 。

    Visual Studio Code 通过在左边缘显示红点来指示设置了断点的行。

    Breakpoint set

设置终端输入

断点位于 Console.ReadLine 方法调用之后。 调试控制台不接受正在运行的程序的终端输入。 若要在调试时处理终端输入,可以使用集成终端(Visual Studio Code 窗口之一)或外部终端。 本教程中使用集成终端。

  1. 项目文件夹包含 .vscode 文件夹。 打开 .vscode 文件中的 launch.json 文件。

  2. launch.json 中,将 console 设置从 internalConsole 更改为 integratedTerminal

    "console": "integratedTerminal",
    
  3. 保存更改。

“启动调试”

  1. 选择左侧菜单上的“调试”图标,打开“调试”视图。

    Open the Debug tab in Visual Studio Code

  2. 选择窗格顶部 .NET Core Launch(控制台)旁边的绿色箭头。 在调试模式下启动程序的其他方法是,按 F5 或从菜单中选择“运行”>“启动调试”

    Start debugging

  3. 选择“终端”选项卡,来查看程序在等待响应之前显示的“你叫什么名字?”提示。

    Select the Terminal tab

  4. 在“终端”窗口中输入字符串以响应输入姓名提示,然后按 Enter

    到达断点时,程序停止执行,然后运行 Console.WriteLine 方法。 “变量”窗口的“局部变量”部分显示当前正在运行的方法中定义的变量值

    Breakpoint hit, showing Locals

使用“调试控制台”

在“调试控制台”窗口中,可以与正在调试的应用程序进行交互。 可更改变量值,看看这样会对程序产生哪些影响。

  1. 选择“调试控制台”选项卡。

  2. 在“调试控制台”窗口底部的提示符处输入 name = "Gracie",然后按 Enter

    Change variable values

  3. 在“调试控制台”窗口底部输入 currentDate = DateTime.Parse("2019-11-16T17:25:00Z").ToUniversalTime(),然后按 Enter

    “变量”窗口显示 namecurrentDate 变量的新值。

  4. 选择工具栏中的“继续”按钮继续执行程序。 继续操作的另一种方法是按 F5

    Continue debugging

  5. 再次选择“终端”选项卡

    控制台窗口中显示的值对应于在“调试控制台”窗口中所做的更改

    Terminal showing the entered values

  6. 按任意键,退出应用程序并停止调试。

设置条件断点

程序显示用户输入的字符串。 如果用户没有输入任何内容,情况又如何呢? 可以使用名为“条件断点”的有用调试功能对此进行测试。

  1. 右键单击(在 macOS 上按住 Ctrl 并单击)表示断点的红点。 在上下文菜单中,选择“编辑断点”,打开可输入条件表达式的对话框

    Breakpoint context menu

  2. 在下拉菜单中选择 Expression,输入以下条件表达式,并按 Enter

    String.IsNullOrEmpty(name)
    

    Enter a conditional expression

    每次命中断点时,调试器都会调用 String.IsNullOrEmpty(name) 方法,仅当该方法调用返回 true 时,它才会在此行上中断。

    可以指定“命中次数”(而不是条件表达式),这样程序就会在语句的运行次数达到指定值时中断执行。 另一种方法是指定筛选条件,这样就可以根据诸如线程标识符、进程名称或线程名称之类的特性来中断程序执行。

  3. 通过按 F5 调试来启动程序。

  4. 在“终端”选项卡中,在系统提示输入姓名时按 Enter

    由于符合指定的条件(namenullString.Empty),因此程序会在到达断点时以及在 Console.WriteLine 方法运行之前停止执行。

    “变量”窗口显示 name 变量的值为 ""String.Empty

  5. 在“调试控制台”提示符中输入下面的语句并按 Enter,确认值为空字符串。 结果为 true

    name == String.Empty
    
  6. 选择工具栏上的“继续”按钮,继续执行程序。

  7. 选择“终端”选项卡,然后按任意键退出程序,停止调试。

  8. 单击代码窗口左边缘上的点,清除断点。 清除断点的其他方法是在选中代码行时按 F9,或者从菜单中选择“运行”>“切换断点”。

  9. 如果收到断点条件将丢失的警告,请选择“删除断点”。

单步执行程序

使用 Visual Studio Code,还可以单步执行程序,并监视其执行情况。 通常可以设置断点,并通过程序代码的一小部分执行程序流。 由于此程序很小,因此可以单步执行整个程序。

  1. Main 方法的左大括号处设置一个断点。

  2. F5 启动调试。

    Visual Studio Code 突出显示断点行。

    此时,“变量”窗口显示 args 数组为空,namecurrentDate 具有默认值。

  3. 选择“运行”>“单步执行”或按 F11

    Step-Into button

    Visual Studio Code 突出显示下一行。

  4. 选择“运行”>“单步执行”或按 F11

    Visual Studio Code 运行名称提示的 Console.WriteLine 并突出显示下一执行行。 下一行是 nameConsole.ReadLine。 “变量”窗口保持不变,“终端”选项卡显示“你叫什么名字?”提示。

  5. 选择“运行”>“单步执行”或按 F11

    Visual Studio 突出显示 name 变量赋值。 “变量”窗口显示 name 仍为 null

  6. 在“终端”选项卡中输入字符串,然后按 Enter,响应提示。

    输入字符串时,“终端”选项卡可能无法显示输入的字符串,但 Console.ReadLine 方法将捕获你的输入。

  7. 选择“运行”>“单步执行”或按 F11

    Visual Studio Code 突出显示 currentDate 变量赋值。 “变量”窗口显示 Console.ReadLine 方法调用返回的值。 “终端”选项卡显示在提示符处输入的字符串。

  8. 选择“运行”>“单步执行”或按 F11

    “变量”窗口显示通过 DateTime.Now 属性赋值后的 currentDate 变量值。

  9. 选择“运行”>“单步执行”或按 F11

    Visual Studio Code 调用 Console.WriteLine(String, Object, Object) 方法。 控制台窗口会显示格式化的字符串。

  10. 选择“运行”>“跳出”或按 Shift+F11

    Step-Out button

  11. 选择“终端”选项卡

    终端显示“按任意键退出…”

  12. 按任意键退出程序。

使用“发布”生成配置

测试应用程序的“调试”版本后,还应该编译并测试“发布”版本。 发布版本包含编译器优化,这些优化可能会影响应用程序的行为。 例如,旨在提升性能的编译器优化可能会在多线程应用程序中创建争用条件。

若要构建和测试控制台应用程序的发布版本,请打开终端,并运行以下命令:

dotnet run --configuration Release

其他资源

后续步骤

在本教程中,使用了 Visual Studio Code 调试工具。 在下一教程中,你将发布应用的可部署版本。

本教程介绍了 Visual Studio Code 中可用于处理 .NET 应用的调试工具。

先决条件

使用“调试”生成配置

“调试”和“发布”是 .NET 的内置生成配置 。 可使用“调试”生成配置进行调试,使用“发布”配置进行最终版本分发。

在“调试”配置中,程序使用完整符号调试信息编译,且不进行优化。 优化会使调试复杂化,因为源代码和生成的指令之间的关系更加复杂。 程序的发布配置进行了完全优化,且不包含任何符号调试信息。

默认情况下,Visual Studio Code 启动设置使用“调试”生成配置,因此不需要在调试之前对其进行更改。

  1. 启动 Visual Studio Code。

  2. 打开在使用 Visual Studio Code 中创建 .NET 控制台应用程序中创建的项目的文件夹。

设置断点

断点会在运行包含断点的代码行之前暂时中断执行应用程序。

  1. 打开 Program.cs 文件。

  2. 单击代码窗口的左边缘,在显示名称、日期和时间的行上设置断点。 左边缘在行号的左侧。 设置断点的其他方法是在选中代码行时按 F9 或从菜单中选择“运行”>“切换断点” 。

    Visual Studio Code 通过在左边缘显示红点来指示设置了断点的行。

    Breakpoint set

设置终端输入

断点位于 Console.ReadLine 方法调用之后。 调试控制台不接受正在运行的程序的终端输入。 若要在调试时处理终端输入,可以使用集成终端(Visual Studio Code 窗口之一)或外部终端。 本教程中使用集成终端。

  1. 项目文件夹包含 .vscode 文件夹。 打开 .vscode 文件中的 launch.json 文件。

  2. launch.json 中,将 console 设置从 internalConsole 更改为 integratedTerminal

    "console": "integratedTerminal",
    
  3. 保存更改。

“启动调试”

  1. 选择左侧菜单上的“调试”图标,打开“调试”视图。

    Open the Debug tab in Visual Studio Code

  2. 选择窗格顶部 .NET Core Launch(控制台)旁边的绿色箭头。 在调试模式下启动程序的其他方法是,按 F5 或从菜单中选择“运行”>“启动调试”

    Start debugging

  3. 选择“终端”选项卡,来查看程序在等待响应之前显示的“你叫什么名字?”提示。

    Select the Terminal tab

  4. 在“终端”窗口中输入字符串以响应输入姓名提示,然后按 Enter

    到达断点时,程序停止执行,然后运行 Console.WriteLine 方法。 “变量”窗口的“局部变量”部分显示当前正在运行的方法中定义的变量值

    Breakpoint hit, showing Locals

使用“调试控制台”

在“调试控制台”窗口中,可以与正在调试的应用程序进行交互。 可更改变量值,看看这样会对程序产生哪些影响。

  1. 选择“调试控制台”选项卡。

  2. 在“调试控制台”窗口底部的提示符处输入 name = "Gracie",然后按 Enter

    Change variable values

  3. 在“调试控制台”窗口底部输入 currentDate = DateTime.Parse("2019-11-16T17:25:00Z").ToUniversalTime(),然后按 Enter

    “变量”窗口显示 namecurrentDate 变量的新值。

  4. 选择工具栏中的“继续”按钮继续执行程序。 继续操作的另一种方法是按 F5

    Continue debugging

  5. 再次选择“终端”选项卡

    控制台窗口中显示的值对应于在“调试控制台”窗口中所做的更改

    Terminal showing the entered values

  6. 按任意键,退出应用程序并停止调试。

设置条件断点

程序显示用户输入的字符串。 如果用户没有输入任何内容,情况又如何呢? 可以使用名为“条件断点”的有用调试功能对此进行测试。

  1. 右键单击(在 macOS 上按住 Ctrl 并单击)表示断点的红点。 在上下文菜单中,选择“编辑断点”,打开可输入条件表达式的对话框

    Breakpoint context menu

  2. 在下拉菜单中选择 Expression,输入以下条件表达式,并按 Enter

    String.IsNullOrEmpty(name)
    

    Enter a conditional expression

    每次命中断点时,调试器都会调用 String.IsNullOrEmpty(name) 方法,仅当该方法调用返回 true 时,它才会在此行上中断。

    可以指定“命中次数”(而不是条件表达式),这样程序就会在语句的运行次数达到指定值时中断执行。 另一种方法是指定筛选条件,这样就可以根据诸如线程标识符、进程名称或线程名称之类的特性来中断程序执行。

  3. 通过按 F5 调试来启动程序。

  4. 在“终端”选项卡中,在系统提示输入姓名时按 Enter

    由于符合指定的条件(namenullString.Empty),因此程序会在到达断点时以及在 Console.WriteLine 方法运行之前停止执行。

    “变量”窗口显示 name 变量的值为 ""String.Empty

  5. 在“调试控制台”提示符中输入下面的语句并按 Enter,确认值为空字符串。 结果为 true

    name == String.Empty
    
  6. 选择工具栏上的“继续”按钮,继续执行程序。

  7. 选择“终端”选项卡,然后按任意键退出程序,停止调试。

  8. 单击代码窗口左边缘上的点,清除断点。 清除断点的其他方法是在选中代码行时按 F9,或者从菜单中选择“运行”>“切换断点”。

  9. 如果收到断点条件将丢失的警告,请选择“删除断点”。

单步执行程序

使用 Visual Studio Code,还可以单步执行程序,并监视其执行情况。 通常可以设置断点,并通过程序代码的一小部分执行程序流。 由于此程序很小,因此可以单步执行整个程序。

  1. Main 方法的左大括号处设置一个断点。

  2. F5 启动调试。

    Visual Studio Code 突出显示断点行。

    此时,“变量”窗口显示 args 数组为空,namecurrentDate 具有默认值。

  3. 选择“运行”>“单步执行”或按 F11

    Step-Into button

    Visual Studio Code 突出显示下一行。

  4. 选择“运行”>“单步执行”或按 F11

    Visual Studio Code 运行名称提示的 Console.WriteLine 并突出显示下一执行行。 下一行是 nameConsole.ReadLine。 “变量”窗口保持不变,“终端”选项卡显示“你叫什么名字?”提示。

  5. 选择“运行”>“单步执行”或按 F11

    Visual Studio 突出显示 name 变量赋值。 “变量”窗口显示 name 仍为 null

  6. 在“终端”选项卡中输入字符串,然后按 Enter,响应提示。

    输入字符串时,“终端”选项卡可能无法显示输入的字符串,但 Console.ReadLine 方法将捕获你的输入。

  7. 选择“运行”>“单步执行”或按 F11

    Visual Studio Code 突出显示 currentDate 变量赋值。 “变量”窗口显示 Console.ReadLine 方法调用返回的值。 “终端”选项卡显示在提示符处输入的字符串。

  8. 选择“运行”>“单步执行”或按 F11

    “变量”窗口显示通过 DateTime.Now 属性赋值后的 currentDate 变量值。

  9. 选择“运行”>“单步执行”或按 F11

    Visual Studio Code 调用 Console.WriteLine(String, Object, Object) 方法。 控制台窗口会显示格式化的字符串。

  10. 选择“运行”>“跳出”或按 Shift+F11

    Step-Out button

  11. 选择“终端”选项卡

    终端显示“按任意键退出…”

  12. 按任意键退出程序。

使用“发布”生成配置

测试应用程序的“调试”版本后,还应该编译并测试“发布”版本。 发布版本包含编译器优化,这些优化可能会影响应用程序的行为。 例如,旨在提升性能的编译器优化可能会在多线程应用程序中创建争用条件。

若要构建和测试控制台应用程序的发布版本,请打开终端,并运行以下命令:

dotnet run --configuration Release

其他资源

后续步骤

在本教程中,使用了 Visual Studio Code 调试工具。 在下一教程中,你将发布应用的可部署版本。

本教程介绍了 Visual Studio Code 中可用于处理 .NET 应用的调试工具。

先决条件

使用“调试”生成配置

“调试”和“发布”是 .NET 的内置生成配置 。 可使用“调试”生成配置进行调试,使用“发布”配置进行最终版本分发。

在“调试”配置中,程序使用完整符号调试信息编译,且不进行优化。 优化会使调试复杂化,因为源代码和生成的指令之间的关系更加复杂。 程序的发布配置进行了完全优化,且不包含任何符号调试信息。

默认情况下,Visual Studio Code 启动设置使用“调试”生成配置,因此不需要在调试之前对其进行更改。

  1. 启动 Visual Studio Code。

  2. 打开在使用 Visual Studio Code 中创建 .NET 控制台应用程序中创建的项目的文件夹。

设置断点

断点会在运行包含断点的代码行之前暂时中断执行应用程序。

  1. 打开 Program.cs 文件。

  2. 单击代码窗口的左边缘,在显示名称、日期和时间的行上设置断点。 左边缘在行号的左侧。 设置断点的其他方法是在选中代码行时按 F9 或从菜单中选择“运行”>“切换断点” 。

    Visual Studio Code 通过在左边缘显示红点来指示设置了断点的行。

    Breakpoint set

设置终端输入

断点位于 Console.ReadLine 方法调用之后。 调试控制台不接受正在运行的程序的终端输入。 若要在调试时处理终端输入,可以使用集成终端(Visual Studio Code 窗口之一)或外部终端。 本教程中使用集成终端。

  1. 打开 .vscode/launch.json。

  2. console 设置从 internalConsole 更改为 integratedTerminal

    "console": "integratedTerminal",
    
  3. 保存更改。

“启动调试”

  1. 选择左侧菜单上的“调试”图标,打开“调试”视图。

    Open the Debug tab in Visual Studio Code

  2. 选择窗格顶部 .NET Core Launch(控制台)旁边的绿色箭头。 在调试模式下启动程序的其他方法是,按 F5 或从菜单中选择“运行”>“启动调试”

    Start debugging

  3. 选择“终端”选项卡,来查看程序在等待响应之前显示的“你叫什么名字?”提示。

    Select the Terminal tab

  4. 在“终端”窗口中输入字符串以响应输入姓名提示,然后按 Enter

    到达断点时,程序停止执行,然后运行 Console.WriteLine 方法。 “变量”窗口的“局部变量”部分显示当前正在运行的方法中定义的变量值

    Breakpoint hit, showing Locals

使用“调试控制台”

在“调试控制台”窗口中,可以与正在调试的应用程序进行交互。 可更改变量值,看看这样会对程序产生哪些影响。

  1. 选择“调试控制台”选项卡。

  2. 在“调试控制台”窗口底部的提示符处输入 name = "Gracie",然后按 Enter

    Change variable values

  3. 在“调试控制台”窗口底部输入 currentDate = DateTime.Parse("2019-11-16T17:25:00Z").ToUniversalTime(),然后按 Enter

    “变量”窗口显示 namecurrentDate 变量的新值。

  4. 选择工具栏中的“继续”按钮继续执行程序。 继续操作的另一种方法是按 F5

    Continue debugging

  5. 再次选择“终端”选项卡

    控制台窗口中显示的值对应于在“调试控制台”窗口中所做的更改

    Terminal showing the entered values

  6. 按任意键,退出应用程序并停止调试。

设置条件断点

程序显示用户输入的字符串。 如果用户没有输入任何内容,情况又如何呢? 可以使用名为“条件断点”的有用调试功能对此进行测试。

  1. 右键单击(在 macOS 上按住 Ctrl 并单击)表示断点的红点。 在上下文菜单中,选择“编辑断点”,打开可输入条件表达式的对话框

    Breakpoint context menu

  2. 在下拉菜单中选择 Expression,输入以下条件表达式,并按 Enter

    String.IsNullOrEmpty(name)
    

    Enter a conditional expression

    每次命中断点时,调试器都会调用 String.IsNullOrEmpty(name) 方法,仅当该方法调用返回 true 时,它才会在此行上中断。

    可以指定“命中次数”(而不是条件表达式),这样程序就会在语句的运行次数达到指定值时中断执行。 另一种方法是指定筛选条件,这样就可以根据诸如线程标识符、进程名称或线程名称之类的特性来中断程序执行。

  3. 通过按 F5 调试来启动程序。

  4. 在“终端”选项卡中,在系统提示输入姓名时按 Enter

    由于符合指定的条件(namenullString.Empty),因此程序会在到达断点时以及在 Console.WriteLine 方法运行之前停止执行。

    “变量”窗口显示 name 变量的值为 ""String.Empty

  5. 在“调试控制台”提示符中输入下面的语句并按 Enter,确认值为空字符串。 结果为 true

    name == String.Empty
    
  6. 选择工具栏上的“继续”按钮,继续执行程序。

  7. 选择“终端”选项卡,然后按任意键退出程序,停止调试。

  8. 单击代码窗口左边缘上的点,清除断点。 清除断点的其他方法是在选中代码行时按 F9,或者从菜单中选择“运行”>“切换断点”。

  9. 如果收到断点条件将丢失的警告,请选择“删除断点”。

单步执行程序

使用 Visual Studio Code,还可以单步执行程序,并监视其执行情况。 通常可以设置断点,并通过程序代码的一小部分执行程序流。 由于此程序很小,因此可以单步执行整个程序。

  1. Main 方法的左大括号处设置一个断点。

  2. F5 启动调试。

    Visual Studio Code 突出显示断点行。

    此时,“变量”窗口显示 args 数组为空,namecurrentDate 具有默认值。

  3. 选择“运行”>“单步执行”或按 F11

    Step-Into button

    Visual Studio Code 突出显示下一行。

  4. 选择“运行”>“单步执行”或按 F11

    Visual Studio Code 运行名称提示的 Console.WriteLine 并突出显示下一执行行。 下一行是 nameConsole.ReadLine。 “变量”窗口保持不变,“终端”选项卡显示“你叫什么名字?”提示。

  5. 选择“运行”>“单步执行”或按 F11

    Visual Studio 突出显示 name 变量赋值。 “变量”窗口已清除。

  6. 在“终端”选项卡中输入字符串,然后按 Enter,响应提示。

    输入字符串时,“终端”选项卡可能无法显示输入的字符串,但 Console.ReadLine 方法将捕获你的输入

    “变量”窗口显示 Console.ReadLine 方法调用返回的值

  7. 选择“运行”>“单步执行”或按 F11

    Visual Studio Code 突出显示 currentDate 变量赋值。 “终端”选项卡显示在提示符处输入的字符串

  8. 选择“运行”>“单步执行”或按 F11

    “变量”窗口显示通过 DateTime.Now 属性赋值后的 currentDate 变量值。

  9. 选择“运行”>“单步执行”或按 F11

    Visual Studio Code 调用 Console.WriteLine(String, Object, Object) 方法。 控制台窗口会显示格式化的字符串。

  10. 选择“运行”>“跳出”或按 Shift+F11

    Step-Out button

  11. 选择“终端”选项卡

    终端显示“按任意键退出…”

  12. 按任意键退出程序。

使用“发布”生成配置

测试应用程序的“调试”版本后,还应该编译并测试“发布”版本。 发布版本包含编译器优化,这些优化可能会影响应用程序的行为。 例如,旨在提升性能的编译器优化可能会在多线程应用程序中创建争用条件。

若要构建和测试控制台应用程序的发布版本,请打开终端,并运行以下命令:

dotnet run --configuration Release

其他资源

后续步骤

在本教程中,使用了 Visual Studio Code 调试工具。 在下一教程中,你将发布应用的可部署版本。