当前位置: 首页 > news >正文

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,在开始窗口选择 创建新项目
    显示如何在 Visual Studio“开始”窗口中选择“创建新项目”选项的屏幕截图。

  2. 语言筛选为 C++,平台为 Windows,搜索并选择 控制台应用 模板
    显示如何在 Visual Studio 2022“开始”窗口中搜索并选择控制台应用模板的屏幕截图。

  3. 项目名称设为 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 切换
显示调试器在 Visual Studio 中设置的断点处暂停的屏幕截图。

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

3.3 代码单步执行

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

显示调试器工具栏中的步骤命令的屏幕截图。

3.4 快速导航

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

四、变量与内存检查

4.1 数据提示

调试时悬停变量名,自动显示当前值
动画,演示如何检查调试器中变量的属性和值。

4.2 调试窗口

  • 自动窗口:显示当前行相关变量(调试 > 窗口 > 自动窗口)
  • 局部变量:显示当前作用域变量
    显示如何在 Visual Studio 2022 的“局部变量”窗口中检查变量和值的屏幕截图。

4.3 监视变量

右键变量 > 添加监视,在监视窗口跟踪特定变量
此屏幕截图展示了 Visual Studio 的“监视”窗口,其中正显示着 name 变量的值。

五、高级调试功能

5.1 调用堆栈分析

查看函数调用顺序:调试 > 窗口 > 调用堆栈
显示如何在 Visual Studio 2022 中检查调用堆栈的屏幕截图。

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. 内存断点:监视内存地址变化(高级调试功能)

参考资料:Visual Studio 2022 调试器官方文档

7 高级调试技术

7.1 远程调试

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

7.1.1 安装远程工具

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

7.1.2 配置远程调试器
  1. 在远程设备上启动远程调试器,首次运行会显示配置向导:
    远程调试器配置向导
  2. 选择网络类型(域/工作组/专用网络),完成防火墙配置。
  3. 启动后记录服务器名称和端口(格式:服务器名:端口)。
7.1.3 项目配置
  1. 在Visual Studio中右键项目→属性调试,设置:
    • 要启动的调试器:远程Windows调试器
    • 远程服务器名称服务器名:端口(如MySurface:4026
    • 部署目录:远程设备上的路径(如C:\remotetemp
      远程调试项目设置
  2. 勾选部署选项,确保文件自动同步到远程设备。
7.1.4 符号配置
  • 优先使用本地符号(性能更佳),路径:工具→选项→调试→符号
  • 如需远程符号,添加Windows文件共享路径(如\\服务器名\符号目录

7.2 多线程调试

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

7.2.1 线程窗口与并行堆栈
  • 线程窗口(调试→窗口→线程):显示所有线程ID、状态和调用堆栈。可冻结/解冻线程、切换调试上下文。
  • 并行堆栈窗口:可视化展示多线程调用关系,相同堆栈自动分组:
    并行堆栈线程视图
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. 在并行堆栈窗口观察阻塞线程:
    死锁线程视图
  3. 使用Copilot生成线程摘要:
    Copilot线程分析

修复方案:统一锁顺序:

// 所有线程均先锁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为空的原因:
    Copilot内联聊天
  2. 异常发生时点击询问Copilot按钮,自动生成修复建议:
    异常处理建议
7.3.2 条件断点建议

设置断点时,Copilot自动分析代码并推荐条件:
条件断点建议
示例:在循环中添加条件item == "Fred",仅当参数为"Fred"时中断。

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

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

7.4.1 配置步骤
  1. 项目属性→高级使用C++动态调试→设为"是":
    动态调试配置
  2. 禁用冲突选项:
    • 关闭整个程序优化(/GL)
    • 禁用COMDAT折叠(/OPT:NOICF)
7.4.2 工作原理
  • 编译时生成优化二进制未优化二进制*.alt.exe
  • 命中断点或单步执行时,自动加载未优化版本,调试体验与非优化代码一致
  • 未调试区域保持优化,兼顾性能与调试效率
7.4.3 应用场景
  • 游戏开发:Unreal Engine 5.6+支持,通过WindowsPlatform.bDynamicDebugging = true启用
  • 高性能应用:优化构建中调试关键函数,无需全量禁用优化
http://www.dtcms.com/a/406127.html

相关文章:

  • 【JAVA】从入门到放弃-01-HelloWorld
  • 玳瑁的嵌入式日记---0925(ARM--时钟)
  • 《代码的“言外之意”:从词源学透彻理解编程》字符的“双重生活”:从Escape到Raw
  • 【Spark+Hive+hadoop】人类健康生活方式数据分析
  • K8S部署的rook-ceph下线osd流程
  • 建站历史查询如何做网站推广页面
  • maven使用非明文密码配置
  • 做网站后期维护工资贴吧wordpress ad widget
  • Reactor 模式:高并发网络编程的事件驱动利器
  • 无人机数传模块技术要点概述
  • Telegram机器人Token和ChatID获取教程
  • Deepoc具身智能模型:为传统电厂巡检机器人注入“灵魂”与“智慧”
  • 中医智慧+AI科技,七彩喜机器人让健康养护“智”在必得
  • Ubuntu 中 Bash / Zsh / Ash / Dash 的使用与区别(含对比图)
  • leetcode 814 二叉树剪枝
  • 【Redis】热Key/大Key问题、缓存击穿、缓存穿透、缓存雪崩、缓存与数据库一致性问题
  • 大模型剪枝系列——基于权重大小剪枝
  • 制作网站的模板深圳网站改版公司
  • 【Linux基础知识系列:第一百四十篇】理解SELinux与系统安全
  • dbswitch:一款免费开源、功能强大的异构数据库迁移同步工具
  • python+uniapp基于微信小程序美食点餐系统
  • Go语言100个实战案例-进阶与部署篇:使用Go打包生成可执行文件
  • 【Golang】--- 函数深度解析
  • 后端进阶-性能优化
  • 吉林做网站wordpress创建登录页
  • 【C++篇】C++11:从列表初始化到移动语义
  • WPS清除图片段落布局脚本
  • Excel学生成绩表,如何生成成绩分析报告?
  • 面试_场景方案设计
  • 【AI - nlp】Tokenizer简介及常见编码方式