讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

updream

一键生成高质量推广成片

Laper
Laper

剧本策划到成片协作

立刻MV
立刻MV

低成本歌曲 MV、视频生成

c++ visual studio调试技巧 如何在vs中高效debug

落敏酱_3167

落敏酱_3167

发布时间:2026-03-18 19:06:31

|

499人浏览过

|

来源于php中文网

原创

VS断点能力远超行号点击,支持数据断点、模块加载断点等;断点失效多因PDB不匹配、优化开启或内联函数;Watch需手动展开或用.get()查真实值;Immediate窗口用?命令查值、dc查内存、~切换线程;OutputDebugStringA比MessageBox更高效安全。

c++ visual studio调试技巧 如何在vs中高效debug

断点不是只能打在代码行上

VS 的断点能力远超“点击行号左侧”,很多调试卡住是因为只用了最基础的设置。比如想在某个变量被修改时停下,数据断点比反复加条件断点快得多;又比如调试 Release 版本或第三方 DLL 时,模块加载断点(Debug > New Breakpoint > Break at Function…,输入 kernel32!LoadLibraryW 这类)能抢在符号未加载前就介入。

常见错误现象:断点显示为空心圆+感叹号,提示“断点不会被命中”,大概率是:当前源码与 PDB 不匹配、优化开启(/O2)、或断点打在了内联函数/模板实例化体内部。

  • Release 模式下调试,必须关掉 /GL(全程序优化),且确保生成 .pdb 并路径正确(检查 Debug > Options > Debugging > Symbols)
  • 对 std::vector 或 std::string 等 STL 容器,直接在 Watch 窗口输 v._Mypair._Myval2._Myfirst 这类内部字段会失败——用 auto expander(VS 自带的 NatVis 支持)更稳,或改用 Debug > Windows > Memory > Memory 1 查原始地址
  • 多线程环境下,条件断点慎用复杂表达式(如调用函数、访问全局容器),可能引发死锁或状态污染

Watch 和 Autos 窗口不是“看变量”那么简单

VS 的 Watch 窗口支持表达式求值,但默认行为常让人误判变量真实状态。比如 std::shared_ptr<t></t> 在 Watch 里显示为 0x0000000000000000,不代表空指针——它可能只是没展开,点旁边小箭头或手动输 p.get() 才见真值。

使用场景:调试崩溃后附加进程(Debug > Attach to Process),符号未加载完时,Autos 窗口可能显示 <error reading characters></error>,这时别急着重启,先确认模块是否已加载(Debug > Windows > Modules),再右键对应 DLL → Load Symbols。

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • Watch 中输入 (int*)ptr + 5 可以查看 ptr 后第 5 个 int,但若 ptr 是 void*,必须先强制转成具体类型,否则 VS 按字节偏移算,结果错位
  • QuickWatch(Shift+F9)支持临时修改变量值,比如输 i = 0 回车,能跳过某次循环——但仅限于当前栈帧有效,函数返回后不持久
  • 在 Locals 窗口右键变量 → Pin to Top,比反复滚动找更省时间,尤其嵌套深的对象

调试器命令窗口(Immediate / Command)救急很实在

当鼠标点不到、窗口刷太快、或者想批量操作时,Debug > Windows > Immediate 是最被低估的工具。它不只是 C++ 表达式计算器,还能执行调试器命令,比如快速 dump 内存、切换线程、甚至重载模块。

常见错误现象:在 Immediate 窗口输 print i 报错——C++ 调试器不认 print,得用 ? i(问号开头);又或者输 sizeof(my_struct) 返回 1,其实是没加括号,正确写法是 ? sizeof(my_struct)。

  • 查内存布局:? (char*)&obj + 8 查 obj 第二个成员地址;dc 0x00007ff6a1234567 L4(dc 是调试器命令)可 hex dump 4 个 DWORD
  • 切线程:~2s 切到 ID 为 2 的线程,~* kb 查所有线程调用栈(kb = kernel stack backtrace)
  • 重载符号:.reload /f mylib.dll 强制重读符号,比关掉再开快得多

输出窗口和调试事件日志比 MessageBox 更准

很多人习惯插 MessageBoxA 或 std::cout 来“看流程”,但在调试器里,这些反而干扰节奏、掩盖真实时序,甚至引发死锁(GUI 线程阻塞)。VS 的 Output 窗口配合 OutputDebugStringA,才是轻量、非侵入、可过滤的日志通道。

性能影响:频繁调用 OutputDebugStringA 在远程调试或慢速符号服务器下会明显拖慢执行,但本地调试基本无感;而 std::cout 触发流缓冲刷新,在多线程中还可能隐式加锁。

  • 在代码里写 OutputDebugStringA("enter func_x\n");,然后在 Output 窗口右上角点漏斗图标,勾选 Debug,就能干净看到日志,不弹窗不阻塞
  • 用 __debugbreak() 替代 assert(0),它生成 INT 3 指令,调试器直接捕获,Release 下也可用(只要没 strip 调试信息)
  • 如果 Output 窗口没反应,检查项目属性 → Configuration Properties > General > Debug Information Format 是否设为 Program Database (/Zi),且链接器开了 /DEBUG

真正难的不是知道这些功能,而是记得在进入复杂逻辑前,先开一个 Memory 窗口盯着关键地址、把 Modules 窗口拖出来防符号丢失、还有——别信 Watch 里第一眼看到的值,多点一下小箭头,或手敲个 .addr 看它到底指向哪。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SoundView
SoundView Hot

SoundView是一款面向跨境电商的视频翻译、配音和本地化 AI 创作平台。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

3480

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

269

2026.02.03

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7519

2023.08.02

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1869

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1231

2024.06.27

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1069

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3520

2023.10.25

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

3320

2025.10.15

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn