教程:了解如何使用 Visual Studio 调试 Visual Basic 代码

本文介绍分步演练中 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 控制台应用程序项目。 在添加任何内容之前,项目类型附带所需的所有模板文件!

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

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

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

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

    屏幕截图显示了“创建新项目”窗口,其中搜索框中输入了“控制台”,“语言”和“平台”筛选器分别选择了“Visual Basic”和“Windows”。已选择控制台应用程序项目模板。

    注释

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

  2. “配置新项目”窗口中,在“项目名称”框中输入“开始调试”。 然后选择下一步

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

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

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

    在搜索框中输入“控制台”,显示“创建新项目”窗口的屏幕截图,其中语言和平台筛选器已选择“Visual Basic”和“Windows”。控制台应用程序项目模板已被选择。

    注释

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

  2. “配置新项目”窗口中,在“项目名称”框中输入“开始调试”。 然后选择下一步

  3. “其他信息”窗口中,确保在“框架”下拉菜单中选择 .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

启动调试器!

  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调试 > 开始调试)或在调试工具栏中选择绿色 的“开始调试 ”按钮。

    显示“调试工具栏”的屏幕截图,其中突出显示了绿色的“开始调试”按钮。

    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. For 函数的 Main 循环中,通过单击下面代码行左侧边距来设置断点:

    name += letters(i)

    此时会显示一个红色圆圈 ,可在其中设置断点。

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

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

    显示 Visual Studio 代码编辑器窗口的屏幕截图,其中执行在断点处停止。

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

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

    当您知道代码行或要详细检查的代码部分时,断点是一项有用的功能。 有关可以设置的不同类型的断点的信息,例如条件断点,请参阅 “使用断点”。

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

    name += letters(i)

    此时会显示一个红色圆圈,可在其中设置断点。

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

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

    显示 Visual Studio Code 编辑器窗口的屏幕截图,其中执行在断点处停止。

    黄色箭头表示调试器暂停的语句,该语句也会在同一点暂停应用执行(尚未执行此语句)。

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

    当您知道代码行或要详细检查的代码部分时,断点是一项有用的功能。 有关可以设置的不同类型的断点的信息,例如条件断点,请参阅 “使用断点”。

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

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

    F11 两次后,您应该看到这行代码:

    SendMessage(name, a(i))

  2. 再按 F11 一次即可单步进入 SendMessage 方法。

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

    显示在 Visual Studio 代码编辑器中调试会话的屏幕截图,其中在进入“SendMessage”方法后执行暂停。

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

    假设你已完成检查SendMessage方法,并且想要退出该方法,但保持在调试器中。 可以使用 “单步出” 命令执行此操作。

  3. Shift + F11 (或 调试 > 退出)。

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

    应返回到For循环中的Main方法,并在调用SendMessage方法时暂停。

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

  5. 在方法调用中暂停代码执行时,请按 F10 (或选择 “调试 > 单步执行”)一次。

    显示 Visual Studio 代码编辑器中调试会话的屏幕截图,其中在单步执行“SendMessage”方法调用后,执行暂停。

    请注意这一次,调试器这次没有进入 SendMessage 方法。 F10 在不单步执行应用代码中的函数或方法的情况下推进调试器(代码仍在执行)。 通过在方法调用上按 F10(而不是 F11),我们跳过了实现代码 SendMessage(也许我们现在对此不感兴趣)。 有关在代码中进行移动的不同方法的详细信息,请参阅浏览调试器中的代码

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

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

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

    SendMessage(name, a(i))

  2. 再按 F11 一次即可进入 SendMessage 方法。

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

    显示 Visual Studio Code 编辑器中调试会话的屏幕截图,其中执行在进入“SendMessage”方法后被暂停。

    F11单步跳入 命令,逐条语句推进应用程序的执行。 F11 是最详细地检查执行流的好方法。 (为了更快地通过代码移动,我们还会显示一些其他选项。默认情况下,调试器跳过非用户代码(如果需要更多详细信息,请参阅 “仅我的代码”)。

    假设你已完成检查SendMessage方法,并且想要离开该方法,但仍保留在调试器中。 可以使用 “单步出” 命令执行此操作。

  3. Shift + F11 (或 调试 > 退出)。

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

    你应该回到Main方法中的For循环,并在SendMessage方法调用时暂停。

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

  5. 在方法调用中暂停代码执行时,请按 F10 (或选择 “调试 > 单步执行”)一次。

    显示 Visual Studio Code 编辑器中的调试会话的屏幕截图,在执行“SendMessage”方法调用后暂停执行。

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

  1. F5 再次转到断点。

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

    屏幕截图显示代码编辑器窗口左侧的“Run to Click”按钮,并高亮显示了工具提示。

    注释

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

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

    调试器跳转到Console.WriteLine方法。

    使用此按钮类似于设置临时断点。 快速跳转到单击 功能可以帮助在应用代码的可见区域中快速导航(可以在任何打开的文件中选择)。

  1. F5 再次转到断点。

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

    显示代码编辑器窗口左侧突出显示工具提示的“运行到单击”按钮的屏幕截图。

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

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

    使用此按钮类似于设置临时断点。 Run to Click 功能方便用户在应用代码的可见区域中快速导航(可以在任何打开的文件中使用)。

快速重启应用

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

重启时,它可以节省时间,而不是停止应用并重启调试器。 调试器在执行代码命中的第一个断点处暂停。

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

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

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

使用数据提示检查变量

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

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

  2. 接下来,将鼠标悬停在 name 变量上,可以看到其当前值(一个空字符串)。

  3. F5 (或 调试>继续)多次循环访问 For 循环,在断点再次暂停,并每次将鼠标悬停在 name 变量上以检查其值。

    显示调试执行在代码编辑器中停止的屏幕截图,其中突出显示了“name”变量,并显示值为“fre”的数据提示。

    变量的值随 For 循环的每个迭代而更改,其中显示了 ffrfre等值。

    在调试时,你常常希望能够快速检查变量的属性值,以确认它们是否存储了预期的值,而数据提示是一个很好的工具。

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

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

  2. 接下来,将鼠标悬停在 name 变量上,可以看到其当前值(一个空字符串)。

  3. F5 (或 调试>继续)多次循环访问 For 循环,在断点再次暂停,并每次将鼠标悬停在 name 变量上以检查其值。

    显示代码编辑器中已停止调试执行的屏幕截图,其中突出显示了名称变量,并显示值的数据提示。

    变量的值随 For 循环的每个迭代而更改,其中显示了 ffrfre等值。

    通常,在调试时,你希望快速检查变量的属性值,以确认它们是否存储了你期望的值,而使用数据提示工具是个很好的方法。

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

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

    如果它已关闭,在调试器中暂停代码执行时,通过选择调试>Windows>Autos来打开它。

    “自动” 窗口中,可以看到变量及其当前值。 自动窗口显示当前行或上一行中使用的所有变量(请查看文档以了解特定编程语言的行为)。

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

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

    显示“局部变量”窗口的屏幕截图,其中展开了“letters”变量以显示它所包含的元素的值和类型。

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

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

    如果它已关闭,则通过选择“调试>>”在调试器中暂停代码执行时打开它。

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

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

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

    显示“局部变量”窗口的屏幕截图,其中展开了“letters”变量以显示它所包含的元素的值和类型。

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

设置监视

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

监视 ”窗口将在代码编辑器底部打开。 您可以使用 监视 窗口来指定您希望关注的变量或表达式。

现在,您已经在 name 变量上设置了监视,可以在调试器中逐步执行时看到其值的变化。 与其他变量窗口不同,“监视窗口”始终显示你所监视的变量(当变量超出作用域时,它们会灰显)。

可以将变量或表达式添加到“监视”窗口,以在单步执行代码时监控这些变量或表达式。

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

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

  2. 现在,你已对name变量设置了监视,请逐步执行代码,以查看name变量在每次for循环迭代时值更改。

    与其他变量窗口不同,监视 窗口始终显示正在监视的变量。 作用域外变量显示为不可用。

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

检查调用堆栈

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

    如果它已关闭,请在调试器中暂停代码执行时打开它,方法是选择 “调试>Windows>调用堆栈”。

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

    显示 Visual Studio 调用堆栈窗口的屏幕截图,顶部行中突出显示了 SendMessage 方法调用。

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

    注释

    调用堆栈 窗口类似于 Eclipse 等 IDE 中的“调试”透视。

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

    可以双击一行代码来查看该源代码,并更改调试器正在检查的当前范围。 此动作没有推进调试过程。

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

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

    如果它已关闭,请在调试器中暂停代码执行时打开它,方法是选择 “调试>Windows>调用堆栈”。

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

    显示 Visual Studio 调用堆栈窗口的屏幕截图,顶部行中突出显示了 SendMessage 方法调用。

    调用堆栈 窗口显示调用方法和函数的顺序。 顶部行显示当前函数(此应用中的SendMessage方法)。 第二行显示 SendMessage 是从 Main 方法调用的,以此类推。

    注释

    调用堆栈 窗口类似于 Eclipse 等 IDE 中的“调试”透视。

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

    可以双击一行代码来查看该源代码,并更改调试器正在检查的当前范围。 此操作不会推进调试器。

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

更改执行流

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

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

  3. F11

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

    通过更改执行流,可以执行诸如测试不同代码执行路径或重新运行代码之类的操作,而无需重启调试器。

    警告

    通常,需要注意此功能,并在工具提示中看到警告。 您可能还会看到其他警告。 移动指针无法将应用程序还原到以前的应用状态。

  4. F5 继续运行应用。

    祝贺你完成本教程!

后续步骤

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