VS2022 C++调试完全指南

举报
码事漫谈 发表于 2025/09/25 22:03:57 2025/09/25
【摘要】 VS2022 C++调试完全指南 一、调试环境准备 1.1 先决条件安装Visual Studio 2022(17.12+版本)勾选"使用C++的桌面开发"工作负载若已安装VS但缺少工作负载:选择 工具 > 获取工具和功能,在安装程序中勾选 使用C++的桌面开发 并点击 修改 1.2 支持与限制✅ 支持语言:C++、C#、Visual Basic、Python等❌ 限制:F#不支持"编辑并...

VS2022 C++调试完全指南

一、调试环境准备

1.1 先决条件

  • 安装Visual Studio 2022(17.12+版本)
  • 勾选"使用C++的桌面开发"工作负载

若已安装VS但缺少工作负载:
选择 工具 > 获取工具和功能,在安装程序中勾选 使用C++的桌面开发 并点击 修改

1.2 支持与限制

支持语言:C++、C#、Visual Basic、Python等
限制

  • F#不支持"编辑并继续"
  • F#和JavaScript不支持"自动"窗口

二、创建调试项目

2.1 新建C++控制台应用

  1. 打开VS2022,在开始窗口选择 创建新项目

image.png

  1. 语言筛选为 C++,平台为 Windows,搜索并选择 控制台应用 模板

image.png

  1. 项目名称设为 get-started-debugging,点击 创建

2.2 示例代码

替换get-started-debugging.cpp内容:

#include <string>
#include <vector>
#include <iostream>

void SendMessage(const std::wstring& name, int msg)
{
    std::wcout << L"Hello, " << name << L"! Count to " << msg << std::endl;
}

int main()
{
    std::vector<wchar_t> letters = { L'f', L'r', L'e', L'd', L' ', L's', L'm', L'i', L't', L'h' };
    std::wstring name = L"";
    std::vector<int> a(10);
    std::wstring key = L"";

    for (int i = 0; i < letters.size(); i++)
    {
        name += letters[i];
        a[i] = i + 1;
        SendMessage(name, a[i]);
    }
    std::wcin >> key;
    return 0;
}

三、基本调试操作

3.1 启动与停止调试

  • 启动调试:按 F5 或点击工具栏 ▶️
  • 停止调试:按 Shift+F5 或点击工具栏 ⏹️

首次启动会直接运行程序,输出:

Hello, f! Count to 1
Hello, fr! Count to 2
...
Hello, fred smith! Count to 10

3.2 设置断点

在代码行左侧单击设置断点(红色圆圈),或按 F9 切换

image.png

断点类型:支持条件断点(右键断点设置条件)、函数断点等高级功能

3.3 代码单步执行

操作 快捷键 说明
单步执行 F11 进入函数内部
单步跳过 F10 不进入函数
单步跳出 Shift+F11 从当前函数返回

image.png

3.4 快速导航

  • 运行到单击处:调试时悬停代码行,点击 ▶️ 图标
  • 快速重启:按 Ctrl+Shift+F5 或点击 🔄 图标

四、变量与内存检查

4.1 数据提示

调试时悬停变量名,自动显示当前值

image.png

4.2 调试窗口

  • 自动窗口:显示当前行相关变量(调试 > 窗口 > 自动窗口)
  • 局部变量:显示当前作用域变量

image.png

4.3 监视变量

右键变量 > 添加监视,在监视窗口跟踪特定变量

image.png

五、高级调试功能

5.1 调用堆栈分析

查看函数调用顺序:调试 > 窗口 > 调用堆栈

image.png

5.2 更改执行流

拖动黄色执行指针可修改代码执行顺序(需谨慎使用)

5.3 命令行参数传递

  1. 在工具栏命令行参数下拉框中输入参数(如 /u
  2. 修改代码支持参数:
int main(int argc, char* argv[])
{
    bool uppercase = false;
    for (int i = 1; i < argc; ++i)
    {
        if (std::string(argv[i]) == "/u") uppercase = true;
    }
    // ... 其余代码 ...
}

六、调试技巧总结

  1. 条件断点:仅当特定条件满足时暂停(右键断点设置)
  2. 编辑并继续:调试时修改代码无需重启(部分语言支持)
  3. 异常设置:调试 > Windows > 异常设置,配置异常中断
  4. 内存断点:监视内存地址变化(高级调试功能)

7 高级调试技术

7.1 远程调试

远程调试允许在不同计算机上调试Visual Studio应用程序,适用于调试服务器应用或嵌入式设备。以下是配置步骤:

7.1.1 安装远程工具

在目标设备上下载并安装与Visual Studio版本匹配的远程工具。根据设备架构选择x86/x64/ARM64版本,例如64位系统需安装64位远程工具。

7.1.2 配置远程调试器

  1. 在远程设备上启动远程调试器,首次运行会显示配置向导:

image.png

  1. 选择网络类型(域/工作组/专用网络),完成防火墙配置。
  2. 启动后记录服务器名称和端口(格式:服务器名:端口)。

7.1.3 项目配置

  1. 在Visual Studio中右键项目→属性调试,设置:
    • 要启动的调试器:远程Windows调试器
    • 远程服务器名称服务器名:端口(如MySurface:4026
    • 部署目录:远程设备上的路径(如C:\remotetemp

image.png

  1. 勾选部署选项,确保文件自动同步到远程设备。

7.1.4 符号配置

  • 优先使用本地符号(性能更佳),路径:工具→选项→调试→符号
  • 如需远程符号,添加Windows文件共享路径(如\\服务器名\符号目录

7.2 多线程调试

多线程调试需监控线程状态、解决死锁等问题,核心工具包括线程窗口并行堆栈窗口

7.2.1 线程窗口与并行堆栈

  • 线程窗口(调试→窗口→线程):显示所有线程ID、状态和调用堆栈。可冻结/解冻线程、切换调试上下文。
  • 并行堆栈窗口:可视化展示多线程调用关系,相同堆栈自动分组:

image.png

7.2.2 死锁检测与修复

示例死锁代码(C++):

// 线程1: 先锁tree,再锁banana_bunch
std::lock_guard<std::mutex> lock1(tree);
std::lock_guard<std::mutex> lock2(banana_bunch);

// 线程2: 先锁banana_bunch,再锁tree
std::lock_guard<std::mutex> lock2(banana_bunch);
std::lock_guard<std::mutex> lock1(tree);

检测方法

  1. 调试时按Ctrl+Break暂停所有线程
  2. 在并行堆栈窗口观察阻塞线程:

image.png

  1. 使用Copilot生成线程摘要:

image.png

修复方案:统一锁顺序:

// 所有线程均先锁tree,再锁banana_bunch
std::lock_guard<std::mutex> lock1(tree);
std::lock_guard<std::mutex> lock2(banana_bunch);

7.3 AI辅助调试(GitHub Copilot)

Copilot可集成到调试流程中,提供异常分析、变量解释和断点建议。

7.3.1 内联聊天与异常处理

  1. 调试中断时右键变量/代码→询问Copilot,例如查询args为空的原因:

image.png

  1. 异常发生时点击询问Copilot按钮,自动生成修复建议:

image.png

7.3.2 条件断点建议

设置断点时,Copilot自动分析代码并推荐条件:

image.png

示例:在循环中添加条件item == "Fred",仅当参数为"Fred"时中断。

7.4 C++动态调试(预览版)

动态调试通过/dynamicdeopt编译选项,实现优化代码的"按需去优化",解决传统优化代码调试难题。

7.4.1 配置步骤

  1. 项目属性→高级使用C++动态调试→设为"是":

image.png

  1. 禁用冲突选项:
    • 关闭整个程序优化(/GL)
    • 禁用COMDAT折叠(/OPT:NOICF)

7.4.2 工作原理

  • 编译时生成优化二进制未优化二进制*.alt.exe
  • 命中断点或单步执行时,自动加载未优化版本,调试体验与非优化代码一致
  • 未调试区域保持优化,兼顾性能与调试效率

7.4.3 应用场景

  • 游戏开发:Unreal Engine 5.6+支持,通过WindowsPlatform.bDynamicDebugging = true启用
  • 高性能应用:优化构建中调试关键函数,无需全量禁用优化
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。