教程:学习使用 Visual Studio 调试 Visual Basic 代码

本文通过分步演练介绍了 Visual Studio 调试器的功能。 如果需要更加深入地了解调试器功能,请参阅初探调试器。 当你调试应用时,通常意味着运行附带有调试器的应用程序。 执行此任务时,调试器在运行过程中可提供许多方法让你查看代码的情况。 你可以逐步浏览代码、查看变量中存储的值、设置对变量的监视以查看值何时改变、检查代码的执行路径、查看代码分支是否正在运行等等。 如果这是你第一次在本练习中尝试调试代码,建议在浏览本文之前阅读零基础调试

虽然演示应用为 Visual Basic,但大多数功能都适用于 C#、C++、F#、Python、JavaScript 和 Visual Studio 支持的其他语言(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 控制台应用程序项目。 项目类型随附了所需的全部模板文件,无需添加任何内容!

  1. 打开 Visual Studio。 如果“开始”窗口未打开,请选择“文件”>“启动窗口”

  2. 在“开始”窗口中,选择“创建新项目”。

  1. 在“创建新项目”窗口的搜索框中输入“控制台”。 接下来,从“语言”列表中选择 Visual Basic,然后从“平台”列表中选择“Windows”

    应用语言和平台筛选器之后,对 .NET Core 选择“控制台应用”模板,然后选择“下一步”

    Screenshot showing the Create a new project window with 'console' in the search box, and 'Visual Basic' and 'Windows' selected for the Language and Platform filters. The Console Application project template is selected.

    注意

    如果未看到“控制台应用”模板,则可以通过“创建新项目”窗口安装该模板 。 在“找不到所需内容?”消息中,选择“安装更多工具和功能”链接 。 然后,在 Visual Studio 安装程序中,选择“.NET Core 跨平台开发”工作负载 。

  2. 在“配置新项目”窗口中,在“项目名称”框中输入“get-started-debugging”。 然后,选择“下一步” 。

  3. 选择推荐的目标框架(.NET 8.0 或“长期支持”),然后选择“创建”

  1. 在“创建新项目”窗口的搜索框中输入“控制台”。 接下来,从“语言”列表中选择 Visual Basic,然后从“平台”列表中选择“Windows”

    应用语言和平台筛选器之后,对 .NET Core 选择“控制台应用”模板,然后选择“下一步”

    Screenshot showing the Create a new project window with 'console' in the search box, and 'Visual Basic' and 'Windows' selected for the Language and Platform filters. The Console Application project template is selected.

    注意

    如果未看到“控制台应用”模板,则可以通过“创建新项目”窗口安装该模板。 在“找不到所需内容?”消息中,选择“安装更多工具和功能”链接 。 然后在 Visual Studio 安装程序中,选择“.NET 桌面开发”工作负载。

  2. 在“配置新项目”窗口中,在“项目名称”框中输入“get-started-debugging”。 然后,选择“下一步” 。

  3. 在“其他信息”窗口中,确保在“框架”下拉菜单中选择“.NET 8.0”,然后选择“创建”

此时,Visual Studio 将打开新项目。

创建应用程序

在 Program.cs 中,使用以下代码替换所有默认代码

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

启动调试器!

  1. 按 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
    

    在本教程中,你将使用调试器仔细查看此应用,并查看调试器功能。

  2. 按红色的停止按钮 (Shift + F5) 停止调试器

  3. 在控制台窗口中,按某个键来关闭控制台窗口。

  1. 按 F5(“调试”>“开始调试”),或在调试工具栏中选择绿色的“开始调试”按钮。

    Screenshot showing the Debug Toolbar with the green Start Debugging button highlighted.

    通过 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
    

    在本教程中,你将使用调试器仔细查看此应用,并查看调试器功能。

  2. 按 Shift + F5 停止调试器,或在调试工具栏中选择红色的“停止调试”按钮。

    Screenshot showing the Debug Toolbar with the red Stop Debugging button highlighted.

  3. 在控制台窗口中,按某个键来关闭控制台窗口。

设置断点并启动调试器

  1. Main 函数的 For 循环中,通过单击以下代码行的左边距来设置断点:

    name += letters(i)

    设置断点的位置会出现一个红圈

    断点是可靠调试的最基本和最重要的功能之一。 断点指示 Visual Studio 应在哪个位置挂起你的运行代码,以使你可以查看变量的值或内存的行为,或确定代码的分支是否运行。

  2. 按 F5 或“开始调试”按钮应用随即启动,调试器将运行到你设置了断点的代码行。

    Screenshot showing the Visual Studio code editor window with execution stopped at a breakpoint.

    黄色箭头表示调试器暂停时所在的语句。 代码执行在同一点上暂停(此语句尚未执行)。

    如果应用尚未运行,则按 F5 会启动调试器并在第一个断点处停止。 否则,按 F5 将继续运行应用至下一个断点 。

    当你知道要详细检查的代码行或代码段时,断点功能非常有用。 有关可设置的不同类型断点(如条件断点)的信息,请参阅使用断点

  1. Main 函数的 For 循环中,通过单击以下代码行的左边距来设置断点:

    name += letters(i)

    设置断点的位置会出现一个红圈 。

    断点是可靠调试的最基本和最重要的功能之一。 断点指示 Visual Studio 应在哪个位置挂起你的运行代码,以使你可以查看变量的值或内存的行为,或确定代码的分支是否运行。

  2. 按 F5(“调试”>“开始调试”)或调试工具栏中的“开始调试”按钮,应用随即启动,调试器将运行到在其中设置了断点的代码行。

    Screenshot showing the Visual Studio Code editor window with execution stopped at a breakpoint.

    黄色箭头表示调试器暂停时所在的语句,它还在同一点上暂停应用执行(此语句尚未执行)。

    如果应用尚未运行,则按 F5 会启动调试器并在第一个断点处停止。 否则,按 F5 将继续运行应用至下一个断点 。

    当你知道要详细检查的代码行或代码段时,断点功能非常有用。 有关可设置的不同类型断点(如条件断点)的信息,请参阅使用断点

大多数情况下,我们使用键盘快捷方式,因为这是在调试器中快速执行应用的好方法(括号中显示了等效的命令,如菜单命令)。

  1. 当代码执行在 Main 方法中的 For 循环中暂停时,按两次 F11(或选择“调试”>“单步执行”)前进到 SendMessage 方法调用

    按两次 F11 后,应位于以下代码行

    SendMessage(name, a(i))

  2. 再按一次 F11 单步执行到 SendMessage 方法 。

    黄色指针会前进到 SendMessage 方法。

    Screenshot showing a debug session in the Visual Studio code editor with execution paused after stepping into the 'SendMessage' method.

    F11 是“单步执行”命令,每按一次,应用就执行下一个语句 。 F11 是一种以最详尽方式检查执行流的好方法。 (为了更快地浏览代码,我们还向你展示一些其他选项。)默认情况下,调试器会跳过非用户代码(如果需要更多详细信息,请参阅仅我的代码)。

    假设你已完成了对 SendMessage 方法的检查,并且希望退出该方法但保持位于调试器中。 可使用“单步跳出”命令执行此操作 。

  3. 按 Shift + F11(或“调试”>“单步跳出”)。

    此命令将恢复应用执行(并使调试器前进),直到当前方法或函数返回。

    你应当回到 Main 方法的 For 循环,在 SendMessage 方法调用处暂停。

  4. 多按几次 F11,直到再次返回到 SendMessage 方法调用

  5. 当代码执行在方法调用处暂停时,按一下 F10(或选择“调试”>“单步跳过”)

    Screenshot showing a Debug session in the Visual Studio code editor with execution paused after stepping over the 'SendMessage' method call.

    请注意,这次调试器不会单步执行 SendMessage 方法。 按 F10 将使调试器前进,但不会单步执行应用代码中的函数或方法(代码仍将执行)。 通过在进行 SendMessage 方法调用时按“F10”(而不是“F11”),我们跳过了 SendMessage 的实现代码(我们现在可能对此不感兴趣)。 有关在代码中进行移动的不同方法的详细信息,请参阅浏览调试器中的代码

在本文中,我们使用了键盘快捷方式,因为这是在调试器中快速执行应用的好方法(括号中显示了等效的命令,如菜单命令)。

  1. 当代码执行在 Main 方法中的 For 循环中暂停时,按两次 F11(或选择“调试”>“单步执行”)前进到 SendMessage 方法调用

    按两次 F11 后,应位于以下代码行

    SendMessage(name, a(i))

  2. 再按一次 F11 单步执行到 SendMessage 方法 。

    黄色指针会前进到 SendMessage 方法。

    Screenshot showing a debug session in the Visual Studio Code editor with execution paused after stepping into the 'SendMessage' method.

    F11 是“单步执行”命令,每按一次,应用就执行下一个语句 。 F11 是一种以最详尽方式检查执行流的好方法。 (为了更快地浏览代码,我们还向你展示一些其他选项。)默认情况下,调试器会跳过非用户代码(如果需要更多详细信息,请参阅仅我的代码)。

    假设你已完成了对 SendMessage 方法的检查,并且希望退出该方法但保持位于调试器中。 可使用“单步跳出”命令执行此操作 。

  3. 按 Shift + F11(或“调试”>“单步跳出”)。

    此命令将恢复应用执行(并使调试器前进),直到当前方法或函数返回。

    你应当回到 Main 方法的 For 循环,在 SendMessage 方法调用处暂停。

  4. 多按几次 F11,直到再次返回到 SendMessage 方法调用

  5. 当代码执行在方法调用处暂停时,按一下 F10(或选择“调试”>“单步跳过”)

    Screenshot showing a Debug session in the Visual Studio Code editor with execution paused after stepping over the 'SendMessage' method call.

    请注意,这次调试器不会单步执行 SendMessage 方法。 按 F10 将使调试器前进,但不会单步执行应用代码中的函数或方法(代码仍将执行)。 通过在进行 SendMessage 方法调用时按“F10”(而不是“F11”),我们跳过了 SendMessage 的实现代码(我们现在可能对此不感兴趣)。 有关在代码中进行移动的不同方法的详细信息,请参阅浏览调试器中的代码

  1. 按 F5 再次前进到断点 。

  2. 在代码编辑器中向下滚动,并将鼠标悬停在 SendMessage 方法中的 Console.WriteLine 方法上,直到出现绿色的“运行到单击处”按钮按钮的工具提示显示“将执行运行到此处”。

    Screenshot showing the Run to Click button with tooltip highlighted on the left side of the code editor window.

    注意

    “运行到单击处”按钮是 Visual Studio 2017 中的新增按钮。 (如果未看到绿色箭头按钮,请在此示例中改为使用 F11 以使调试器前进到正确的位置。 )

  3. 选择“运行到单击处”按钮。

    调试器会前进到 Console.WriteLine 方法。

    使用此按钮类似于设置临时断点。 “运行到单击处”对于快速到达应用代码的可见区域十分方便(你可在任何打开的文件中选择)

  1. 按 F5 再次前进到断点 。

  2. 在代码编辑器中向下滚动,并将鼠标悬停在 SendMessage 方法中的 Console.WriteLine 方法上,直到出现绿色的“运行到单击处”按钮。 按钮的工具提示显示“将执行运行到此处”。

    Screenshot showing the Run to Click button with tooltip highlighted on the left side of the code editor window.

  3. 选择“运行到单击处”按钮。

    调试器会前进到 Console.WriteLine 方法。

    使用此按钮类似于设置临时断点。 “运行到单击处”对于快速到达应用代码的可见区域十分方便(你可在任何打开的文件中选择)

快速重启应用

在调试工具栏中选择“重启”按钮 (Ctrl + Shift + F5)。

当你按下“重启”时,与停止应用并重启调试器相比,它节省了时间 。 调试器在执行代码命中的第一个断点处暂停。

调试器再次在你之前在 For 循环上设置的断点处停止。

若要重启应用,请按 Ctrl + Shift + F5 组合键,与停止应用并重启调试器相比,这样可以节省时间 。 调试器在执行代码命中的第一个断点处暂停。

调试器再次在你之前在 For 循环上设置的断点处停止。

使用数据提示检查变量

允许你检查变量的功能是调试器最有用的功能之一,并且有不同的方法来执行此操作。 通常,当尝试调试问题时,你试图找出变量是否存储了你期望它们在特定时间具有的值。

  1. 当代码执行在 name += letters[i] 语句处暂停时,将鼠标悬停在 letters 变量上,此时你会看到其默认值,即数组中第一个元素的值 "f"c

  2. 接下来,将鼠标悬停在 name 变量上,会看到其当前值为空字符串。

  3. 多按几次 F5(或“调试”>“继续”),通过 For 循环执行多次循环访问,再次在断点处暂停,每次都将鼠标悬停在 name 变量上以检查其值

    Screenshot showing debug execution stopped in the code editor with the 'name' variable highlighted and a data tip showing the value as 'fre'.

    变量的值随 For 循环的每次迭代而更改,显示的值依次为 ffrfre,依此类推。

    通常情况下,在调试时,需要快速检查变量的属性值,以查看它们是否存储了你希望它们存储的值,可根据数据提示执行此操作。

允许你检查变量的功能是调试器最有用的功能之一,并且有不同的方法来执行此操作。 通常,当尝试调试问题时,你试图找出变量是否存储了你期望它们在特定时间具有的值。

  1. 当代码执行在 name += letters[i] 语句处暂停时,将鼠标悬停在 letters 变量上,此时你会看到其默认值,即数组中第一个元素的值 "f"c

  2. 接下来,将鼠标悬停在 name 变量上,会看到其当前值为空字符串。

  3. 多按几次 F5(或“调试”>“继续”),通过 For 循环执行多次循环访问,再次在断点处暂停,每次都将鼠标悬停在 name 变量上以检查其值

    Screenshot showing debug execution stopped in the code editor with the name variable highlighted and a data tip showing the value.

    变量的值随 For 循环的每次迭代而更改,显示的值依次为 ffrfre,依此类推。

    通常情况下,在调试时,需要快速检查变量的属性值,以查看它们是否存储了你希望它们存储的值,可根据数据提示执行此操作。

使用“自动”和“局部变量”窗口检查变量

  1. 查看代码编辑器底部的“自动”窗口 。

    如果已关闭,请在代码执行处于暂停状态的情况下,依次选择“调试”>“Windows”>“自动”,在调试器中将其打开

    在“自动”窗口中,可看到变量及其当前值 。 “自动”窗口显示当前行或前一行使用的所有变量(检查文档中特定于语言的行为) 。

  2. 接下来,我们来看看“自动”窗口旁边的选项卡中的“局部变量”窗口 。

  3. 展开 letters 变量以显示其包含的元素。

    Screenshot showing the Locals Window with the 'letters' variable expanded to show the value and type of the elements it contains.

    “局部变量”窗口显示当前作用域中的变量,即当前执行上下文 。

  1. 查看代码编辑器底部的“自动”窗口 。

    如果已关闭,请在代码执行处于暂停状态的情况下,依次选择“调试”>“Windows”>“自动”,在调试器中将其打开

    在“自动”窗口中,可看到变量及其当前值 。 “自动”窗口显示当前行或前一行使用的所有变量(检查文档中特定于语言的行为) 。

  2. 接下来,我们来看看“自动”窗口旁边的选项卡中的“局部变量”窗口 。

  3. 展开 letters 变量以显示其包含的元素。

    Screenshot showing the Locals Window with the 'letters' variable expanded to show the value and type of the elements it contains.

    “局部变量”窗口显示当前作用域中的变量,即当前执行上下文 。

设置监视

在主代码编辑器窗口中,右键单击 name 变量,然后选择“添加监视” 。

“监视”窗口将在代码编辑器的底部打开 。 可使用“监视”窗口指定要关注的变量(或表达式) 。

现在,你在 name 变量上设置好了监视,当你在调试器中移动时,可看到其值发生变化。 与其他变量窗口不同,“监视”窗口始终显示你正在监视的变量(当超出范围时,它们会变灰)

可以指定你在逐步执行代码时想要观察的变量或表达式 - 将其添加到“监视”窗口即可。

  1. 当调试器处于暂停状态时,右键单击 name 变量并选择“添加监视”。

    “监视”窗口默认将在代码编辑器的底部打开。

  2. name 变量设置监视后,接下来请逐步执行代码,以查看 name 变量值在每次 for 循环迭代中的变化。

    与其他变量窗口不同,“监视”窗口始终显示你正在监视的变量。 超出范围的变量显示为不可用。

有关“监视”窗口的详细信息,请参阅使用“监视”窗口监视变量

检查调用堆栈

  1. 当代码执行在 For 循环中暂停时,选择“调用堆栈”窗口,该窗口默认会在右下窗格中打开

    如果已关闭,请在代码执行处于暂停状态的情况下,依次选择“调试”>“Windows”>“调用堆栈”,在调试器中将其打开

  2. 按 F11 几次,直至看到调试器在 SendMessage 方法中暂停。 查看“调用堆栈”窗口 。

    Screenshot showing the Visual Studio Call Stack window with a SendMessage method call highlighted in the top line.

    “调用堆栈”窗口显示方法和函数被调用的顺序 。 最上面一行显示当前函数(此应用中的 SendMessage 方法)。 第二行显示 SendMessage 是从 Main 方法调用的,依此类推。

    注意

    “调用堆栈”窗口类似于某些 IDE(如 Eclipse)中的调试透视图 。

    调用堆栈是检查和理解应用执行流的好方法。

    可双击代码行来查看相应的源代码,这还会更改调试器正在检查的当前范围。 此操作不会使调试器前进。

    还可使用“调用堆栈”窗口中的右键单击菜单执行其他操作 。 例如,你可将断点插入到指定的函数中,使用“运行到光标处”推进调试器,然后检查源代码 。 有关详细信息,请参阅如何:检查调用堆栈

  1. 当代码执行在 For 循环中暂停时,选择“调用堆栈”窗口,该窗口默认会在右下窗格中打开

    如果已关闭,请在代码执行处于暂停状态的情况下,依次选择“调试”>“Windows”>“调用堆栈”,在调试器中将其打开

  2. 按 F11 几次,直至看到调试器在 SendMessage 方法中暂停。 查看“调用堆栈”窗口 。

    Screenshot showing the Visual Studio Call Stack window with a SendMessage method call highlighted in the top line.

    “调用堆栈”窗口显示方法和函数被调用的顺序 。 最上面一行显示当前函数(此应用中的 SendMessage 方法)。 第二行显示 SendMessage 是从 Main 方法调用的,依此类推。

    注意

    “调用堆栈”窗口类似于某些 IDE(如 Eclipse)中的调试透视图 。

    调用堆栈是检查和理解应用执行流的好方法。

    可双击代码行来查看相应的源代码,这还会更改调试器正在检查的当前范围。 此操作不会使调试器前进。

    还可使用“调用堆栈”窗口中的右键单击菜单执行其他操作 。 例如,你可将断点插入到指定的函数中,使用“运行到光标处”推进调试器,然后检查源代码 。 有关详细信息,请参阅如何:检查调用堆栈

更改执行流

  1. 按两次 F11 以运行 Console.WriteLine 方法 。

  2. 当调试器在 SendMessage 方法调用中暂停时,使用鼠标抓取黄色箭头或执行指针(在左边距中),然后在 Console.WriteLine 语句中将指针向上拖动一行。

  3. 按下 F11 。

    调试器将重新运行 Console.WriteLine 方法(你会在控制台窗口输出中看到此操作)。

    通过更改执行流,你可以进行测试不同代码执行路径或重新运行代码等操作,而无需重启调试器。

    警告

    通常你需要小心使用此功能,工具提示中会出现警告。 此外,还可能会看到其他警告。 移动指针无法将应用程序还原到更早的应用状态。

  4. 按 F5 继续运行应用 。

    恭喜你完成本教程!

后续步骤

在本教程中,你已了解了如何启动调试器、逐步执行代码以及检查变量。 你可能想要大致了解调试器功能并获取指向详细信息的链接。