WinDbg 调试 C++ 程序需生成带完整 PDB 的可执行文件,通过附加进程、启动新实例或 JIT 捕获崩溃进入调试;常用命令包括 bp 下断点、g 继续执行、k 查调用栈、dv 显示变量、dd/du/dp 查内存;分析 dump 文件时用 !analyze -v 自动诊断崩溃原因。

用 WinDbg 调试 C++ 程序,核心在于生成带调试信息的可执行文件,并用 WinDbg 加载符号、设置断点、分析崩溃或行为异常。它比 Visual Studio 自带调试器更底层,适合排查蓝屏、驱动、内存损坏、无源码的第三方模块等问题。
编译时保留完整调试信息(PDB)
VS 项目需启用调试信息生成,否则 WinDbg 无法解析变量、调用栈和源码行:
- 在项目属性 → “配置属性” → “常规” → “调试信息格式”选 “程序数据库 (/Zi)”(Debug 模式默认已开)
- → “链接器” → “调试” → “生成调试信息”设为 “是 (/DEBUG)”
- 确保 PDB 文件与 EXE/DLL 同目录,或放在 WinDbg 可识别的符号路径中(如使用 .sympath 命令)
启动调试的三种常用方式
根据场景选择合适入口:
- 附加到运行中的进程:WinDbg → File → Attach to a Process(Ctrl+Alt+A),选中目标进程(如 yourapp.exe)
- 启动新实例调试:WinDbg → File → Open Executable(Ctrl+E),指定 EXE 并可加命令行参数
- 自动捕获崩溃(Just-In-Time):注册 WinDbg 为默认 JIT 调试器(WinDbg 安装目录下运行 windbg -I),程序崩溃时自动弹出调试窗口
关键调试操作与常用命令
进入调试会话后,掌握几个基础命令就能定位多数问题:
立即学习“C++免费学习笔记(深入)”;
- bp 或 bp yourapp!wmain —— 在入口或指定函数下断点(支持模块名限定)
- g(go)—— 继续执行;gu —— 运行到当前函数返回
- k —— 查看调用栈(含符号);kb 显示参数;kn 显示帧号
- dv —— 显示当前作用域局部变量(需有 PDB 且在函数内)
- dd / du / dp —— 分别查看双字、Unicode 字符串、指针地址内容(如 du poi(esp+4) 查第一个参数字符串)
分析崩溃转储(Dump)文件
当程序意外退出,可生成 minidump 供离线分析:
- 调试中执行 .dump /ma c:\crash.dmp 保存完整内存快照
- 用 WinDbg 打开 .dmp 文件(File → Open Crash Dump),自动加载上下文
- 输入 !analyze -v —— WinDbg 最强诊断命令,自动推断崩溃原因、异常代码(如 0xC0000005 = 访问违规)、出问题的模块和偏移
- 配合 lm(list modules)确认模块基址,u(unassemble)反汇编可疑位置











