c++如何用WinDbg调试 c++ Windows平台调试【工具】
技术百科
尼克
发布时间:2025-12-31
浏览: 次 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),程序崩溃时自动弹出调试窗口
关键调试操作与常用命令
进入调试会话后,掌握几个基础命令就能定位多数问题:
- 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)反汇编可疑位置
# ai
# 放在
# 就能
# 几个
# 第一个
# windows
# 离线
# 三种
# app
# 设为
# 工具
# win
# go
# c++
# 指针
# 字符串
# 数据库
# visual studio
# 栈
# 作用域
# 局部变量
# 可执行文件
# 命令行参数
# nas
# 并可
# 调试器
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- php中作用域操作符能访问私有静态属性吗_访问权限
- 如何在Golang中实现RPC异步返回_Golan
- VSC怎么创建PHP项目_从零开始搭建项目的步骤【
- Win11怎么设置指纹解锁 Win11笔记本录入指
- Mac如何创建和管理多个桌面空间_Mac高效多任务
- 如何使用Golang捕获测试日志_Golang t
- Windows Defender扫描失败怎么办_安
- Win11如何连接Xbox手柄 Win11蓝牙连接
- c++怎么编写动态链接库dll_c++ __dec
- Windows系统文件被保护机制阻止怎么办_权限不
- 如何在 Go 开发中正确处理本地包导入与远程模块路
- mac怎么安装pip_MAC Python pip
- Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
- Win11时间格式怎么改成12小时制 Win11时
- 如何使用Golang实现聊天室消息存档_存储聊天记
- php下载安装包怎么选_threadsafe与nt
- Win11怎么更改鼠标指针方案_Windows11
- 新手学PHP架构总混淆概念咋办_重点梳理【教程】
- Golang如何测试HTTP中间件_Golang
- PHP主流架构怎么部署到Docker_容器化流程【
- 如何使用Golang开发基础文件下载功能_Gola
- Win10怎么关闭自动更新错误弹窗_Win10策略
- Win11怎么激活Windows10_Win11激
- Python路径拼接规范_跨平台处理说明【指导】
- Win10怎样卸载TeamViewer_Win10
- Windows笔记本无法进入睡眠模式怎么办?(电源
- Win11怎么制作U盘启动盘_Win11原版系统安
- c# 在高并发场景下,委托和接口调用的性能对比
- 如何高效获取循环末次生成的 NumPy 数组最后一
- 如何高效删除 NumPy 二维数组中所有元素相同的
- c++中如何使用虚函数实现多态_c++多态性实现原
- Win10系统怎么查看端口状态_Windows10
- PythonWeb前后端整合项目教程_FastAP
- Win11开机Logo怎么换_Win11自定义启动
- Python与OpenAI接口集成实战_生成式AI
- Windows怎样关闭锁屏广告_Windows关闭
- ACF 教程:如何正确更新嵌套在多层 Group
- c++怎么操作redis数据库_c++ hired
- 如何使用Golang template生成文本模板
- Win11怎么设置虚拟内存_Windows 11优
- 微信企业付款回调PHP怎么接收_处理企业付款异步通
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- Win11怎么关闭OneDrive同步_Win11
- Windows10无法连接到Internet_Wi
- Win11右键反应慢怎么办 Win11优化右键菜单
- php错误怎么开启_display_errors与
- php能跑在stm32上吗_php在stm32微控
- Win10如何卸载预装Edge扩展_Win10卸载
- php增删改查在php8里有什么变化_新特性对cu
- 如何使用Golang实现多重错误处理_Golang

三种常用方式
QQ客服