快速入门:使用 Visual Studio 调试器调试 C++

Visual Studio 调试器提供了许多强大的功能以帮助调试应用。 本主题提供了一种快速了解部分基本功能的方法。

创建新项目

  1. 打开 Visual Studio 并创建一个项目。

    按 Esc 关闭启动窗口 。 键入 Ctrl+Q 以打开搜索框,键入“c++”,选择“模板”,然后选择“创建新的控制台应用项目”。 在出现的对话框中,选择“创建” 。

    如果没有看到“Windows 控制台应用程序”项目模板,请转到“工具”>“获取工具和功能...”,这会打开 Visual Studio 安装程序。 Visual Studio 安装程序启动。 选择“使用 C++ 的桌面开发”工作负载,然后选择“修改”按钮 。

    Visual Studio 随即创建项目。

  2. 在 MyDbgApp.cpp 中,将以下代码

    int main()
    {
        return 0;
    }
    

    替换为此代码(请勿删除 #include "stdafx.h"):

    #include <list>
    #include <iostream>
    
    using namespace std;
    
    void doWork()
    {
        list <int> c1;
    
        c1.push_back(10);
        c1.push_back(20);
    
        const list <int> c2 = c1;
        const int &i = c2.front();
        const int &j = c2.front();
        cout << "The first element is " << i << endl;
        cout << "The second element is " << j << endl;
    
    }
    
    int main()
    {
        doWork();
    }
    

设置断点

断点是一个标记,指示 Visual Studio 应在哪个位置挂起运行的代码,以查看变量的值或内存的行为,或确定代码的分支是否运行。 它是调试中最基本的功能。

  1. 若要设置断点,请单击 doWork 函数调用左侧的滚动条槽(或选择代码行,然后按 F9)

    Set a breakpoint

  2. 现在,按 F5(或选择“调试”>“开始调试”)。

    Hit a breakpoint

    调试器会在设置断点的位置暂停。 调试器和应用程序在该处暂停的语句由黄色箭头指示。 具有 doWork 函数调用的行尚未执行。

    提示

    如果循环或递归中存在断点,或者如果有许多频繁单步执行的断点,请使用条件断点以确保代码仅在满足特定条件时挂起。 条件断点可以节省时间,还可以更容易地调试难以重现的问题。

    当尝试调试 C++ 中与内存相关的故障时,还可以使用断点来检查地址值(查找 NULL)和引用计数。

有不同的命令来指示调试器继续。 我们将演示自 Visual Studio 2017 开始新增的一个有用的代码导航命令。

在断点处暂停时,将鼠标悬停在 c1.push_back(20) 语句上,直至绿色的“运行到单击处”按钮(Run to Click)出现,然后按“运行到单击处”按钮。

Run to click

应用将继续执行,调用 doWork,并于你在其中单击按钮的代码行上暂停。

用于单步执行代码的常见键盘命令包括 F10 和 F11。 如需获取更多详尽介绍,请参阅初探调试器

检查数据提示中的变量

  1. 在当前代码行中(由黄色执行指针标记),将鼠标悬停在 c1 对象上以显示数据提示。

    View a datatip

    数据提示显示 c1 变量的当前值且允许检查其属性。 调试时,如果出现意外值,则表示在前一代码行或调用的代码行上出现 bug。

  2. 展开数据提示以查看 c1 对象的当前属性值。

  3. 如果要固定数据提示,以便在执行代码时可以继续查看 c1 的值,请单击小图钉图标。 (可将固定的数据提示移动到方便的位置。)

编辑代码并继续调试

如果在调试会话期间发现一个要在代码中测试的更改,则也可以执行此操作。

  1. 单击 c2.front() 的第二个实例且将 c2.front() 更改为 c2.back()

  2. 多次按 F10(或“调试”>“单步跳过”),向前移动调试器并执行已编辑的代码。

    Edit and continue

    F10 一次使调试器前进一个语句,但是是跳过函数而不是单步执行它们(跳过的代码仍然执行)。

有关使用编辑并继续以及功能限制的详细信息,请参阅编辑并继续

后续步骤

在本教程中,你已了解了如何启动调试器、逐步执行代码以及检查变量。 你可能会希望更深入地了解调试器功能以及查看指向更多信息的链接。