Skip to content
On this page

如何调试程序

csharp
using System;

class ArrayExample
{
    static void Main()
    {
        char[] letters = { 'f', 'r', 'e', 'd', ' ', 's', 'm', 'i', 't', 'h'};
        string name = "";
        int[] a = new int[10];
        for (int i = 0; i < letters.Length; i++)
        {
            name += letters[i];
            a[i] = i + 1;
            SendMessage(name, a[i]);
        }
        Console.ReadKey();
    }

    static void SendMessage(string name, int msg)
    {
        Console.WriteLine("Hello, " + name + "! Count to " + msg);
    }
}

启动调试器

此处我们主要使用的是键盘快捷方式,因为这样可以快速执行调试器命令。等效的命令(例如工具栏或菜单命令)也会注明。

  1. 若要启动调试器,请按 F5,或者在“标准”工具栏中选择“调试目标”按钮,或者在“调试”工具栏中选择“开始调试”按钮,或者从菜单栏中选择“调试”>“开始调试”。

    Visual Studio 2022 的“标准”工具栏中“调试目标”按钮的屏幕截图

    按 F5 会启动应用,并且调试器会附加到应用进程。由于我们尚未执行任何特殊操作来检查代码,因此应用将一直运行到完成为止,并且你会看到控制台输出。

    cmd
    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,或者在“调试”工具栏中选择“停止调试”按钮,或者从菜单栏中选择“调试”>“停止调试”。

    Visual Studio 2022 的“调试”工具栏中“停止调试”按钮的屏幕截图

  3. 在控制台窗口中,按任意键关闭控制台窗口。

设置断点并启动调试器

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

    name += letters[i];

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

    Visual Studio 2022 中的断点的屏幕截图

    断点是执行可靠调试所不可或缺的一项功能。你可以设置断点,以便 Visual Studio 在你设置的断点处暂停正在运行的代码,这样你就可以查看变量值或内存行为,或者确定代码的分支是否已运行。

  2. 若要开始调试,请按 F5,或者在“标准”工具栏中选择“调试目标”按钮,或者在“调试”工具栏中选择“开始调试”按钮,或者从菜单栏中选择“调试”>“开始调试” 。应用随即启动,调试器将运行到你设置了断点的代码行。

    显示 Visual Studio 2022 代码编辑器中的断点的屏幕截图,代码执行已在断点处暂停

    黄色箭头指向调试器暂停时所在的语句。应用执行将在同一位置暂停,此处的语句尚未执行。

    当应用未运行时,按 F5 会启动调试器。调试器将持续运行该应用,直至到达第一个断点。如果应用在某个断点处暂停,则按 F5 会继续运行该应用,直至到达下一个断点。

    如果你知道自己要详细检查的代码行或代码段,则断点功能非常有用。有关可设置的各种断点(例如条件断点)的详细信息,请参阅使用断点

使用数据提示浏览代码并检查数据

  1. 暂停于 name += letters[i] 语句处时,将鼠标悬停在 letters 变量上以查看显示数组大小和元素类型 char[10] 的数据提示。

    备注

    调试器最有用的功能之一是能够检查变量。通常,在尝试调试某个问题时,你会试图确定变量是否具有你期望它们在特定时间具有的值。查看数据提示是进行这种检查的好办法。

  2. 展开 letters 变量以查看其所有数组元素以及这些元素的值。

    Visual Studio 2022 中调试器数据提示的屏幕截图,其中显示了“letters”数组变量的元素值

  3. 将鼠标悬停在 name 变量上以查看其当前值(一个空字符串)。

  4. 若要使调试器前进到下一条语句,请按 F10,或者在“调试”工具栏中选择“单步跳过”按钮,或者从菜单栏中选择“调试”>“单步跳过” 。再按 F10 两次以跳过 SendMessage 方法调用。

    按 F10 会使调试器前进,而不会单步执行函数或方法,不过,其代码仍会执行。这样,就跳过了调试我们暂时不需要关注的 SendMessage 方法中的代码。

  5. 若要迭代 for 循环几次,请反复按 F10。在每次循环迭代期间,请在断点处暂停,然后将鼠标悬停在 name 变量上以在数据提示中检查其值。

    Visual Studio 2022 中调试器数据提示的屏幕截图,其中显示了“name”变量的字符串值

    变量的值随 for 循环的每次迭代而更改,显示的值依次为 ffrfre,依此类推。若要使调试器在循环中更快前进,请按 F5,这样就会前进到断点而不是下一条语句。

  6. Main 方法的 for 循环中暂停时,按 F11,或者从“调试”工具栏中选择“单步执行”按钮,或者从菜单栏中选择“调试”>“单步执行”,直至到达 SendMessage 方法调用。

    应在此代码行处暂停调试器:

    SendMessage(name, a[i]);

  7. 若要单步执行 SendMessage 方法,请再次按 F11。

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

    显示“SendMessage”方法中的调试器执行指针的屏幕截图

    按 F11 可帮助你更深入地检查代码的执行流。若要单步执行方法调用中的方法,请按 F11。默认情况下,调试器将跳过非用户方法的单步执行。若要了解如何调试非用户代码,请参阅仅我的代码

    调试完 SendMessage 方法后,可以返回到 main 方法的 for 循环。

  8. 若要退出 SendMessage 方法,请按 Shift+F11,或者在“调试”工具栏中选择“单步跳出”按钮,或者从菜单栏中选择“调试”>“单步跳出”。

    “单步跳出”将恢复应用执行并使调试器前进,直到当前方法或函数返回。

    你将在 Main 方法的 for 循环中再次看到黄色指针,该指针暂停在 SendMessage 方法调用处。有关在代码中进行移动的不同方法的详细信息,请参阅浏览调试器中的代码

使用“运行时单击”导航代码

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

  2. 在代码编辑器中,将鼠标悬停在 SendMessage 方法中的 Console.WriteLine 方法调用上,直到左侧出现“运行到单击处”按钮。按钮的工具提示显示“将执行运行到此处”。

    显示 Visual Studio 2022 中“运行到单击处”按钮的屏幕截图

  3. 选择“运行到单击处”按钮。或者,将光标置于 Console.WriteLine 语句上,然后按 Ctrl+F10。或者,右键单击 Console.WriteLine 方法调用,然后从上下文菜单中选择“运行到光标处”。

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

    使用“运行到单击处”按钮类似于设置临时断点,在已打开的文件的应用代码可见区域中,可以快速方便地使用这种方法。

快速重启应用

若要在调试器中从头开始重新运行应用,请按 Ctrl+Shift+F5,或者在“调试”工具栏中选择“重启”按钮,或者从菜单栏中选择“调试”>“重启”。

Visual Studio 2022 的“调试”工具栏中“重启”按钮的屏幕截图

“重启”将通过一个步骤停止调试器并重启调试器。调试器重启时,将运行到第一个断点(先前在 for 循环中设置的断点),然后暂停。

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

在调试时,“自动变量”和“局部变量”窗口会显示变量值。这两个窗口仅在调试会话期间才会显示。 “自动变量”窗口显示调试器所在的当前行和上一行中使用的变量。 “局部变量”窗口显示在局部范围内定义的变量,通常是当前函数或方法。

  1. 在调试器处于暂停状态时,查看代码编辑器底部的“自动变量”窗口。

    如果“自动变量”窗口已关闭,请按下 Ctrl+D 和 A,或者从菜单栏中选择“调试”>“窗口”>“自动变量”。

  2. 在调试器仍处于暂停状态的情况下,在“自动变量”窗口旁边的选项卡中查看“局部变量”窗口。

    如果“局部变量”窗口已关闭,请按下 Ctrl+D 和 L,或者从菜单栏中选择“调试”>“窗口”>“局部变量”。

  3. 在“局部变量”窗口中,展开 letters 变量以查看其数组元素以及这些元素的值。

    Visual Studio 2022 中“局部变量”窗口的屏幕截图,其中的“letters”数组变量已展开

有关“自动变量”和“局部变量”窗口的详细信息,请参阅在“自动变量”和“局部变量”窗口中检查变量

设置监视

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

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

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

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

    与其他变量窗口不同,“监视”窗口始终显示你正在监视的变量,不过,如果这些变量超出范围,则它们会灰显。

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

检查调用堆栈

“调用堆栈”显示方法和函数的调用顺序,可帮助你了解应用的执行流。

  1. 当调试器在 for 循环中处于暂停状态时,查看“调用堆栈”窗口,该窗口默认会在代码编辑器的右下窗格中打开。

    如果“调用堆栈”窗口已关闭,请按下 Ctrl+D 和 C,或者从菜单栏中选择“调试”>“窗口”>“调用堆栈”。

    在“调用堆栈”窗口中,你将在当前 Main 方法处看到黄色指针。

  2. 按 F11 几次,直至看到调试器在 SendMessage 方法中暂停。

    “调用堆栈”窗口的第一行显示当前函数,即 SendMessage 方法。第二行显示从 Main 方法调用的 SendMessage 方法。

    Visual Studio 2022 中“调用堆栈”窗口的屏幕截图

    备注

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

    在“调用堆栈”窗口中,可以双击代码行转到相应的源代码,这会更改调试器正在检查的当前范围。此操作不会使调试器前进。

    还可使用“调用堆栈”窗口中的右键单击菜单执行其他操作。例如,可将断点插入到指定的函数中、使用“运行到光标处”使调试器前进,或转到源代码。

有关“调用堆栈”的详细信息,请参阅如何:检查调用堆栈

更改执行流

在调试时,可以移动执行指针以更改应用流。

  1. 当调试器暂停于 for 循环中的 SendMessage 方法调用处时,按 F11 三次以单步执行 SendMessage 方法,并在执行该方法后跳过 Console.WriteLine 方法。

    现在,调试器已暂停于 SendMessage 方法的最后一个右大括号处。

  2. 使用鼠标抓取黄色箭头或执行指针(在左边缘中),然后将指针向上拖动一行。

    调试器现在回到了 Console.WriteLine 语句。

  3. 按 F11。

    调试器重新运行 Console.WriteLine 方法,你将在控制台窗口输出中看到重复的行。

  4. 按 F5 继续运行应用。

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

警告

请慎用此功能。你将在执行指针的工具提示中看到一条警告,其中指出可能会出现意外的后果。此外,还可能会看到其他警告。移动执行指针无法将应用程序还原到以前的状态。

有关更改执行流的详细信息,请参阅移动指针以更改执行流

更多阅读