目录
1.前言
前言
这是一个关于C++调试的博客,该系列博客主要是讲解如何使用WinDbg工具结合dump文件调试程序。在日常开发过程中,我们往往无法完全的对程序的异常进行合适的处理,当我们的程序运行在客户的电脑上崩溃,我们一般会通过日志来分析问题,但是大多数的日志都很难分析定位具体的问题,而WinDbg搭配dump文件调试就是为了解决这一方面的问题。博主同样对这种情况感到头疼,但是网上对WinDbg的讲解少之又少,所以该系列的博客就是为了解决想使用WinDbg调试工具分析异常,但苦于资料过少而编写的,也欢迎各位大牛对本系列博客进行批评指正,感谢!
WinDbg是什么?
WinDbg 是微软推出的一款功能强大的调试工具,主要用于分析和诊断 Windows 系统及应用程序的问题。核心功能分为以下几点:
1.基础调试****:设置断点、单步执行、查看寄存器/内存/堆栈。
2.反汇编****:将机器码转换为汇编指令,便于分析底层行为。
3.扩展命令**** :通过插件(如 !analyze -v
)自动化分析问题。
4.脚本支持****:用内置脚本语言或 Python 自动化复杂任务。
WinDbg与VS调试器的区别在于Windbg则更底层,支持内核调试和高级分析,而VS调试器更友好,适合常规开发。在开发阶段,我们可以使用WinDbg排查驱动或系统级代码的漏洞,生成环境下可以通过Dump文件分析客户报告的崩溃问题,而对于系统的维护可以诊断蓝屏、性能问题或资源泄漏
WinDbg安装
WinDbg主要分为两个版本一个是WinDbg10.0,另一个是WinDbg Preview。前者UI界面比较复古,后者则更适合现代的审美(PS:作者两个都用,但是功能都是差不多的,没必要纠结使用哪一个),以下是两个版本的安装路径:
1.WinDbg Preview安装路径:
安装 WinDbg - Windows drivers | Microsoft Learnhttps://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/ 2.WinDbg10.0安装路径:
Windows SDK - Windows 应用开发 | Microsoft Developer
https://developer.microsoft.com/zh-cn/windows/downloads/windows-sdk/
WinDbg安装演示
由于WinDbg Preview安装较为简单,本小节将演示WindDbg10.0的安装过程,具体详细过程如下:
1.进入下载链接,下载安装Windows SDK
图1.下载Windows SDK
2.选择安装方式,推荐本地安装

图2.选择安装方式
3.选择是否运行收集资料
图3.选择是否收集资料
4.选择下载的文件

图4.选择下载的文件
5.安装完成

图5.安装完成
6.打开路径,在Installers文件夹中选择对应的位数进行WinDbg的安装

图6.WinDbg10.0的安装
7.安装完毕,找到WinDbg

图7.WinDbg的路径
Dump文件是什么?
Dump 文件(内存转储文件)是系统或应用程序在崩溃、死锁或主动触发时生成的内存快照,用于记录程序或系统在故障瞬间的状态(如内存、寄存器、线程堆栈等),咱们可以通过调试工具WinDbg分析 Dump 文件,可定位崩溃的根本原因。
Dump 文件的分类:
- 按生成方式分类
|----------|------------------------------|-------------------|
| 类型 | 描述 | 典型场景 |
| 主动生成 | 用户或工具主动触发生成(任务管理器右键"创建转储文件") | 调试进程卡死、内存泄漏等非崩溃问题 |
| 被动生成 | 系统或程序崩溃时自动生成(应用程序未处理异常) | 分析系统崩溃或程序闪退问题 |
2. 按内容范围分类
|----------|---------------|----------------------------|--------------------------|
| 类型 | 文件大小 | 内容范围 | 用途 |
| 完全内存转储 | 极大(等同物理内存大小) | 完整物理内存 + 内核态数据 | 复杂系统级问题分析 |
| 内核内存转储 | 较大(约系统内存的1/3) | 仅内核态内存,不含用户态进程数据。 | 分析蓝屏死机等内核问题 |
| 小型内存转储 | 小(约数MB~百MB) | 仅崩溃线程的堆栈、部分内存、模块列表及关键寄存器信息 | 快速定位常见崩溃原因 |
| 自动内存转储 | 动态调整 | 与内核内存转储类似,但系统自动管理页 | Windows 8+ 默认配置,替代内核内存转储 |
3. 按调试目标分类
|-----------|-------------|----------------------|----------------------|
| 类型 | 调试对象 | 分析工具 | 示例文件 |
| 用户态 Dump | 应用程序崩溃 | Windbg(用户态模式)、VS 调试器 | WildPointer.dmp
|
| 内核态 Dump | 系统蓝屏或驱动崩溃 | Windbg(内核态模式) | MEMORY.DMP
(系统蓝屏文件) |
| 混合 Dump | 跨用户/内核态问题 | Windbg(结合两种模式) | 需主动配置生成的完整转储文件 |
生成Dump文件的场景
在不同的场景下,我们生成的Dump文件类型是不同的,一般针对以下三种场景生成对应的Dump文件
1.******小型转储(Minidump)**:
1.客户报告程序崩溃,发送小型转储文件(体积小)供开发者分析。
2.快速使用 Windbg 命令 !analyze -v
定位崩溃代码行。
2.内核转储(Kernel Dump):
1.服务器蓝屏后,分析 MEMORY.DMP
确认是否为驱动兼容性问题。
3.完全转储(Complete Dump):
1.复现困难的内存泄漏或死锁问题,需捕获全部内存状态供深入分析。
一般的程序崩溃情况只需要生成小型转存储文件就行,后续博客将对其深入讲解,只需要了解有那些类型的Dump文件即可
后续的文章将针对Qt程序进行讲解,如何在Qt程序崩溃时生成Dump文件,如何生成对应的符号表,在WinDbg中通过结合Dump文件和符号表进行堆栈的调试和反汇编。本篇博客作为该系列的第一章,只需要了解什么是WinDbg和Dump文件即可