本文介绍分步演练中 Visual Studio 调试器的功能。 如果想要更高级别的调试器功能视图,请参阅 首先查看调试器。 调试应用时,这通常意味着使用附加的调试器运行应用程序。 当你执行该任务时,调试器提供多种方式让你查看代码的运行过程。 可以单步执行代码并查看变量中存储的值,可以设置对变量的监视以查看何时更改值,可以检查代码的执行路径,查看代码的分支是否正在运行,等等。 如果这是您第一次尝试调试代码,在阅读本文之前,您可能想先阅读绝对初学者调试指南。
虽然演示应用是 Visual Basic,但大多数功能都适用于 Visual Studio 支持的 C#、C++、F#、Python、JavaScript 和其他语言(F# 不支持编辑并继续)。F# 和 JavaScript 不支持 “自动” 窗口。 屏幕截图位于 Visual Basic 中。
在本教程中,你将:
- 启动调试器并触发断点。
- 了解在调试器中逐步执行代码的命令
- 检查数据提示和调试器窗口中的变量
- 检查调用堆栈
先决条件
必须安装 Visual Studio 2019 和 .NET Core 跨平台开发 工作负载。
如果尚未安装 Visual Studio,请转到 Visual Studio 下载 页免费安装。
如果需要安装工作负载但已有 Visual Studio,请转到 “工具>获取工具和功能...”,这将打开 Visual Studio 安装程序。 Visual Studio 安装程序将启动。 选择 .NET Core 跨平台开发 工作负载,然后选择 “修改”。
如果尚未安装 Visual Studio,请转到 Visual Studio 下载 页免费安装。
如果需要安装工作负载但已有 Visual Studio,请转到 “工具>获取工具和功能...”,这将打开 Visual Studio 安装程序。 Visual Studio 安装程序将启动。 选择 .NET 桌面开发工作负载,然后选择修改。
创建项目
首先,创建 .NET Core 控制台应用程序项目。 在添加任何内容之前,项目类型附带所需的所有模板文件!
打开 Visual Studio。 如果启动窗口未打开,请选择“ 文件>开始窗口”。
在“开始”窗口中,选择“创建新项目”。
在 “创建新项目 ”窗口中,在搜索框中输入 控制台 。 接下来,从语言列表中选择 Visual Basic ,然后从平台列表中选择 Windows 。
应用语言和平台筛选器后,选择 .NET Core 的 控制台应用 模板,然后选择“ 下一步”。
注释
如果未看到 控制台应用 模板,可以从 “创建新项目 ”窗口安装它。 在 “未找到要查找的内容?” 消息中,选择“ 安装更多工具和功能 ”链接。 然后,在 Visual Studio 安装程序中,选择 .NET Core 跨平台开发 工作负载。
在“配置新项目”窗口中,在“项目名称”框中输入“开始调试”。 然后选择下一步。
选择建议的目标框架(.NET 8.0 或长期支持),然后选择“ 创建”。
在 “创建新项目 ”窗口中,在搜索框中输入 控制台 。 接下来,从语言列表中选择 Visual Basic ,然后从平台列表中选择 Windows 。
应用语言和平台筛选器后,选择 .NET Core 的 控制台应用 模板,然后选择“ 下一步”。
在搜索框中输入“控制台”,显示“创建新项目”窗口的屏幕截图,其中语言和平台筛选器已选择“Visual Basic”和“Windows”。控制台应用程序项目模板已被选择。
注释
如果未看到 控制台应用 模板,可以从 创建新项目 窗口安装它。 在 “未找到要查找的内容?” 消息中,选择“ 安装更多工具和功能 ”链接。 然后,在 Visual Studio 安装程序中,选择 .NET 桌面开发 工作负载。
在“配置新项目”窗口中,在“项目名称”框中输入“开始调试”。 然后选择下一步。
在“其他信息”窗口中,确保在“框架”下拉菜单中选择 .NET 8.0,然后选择“创建”。
Visual Studio 打开了你的新项目。
创建应用程序
在 Program.vb中,将所有默认代码替换为以下代码:
Imports System
Class ArrayExample
Public Shared Sub Main()
Dim letters As Char() = {"f"c, "r"c, "e"c, "d"c, " "c, "s"c, "m"c, "i"c, "t"c, "h"c}
Dim name As String = ""
Dim a As Integer() = New Integer(9) {}
For i As Integer = 0 To letters.Length - 1
name += letters(i)
a(i) = i + 1
SendMessage(name, a(i))
Next
Console.ReadKey()
End Sub
Private Shared Sub SendMessage(ByVal name As String, ByVal msg As Integer)
Console.WriteLine("Hello, " & name & "! Count to " & msg)
End Sub
End Class
启动调试器!
按 F5 (调试 > 开始调试)或调试工具栏中的 “开始调试 ”按钮
。F5 使用附加到应用进程的调试器启动应用,但现在我们没有执行任何特殊作来检查代码。 因此,应用程序加载后,你能看到控制台输出。
Hello, f! Count to 1 Hello, fr! Count to 2 Hello, fre! Count to 3 Hello, fred! Count to 4 Hello, fred ! Count to 5 Hello, fred s! Count to 6 Hello, fred sm! Count to 7 Hello, fred smi! Count to 8 Hello, fred smit! Count to 9 Hello, fred smith! Count to 10在本教程中,你将使用调试器仔细了解此应用,并查看调试器功能。
按红色停止按钮(Shift + F5)停止调试器。
在控制台窗口中,按键关闭控制台窗口。
按 F5 (调试 > 开始调试)或在调试工具栏中选择绿色 的“开始调试 ”按钮。
F5 使用附加到应用进程的调试器启动应用,但现在我们没有执行任何特殊作来检查代码。 所以应用程序加载后,你会看到控制台输出。
Hello, f! Count to 1 Hello, fr! Count to 2 Hello, fre! Count to 3 Hello, fred! Count to 4 Hello, fred ! Count to 5 Hello, fred s! Count to 6 Hello, fred sm! Count to 7 Hello, fred smi! Count to 8 Hello, fred smit! Count to 9 Hello, fred smith! Count to 10在本教程中,你将使用调试器仔细了解此应用,并查看调试器功能。
通过按 (Shift + F5) 或选择调试工具栏中的红色 “停止调试 ”按钮来停止调试器。
在控制台窗口中,按键关闭控制台窗口。
设置断点并启动调试器
在
For函数的Main循环中,通过单击下面代码行左侧边距来设置断点:name += letters(i)此时会显示一个红色圆圈
,可在其中设置断点。断点是可靠调试的最基本和最重要功能之一。 断点指示 Visual Studio 应在哪个位置挂起你的运行代码,以使你可以查看变量的值或内存的行为,或确定代码的分支是否运行。
按 F5 或 “开始调试 ”按钮。
应用启动后,调试器将运行到设置断点的代码行。
黄色箭头表示调试器暂停的语句。 代码执行在同一时间点暂停(此语句尚未执行)。
如果应用尚未运行, F5 将启动调试器并在第一个断点处停止。 否则, F5 将继续将应用运行到下一个断点。
当您知道代码行或要详细检查的代码部分时,断点是一项有用的功能。 有关可以设置的不同类型的断点的信息,例如条件断点,请参阅 “使用断点”。
在
For函数的循环中,通过单击以下代码行左侧的边距来设置断点:name += letters(i)此时会显示一个红色圆圈,可在其中设置断点。
断点是可靠调试的最基本和最重要功能之一。 断点指示 Visual Studio 应在哪个位置挂起你的运行代码,以使你可以查看变量的值或内存的行为,或确定代码的分支是否运行。
按 F5 (调试 > 开始调试)或调试工具栏中的 “开始调试 ”按钮,应用启动,调试器将运行到设置断点的代码行。
黄色箭头表示调试器暂停的语句,该语句也会在同一点暂停应用执行(尚未执行此语句)。
如果应用尚未运行, F5 将启动调试器并在第一个断点处停止。 否则, F5 将继续将应用运行到下一个断点。
当您知道代码行或要详细检查的代码部分时,断点是一项有用的功能。 有关可以设置的不同类型的断点的信息,例如条件断点,请参阅 “使用断点”。
在调试器中使用步进命令导航代码
大多数情况下,我们在此处使用键盘快捷方式,因为它是在调试器中快速执行应用的好方法(如菜单命令等等效命令显示在括号中)。
暂停代码执行于
Main方法的For循环时,按F11(或选择“调试>单步进入”)两次,以进入SendMessage方法调用。按 F11 两次后,您应该看到这行代码:
SendMessage(name, a(i))再按 F11 一次即可单步进入
SendMessage方法。黄色指针前进到
SendMessage方法中。
F11 是“单步执行”命令,每按一次,应用就执行下一个语句。 F11 是最详细地检查执行流的好方法。 (为了更快地通过代码移动,我们还会显示一些其他选项。默认情况下,调试器跳过非用户代码(如果需要更多详细信息,请参阅 “仅我的代码”)。
假设你已完成检查
SendMessage方法,并且想要退出该方法,但保持在调试器中。 可以使用 “单步出” 命令执行此操作。按 Shift + F11 (或 调试 > 退出)。
此命令将恢复应用执行(并推进调试器),直到当前方法或函数返回。
应返回到
For循环中的Main方法,并在调用SendMessage方法时暂停。多次按 F11 ,直到再次返回到
SendMessage方法调用。在方法调用中暂停代码执行时,请按 F10 (或选择 “调试 > 单步执行”)一次。
请注意这一次,调试器这次没有进入
SendMessage方法。 F10 在不单步执行应用代码中的函数或方法的情况下推进调试器(代码仍在执行)。 通过在方法调用上按 F10(而不是 F11),我们跳过了实现代码SendMessage(也许我们现在对此不感兴趣)。 有关在代码中进行移动的不同方法的详细信息,请参阅浏览调试器中的代码。
在本文中,我们使用键盘快捷方式,因为它是在调试器中快速执行应用的好方法(如菜单命令等等效命令显示在括号中)。
当代码执行在方法的
ForMain循环中暂停时,按 F11(或选择“调试>单步执行”)两次以前进到SendMessage方法调用。按 F11 两次后,应位于以下代码行:
SendMessage(name, a(i))再按 F11 一次即可进入
SendMessage方法。黄色指针前进到
SendMessage方法中。
F11 是 单步跳入 命令,逐条语句推进应用程序的执行。 F11 是最详细地检查执行流的好方法。 (为了更快地通过代码移动,我们还会显示一些其他选项。默认情况下,调试器跳过非用户代码(如果需要更多详细信息,请参阅 “仅我的代码”)。
假设你已完成检查
SendMessage方法,并且想要离开该方法,但仍保留在调试器中。 可以使用 “单步出” 命令执行此操作。按 Shift + F11 (或 调试 > 退出)。
此命令将恢复应用执行(并推进调试器),直到当前方法或函数返回。
你应该回到
Main方法中的For循环,并在SendMessage方法调用时暂停。多次按 F11 ,直到再次返回到
SendMessage方法调用。在方法调用中暂停代码执行时,请按 F10 (或选择 “调试 > 单步执行”)一次。
请注意这一次,调试器这次没有进入
SendMessage方法。 F10 在不单步执行应用代码中的函数或方法的情况下推进调试器(代码仍在执行)。 通过在方法调用上按 F10(而不是 F11),我们跳过了SendMessage的实现代码(可能我们现在对此不感兴趣)。 有关在代码中进行移动的不同方法的详细信息,请参阅浏览调试器中的代码。
使用“运行到单击”功能导航代码
按 F5 再次转到断点。
在代码编辑器中,向下滚动并将鼠标悬停在
SendMessage方法中的Console.WriteLine方法上,直到出现绿色的 Run to Click 按钮。
按钮的工具提示显示“在此处运行执行”。
注释
Visual Studio 2017 中的 “运行到单击” 按钮是新的。 (如果未看到绿色箭头按钮,请改用本示例中的 F11 将调试器前进到正确的位置。
单击 “运行到单击” 按钮。
调试器跳转到
Console.WriteLine方法。使用此按钮类似于设置临时断点。 快速跳转到单击 功能可以帮助在应用代码的可见区域中快速导航(可以在任何打开的文件中选择)。
按 F5 再次转到断点。
在代码编辑器中,向下滚动,将鼠标悬停在
Console.WriteLine方法中的SendMessage方法上,直到出现绿色的 “单击运行” 按钮。 按钮的工具提示显示“在此处运行代码”。
选择 “运行到点击” 按钮。
调试器前进到该
Console.WriteLine方法。使用此按钮类似于设置临时断点。 Run to Click 功能方便用户在应用代码的可见区域中快速导航(可以在任何打开的文件中使用)。
快速重启应用
在调试工具栏中选择 “重启 ”按钮
(Ctrl + Shift + F5)。
按 重启时,它可以节省时间,而不是停止应用并重启调试器。 调试器在执行代码命中的第一个断点处暂停。
调试器会在之前在循环中设置的 For 断点处再次停止。
若要重启应用,请按 Ctrl + Shift + F5 组合键,可以节省时间,而不是停止应用并重启调试器。 调试器在执行代码命中的第一个断点处暂停。
调试器会在之前在循环中设置的 For 断点处再次停止。
使用数据提示检查变量
允许你检查变量的功能是调试器最有用的功能之一,可通过不同的方法来执行此作。 通常,当你尝试调试问题时,你正尝试找出变量是否存储期望它们在特定时间拥有的值。
在语句上暂停代码执行时,将鼠标悬停在
name += letters[i]变量上letters,并看到其默认值,即数组"f"c中第一个元素的值。接下来,将鼠标悬停在
name变量上,可以看到其当前值(一个空字符串)。按 F5 (或 调试>继续)多次循环访问
For循环,在断点再次暂停,并每次将鼠标悬停在name变量上以检查其值。
变量的值随
For循环的每个迭代而更改,其中显示了f、fr、fre等值。在调试时,你常常希望能够快速检查变量的属性值,以确认它们是否存储了预期的值,而数据提示是一个很好的工具。
允许你检查变量的功能是调试器最有用的功能之一,可通过不同的方法来执行此作。 通常,当你尝试调试问题时,你正尝试找出变量是否存储期望它们在特定时间拥有的值。
在语句上暂停代码执行时,将鼠标悬停在
name += letters[i]变量上letters,并看到其默认值,即数组"f"c中第一个元素的值。接下来,将鼠标悬停在
name变量上,可以看到其当前值(一个空字符串)。按 F5 (或 调试>继续)多次循环访问
For循环,在断点再次暂停,并每次将鼠标悬停在name变量上以检查其值。
变量的值随
For循环的每个迭代而更改,其中显示了f、fr、fre等值。通常,在调试时,你希望快速检查变量的属性值,以确认它们是否存储了你期望的值,而使用数据提示工具是个很好的方法。
使用“自动”和“局部变量”窗口检查变量
查看代码编辑器底部的 “自动” 窗口。
如果它已关闭,在调试器中暂停代码执行时,通过选择调试>Windows>Autos来打开它。
在 “自动” 窗口中,可以看到变量及其当前值。 自动窗口显示当前行或上一行中使用的所有变量(请查看文档以了解特定编程语言的行为)。
接下来,在“自动”窗口旁边的选项卡中查看“局部变量”窗口。
展开
letters变量以显示它包含的元素。
局部变量 窗口显示当前 作用域(即当前执行上下文)中的变量。
查看代码编辑器底部的 “自动” 窗口。
如果它已关闭,则通过选择“调试>>”在调试器中暂停代码执行时打开它。
在 “自动” 窗口中,可以看到变量及其当前值。 Autos 窗口显示当前行或上一行中使用的所有变量(查看语言特定行为的文档)。
接下来,在“自动”窗口旁边的选项卡中查看“局部变量”窗口。
展开
letters变量以显示它包含的元素。
局部变量 窗口显示当前 作用域(即当前执行上下文)中的变量。
设置监视
在主代码编辑器窗口中,右键单击 name 变量并选择 “添加监视”。
“ 监视 ”窗口将在代码编辑器底部打开。 您可以使用 监视 窗口来指定您希望关注的变量或表达式。
现在,您已经在 name 变量上设置了监视,可以在调试器中逐步执行时看到其值的变化。 与其他变量窗口不同,“监视窗口”始终显示你所监视的变量(当变量超出作用域时,它们会灰显)。
可以将变量或表达式添加到“监视”窗口,以在单步执行代码时监控这些变量或表达式。
暂停调试器时,右键单击
name该变量并选择 “添加监视”。默认情况下, “监视 ”窗口将在代码编辑器底部打开。
现在,你已对
name变量设置了监视,请逐步执行代码,以查看name变量在每次for循环迭代时值更改。与其他变量窗口不同,监视 窗口始终显示正在监视的变量。 作用域外变量显示为不可用。
有关 监视窗口 的详细信息,请参阅 使用监视窗口监视变量。
检查调用堆栈
在循环中
For暂停代码执行时,请选择“ 调用堆栈 ”窗口,该窗口默认在右下窗格中打开。如果它已关闭,请在调试器中暂停代码执行时打开它,方法是选择 “调试>Windows>调用堆栈”。
选择 F11 几次,直到看到调试器在
SendMessage方法中暂停。 查看 “调用堆栈” 窗口。
调用堆栈 窗口显示调用方法和函数的顺序。 上行显示当前功能(该应用中的
SendMessage方法)。 第二行显示SendMessage方法是从Main方法调用的,依此类推。注释
调用堆栈 窗口类似于 Eclipse 等 IDE 中的“调试”透视。
调用堆栈是检查和了解应用执行流的好方法。
可以双击一行代码来查看该源代码,并更改调试器正在检查的当前范围。 此动作没有推进调试过程。
还可以使用 调用堆栈 窗口中的右键单击菜单来执行其他操作。 例如,您可以将断点插入到指定的函数中,使用 运行到光标 来推进调试器,然后检查源代码。 有关详细信息,请参阅 “如何:检查调用堆栈”。
在循环中
For暂停代码执行时,请选择“ 调用堆栈 ”窗口,该窗口默认在右下窗格中打开。如果它已关闭,请在调试器中暂停代码执行时打开它,方法是选择 “调试>Windows>调用堆栈”。
选择 F11 几次,直到看到调试器在
SendMessage方法中暂停。 查看 “调用堆栈” 窗口。
调用堆栈 窗口显示调用方法和函数的顺序。 顶部行显示当前函数(此应用中的
SendMessage方法)。 第二行显示SendMessage是从Main方法调用的,以此类推。注释
调用堆栈 窗口类似于 Eclipse 等 IDE 中的“调试”透视。
调用堆栈是检查和了解应用执行流的好方法。
可以双击一行代码来查看该源代码,并更改调试器正在检查的当前范围。 此操作不会推进调试器。
还可以使用 调用堆栈 窗口中的右键单击菜单来执行其他操作。 例如,你可以在指定的函数中插入断点,使用 运行到光标 推进调试器,然后检查源代码。 有关详细信息,请参阅 “如何:检查调用堆栈”。
更改执行流
按 F11 两次运行
Console.WriteLine该方法。在调试器在
SendMessage方法调用中暂停后,使用鼠标抓住黄色箭头图标或执行指针(在左侧边距中),然后将指针向上拖动一行到Console.WriteLine语句。按 F11。
调试器重新运行
Console.WriteLine方法(在控制台窗口输出中看到此操作)。通过更改执行流,可以执行诸如测试不同代码执行路径或重新运行代码之类的操作,而无需重启调试器。
警告
通常,需要注意此功能,并在工具提示中看到警告。 您可能还会看到其他警告。 移动指针无法将应用程序还原到以前的应用状态。
按 F5 继续运行应用。
祝贺你完成本教程!
后续步骤
本教程介绍了如何启动调试器、逐步执行代码和检查变量。 你可能想要大致了解调试器功能以及指向详细信息的链接。