本教程介绍 Visual Studio 中提供的调试工具。
重要
所有键盘快捷方式都基于Visual Studio中的默认值。 您的键盘快捷键可能会有所不同,详细信息请参阅 Visual Studio 中的键盘快捷键。
本教程介绍Visual Studio Code中可用于处理.NET应用的调试工具。
本教程介绍 GitHub Codespaces 中可用于处理.NET应用的调试工具。
先决条件
本教程适用于您在创建.NET控制台应用程序中创建的控制台应用程序。
使用“调试”生成配置
Debug 和 Release 是Visual Studio的内置生成配置。 使用调试版本配置进行调试,并使用发布版本配置进行最终版本的发布和分发。
在调试配置中,程序使用完整的符号调试信息进行编译,且不进行优化。 优化使调试复杂化,因为源代码与生成的指令之间的关系更为复杂。 程序的发布配置没有符号调试信息,并且已完全优化。
默认情况下,Visual Studio使用调试生成配置,因此在调试之前无需更改它。
启动Visual Studio。
打开你在创建.NET控制台应用程序时创建的项目。
当前生成配置显示在工具栏上。 以下工具栏图像显示Visual Studio 已配置为编译调试版本的应用:
设置断点
断点会在运行包含断点的代码行之前暂时中断执行应用程序。
单击该行代码窗口的左边缘,在显示名称、日期和时间的行上设置断点。 左边缘在行号的左侧。 设置断点的其他方法是将光标置于代码行中,然后按 F9 或从菜单栏中选择 “调试”>“切换断点”。
如下图所示,Visual Studio用红点标记左边距,并高亮显示设置了断点的那一行。
按 F5 在调试模式下运行程序。 启动调试的另一种方法是从菜单中选择 调试>开始调试。
当程序提示输入名称时,在控制台窗口中输入字符串,然后按 Enter。
程序执行在到达断点之前以及执行
Console.WriteLine方法之前停止。 局部变量 窗口显示当前正在执行的方法中定义的变量的值。
启动Visual Studio Code。
打开在创建.NET控制台应用程序中创建的项目的文件夹。
打开 Program.cs 文件。
单击代码窗口的左边缘,在显示名称、日期和时间的行上设置断点。 左边缘在行号的左侧。 设置断点的其他方法是在选中代码行时按 F9 或从菜单中选择“运行”>“切换断点”。
Visual Studio Code通过在左边距显示红点来指示断点所在的行。
打开你在创建.NET控制台应用程序时创建的GitHub Codespace。
打开 HelloWorld.cs 文件。
单击代码窗口的左边缘,在显示名称、日期和时间的行上设置断点。 左边缘在行号的左侧。 您还可以通过在选择代码行时按 F9 来设置断点。
开始调试
程序执行在到达断点时停止,如上一部分所述。 局部变量 窗口显示当前正在执行的方法中定义的变量的值。
Debug 和 Release 是.NET的内置生成配置。 使用调试版本配置进行调试,并使用发布版本配置进行最终版本的发布和分发。
默认情况下,Visual Studio Code启动设置使用调试生成配置,因此在调试之前无需更改它。
通过选择左侧菜单上的“调试”图标打开“调试”视图。
选择 运行和调试。 如果系统询问,请选择 C#,然后选择 C#:开发启动项目。 在调试模式下启动程序的其他方法是按 F5 ,或者从菜单中选择 运行>启动调试。
如果系统要求 选择“启动配置”,请选择 “C#:调试活动文件”。
选择 调试控制台 选项卡以查看程序在等待响应之前显示的“你的姓名?”提示。
在“终端”窗口中输入字符串以响应输入姓名提示,然后按 调试控制台。
程序执行在到达断点并在
Console.WriteLine方法运行之前停止。 变量 窗口中 局部变量 部分显示当前正在运行的方法中定义的变量的值。
默认情况下,GitHub Codespaces 使用调试生成配置,因此在调试之前无需更改它。
通过选择左侧菜单上的“调试”图标打开“调试”视图。
选择 运行和调试。 如果系统询问,请选择 C# 作为调试器,然后选择 C#:调试活动文件 为启动配置。
选择 调试控制台 选项卡以查看程序在等待响应之前显示的“你的姓名?”提示。
在“终端”窗口中输入字符串以响应输入姓名提示,然后按 调试控制台。
程序执行在到达断点并在
Console.WriteLine方法运行之前停止。 变量 窗口中 局部变量 部分显示当前正在运行的方法中定义的变量的值。
使用“即时”窗口
即时 窗口允许你与正在调试的应用程序进行交互。 可以通过交互方式更改变量值,看看这样会对程序产生哪些影响。
如果 Immediate 窗口不可见,则通过选择 Debug>Windows>Immediate 来显示它。
在
name = "Gracie"窗口中输入 ,然后按 Enter 键。在
currentDate = DateTime.Parse("2026-02-05T20:25:00Z").ToUniversalTime()窗口中输入 ,然后按 Enter 键。“即时”窗口显示字符串变量的值和 DateTime 值的属性。 此外,“局部变量”窗口中也会更新变量值。
按 F5 继续程序执行。 继续操作的另一种方法是从菜单中选择`“调试”>“继续”。
控制台窗口中显示的值对应于你在 即时 窗口中所做的更改。
按任意键退出应用程序并停止调试。
使用调试控制台
调试控制台 窗口允许你与正在调试的应用程序进行交互。 您可以修改变量的值,以观察其对程序的影响。
选择 “调试控制台” 选项卡。
在
name = "Gracie"窗口底部的提示符下输入 ,然后按 Enter。
在
currentDate = DateTime.Parse("2026-01-28T20:54:00Z").ToUniversalTime()窗口底部输入 ,然后按 Enter。变量 窗口显示
name和currentDate变量的新值。选择工具栏中的 “继续” 按钮以继续程序执行。 继续操作的另一种方法是按 F5。
控制台窗口中显示的值对应于在 调试控制台中所做的更改。
的终端
按 Enter 退出应用程序并停止调试。
设置条件断点
该程序显示用户输入的字符串。 如果用户未输入任何内容,会发生什么情况? 可以使用名为“条件断点”的有用调试功能对此进行测试。
右键单击表示断点的红点。 在上下文菜单中,选择 条件 打开 断点设置 对话框。 选择“条件”框(如果尚未选择)。
显示断点设置面板的
对于 条件表达式,请在文本字段中输入以下代码。
string.IsNullOrEmpty(name)String.IsNullOrEmpty(name)每次断点被触发时,调试器都会调用
String.IsNullOrWhiteSpace(name)方法,仅当方法调用返回true时,才会在此行中断。可以指定“命中次数”(而不是条件表达式),这样程序就会在语句的执行次数达到指定值时中断执行。 另一个选项是指定 筛选条件,这会根据线程标识符、进程名称或线程名称等属性中断程序执行。
选择“关闭”以关闭对话框。
通过按 F5启动调试程序。
在控制台窗口中,当系统提示输入姓名时,按 Enter 键。
由于指定的条件(
name是null或 String.Empty)已得到满足,因此程序执行会在到达断点时以及执行Console.WriteLine方法之前停止。选择 局部变量 窗口,该窗口显示当前正在执行的方法本地变量的值。 在这种情况下,
Main是当前正在执行的方法。 观察到name变量的值为""或 String.Empty。在 即时 窗口中输入以下语句,然后按下 Enter键,以确认该值为空字符串。 结果为
true。? name == String.Empty? String.IsNullOrEmpty(name)问号指示即时窗口计算表达式。
按 F5 继续程序执行。
按任意键关闭控制台窗口并停止调试。
单击代码窗口左边缘上的点,清除断点。 清除断点的其他方法是在选中代码行时按 F9 或选择“调试”>“切换断点”。
右键单击(在 macOS 上按住 Ctrl 并单击)代表断点的红点。 在上下文菜单中,选择“编辑断点”,打开可输入条件表达式的对话框。
在下拉菜单中选择
Expression,输入以下条件表达式,并按 Enter。String.IsNullOrEmpty(name)
每次断点被触发时,调试器都会调用
String.IsNullOrEmpty(name)方法,仅当方法调用返回true时,才会在此行中断。可以指定“命中次数”(而不是条件表达式),这样程序就会在语句的运行次数达到指定值时中断执行。 另一个选项是指定 筛选条件,这会根据线程标识符、进程名称或线程名称等属性中断程序执行。
通过按 F5启动调试程序。
在 调试控制台 选项卡中,当系统提示输入姓名时,按 Enter。
由于指定的条件(
name是null或 String.Empty)已得到满足,因此程序执行会在到达断点时以及运行Console.WriteLine方法之前停止。变量 窗口显示
name变量的值""或 String.Empty。通过在调试控制台 提示符
处输入以下语句并按 Enter ,确认该值为空字符串。 结果为true。name == String.Empty选择工具栏上的 “继续”按钮以继续程序执行。
按 Enter 退出程序并停止调试。
单击代码窗口左边缘上的点,清除断点。 清除断点的其他方法是在选中代码行时按 F9,或者从菜单中选择“运行”>“切换断点”。
如果收到断点条件将丢失的警告,请选择删除断点。
单步执行程序
Visual Studio还允许逐行执行程序并监视其执行。 通常可以设置断点,并通过程序代码的一小部分执行程序流。 由于此程序很小,因此可以单步执行整个程序。
在代码行上设置一个断点,显示“你的姓名是什么?”提示符。
选择“调试”>“单步执行”。 一次调试一个语句的另一种方法是按 F11。
Visual Studio 会先突出显示,并在下一行执行旁边显示箭头。
此时,局部变量 窗口显示
args数组为空,name和currentDate具有默认值。 此外,Visual Studio还打开了一个空白控制台窗口。按 F11。 Visual Studio突出显示包含
name变量赋值的语句。 “局部变量”窗口显示name为null,控制台窗口显示字符串“What is your name?”。在控制台窗口中输入字符串,然后按 Enter,从而响应提示。 控制台无响应,输入的字符串不会显示在控制台窗口中,但 Console.ReadLine 方法将捕获输入。
按 F11。 Visual Studio突出显示包含
currentDate变量赋值的语句。 局部变量 窗口显示调用 Console.ReadLine 方法返回的值。 控制台窗口还显示在提示符处输入的字符串。按 F11。 “局部变量”窗口显示通过
currentDate属性赋值后的 DateTime.Now 变量值。 控制台窗口保持不变。按 F11。 Visual Studio调用 Console.WriteLine(String, Object, Object) 方法。 控制台窗口显示格式化字符串。
选择“调试”>“单步跳出”。停止分步执行的另一种方法是按 Shift+F11。
控制台窗口显示一条消息,并等待你按一个键。
按任意键关闭控制台窗口并停止调试。
Visual Studio Code还允许逐行执行程序并监视其执行。 通常可以设置断点,并通过程序代码的一小部分执行程序流。 由于此程序很小,因此可以单步执行整个程序。
在代码行上设置一个断点,显示“你的姓名是什么?”提示符。
按 F5 开始调试。
Visual Studio Code突出显示断点行。
此时,变量 窗口显示
args数组为空,name和currentDate具有默认值。从调试工具栏中选择 “单步调试” 或按 F11。
Visual Studio Code突出显示下一行。
Visual Studio Code运行名称提示
Console.WriteLine,并突出显示下一行的执行代码。 下一行是Console.ReadLine的name。 变量 窗口保持不变,终端 选项卡显示“你的姓名是什么?”提示符。选择单步进入或按F11。
Visual Studio Code突出显示
name变量赋值。 “变量”窗口显示 仍为namenull。通过在终端选项卡中输入字符串并按 Enter来响应提示。
调试控制台 选项卡可能不会显示输入时输入的字符串,但 Console.ReadLine 方法将捕获输入。
选择单步进入或按F11。
Visual Studio Code突出显示
currentDate变量赋值。 变量 窗口显示调用 Console.ReadLine 方法返回的值。 终端 选项卡显示在提示符处输入的字符串。选择单步进入或按F11。
“变量”窗口显示通过 属性赋值后的
currentDate变量值DateTime.Now。选择单步进入或按F11。
Visual Studio Code调用 Console.WriteLine(String, Object, Object) 方法。 控制台窗口显示格式化字符串。
选择“ 单步退出 ”或按 Shift+F11。
终端显示“按任意键退出...”
按任意键退出程序。
使用“发布”生成配置
测试应用程序的调试版本后,还应编译并测试发布版本。 Release 版本包含编译器优化,有时可能会对应用程序的行为产生负面影响。 例如,旨在提高性能的编译器优化可能会在多线程应用程序中创建竞态条件。
若要生成和测试控制台应用程序的发布版本,请将工具栏上的生成配置从 “调试” 更改为“发布”。
按 F5 或从 Build 菜单中选择 生成解决方案 时,Visual Studio 会编译应用程序的发布版本。 可像测试“调试”版本一样测试“发布”版本。
若要生成并测试控制台应用程序的发布版本,请打开 终端 并运行以下命令:
dotnet run --configuration Release
若要生成并测试控制台应用程序的发布版本,请在终端中运行以下命令:
dotnet run --configuration Release HelloWorld.cs
后续步骤
在本教程中,你使用了调试工具。 在下一教程中,你将发布应用的可部署版本。