C++调试(壹):初步认识WinDbg和dump文件

目录

1.前言

2.WinDbg是什么?

3.​WinDbg安装

4.Dump文件是什么?

5.生成Dump文件的场景


前言

这是一个关于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 Developerhttps://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 文件的分类:

  1. 按生成方式分类

|----------|------------------------------|-------------------|
| ​类型​ | ​描述​ | 典型场景​ |
| 主动生成 | 用户或工具主动触发生成(任务管理器右键"创建转储文件") | 调试进程卡死、内存泄漏等非崩溃问题 |
| 被动生成 | 系统或程序崩溃时自动生成(应用程序未处理异常) | 分析系统崩溃或程序闪退问题 |

​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文件即可

相关推荐
让我们一起加油好吗25 分钟前
【C++】类和对象(中)——默认成员函数详解(万字)
开发语言·c++·visualstudio·类和对象
fhqlongteng29 分钟前
一种动态分配内存错误的解决办法
运维·服务器·网络·c++
珊瑚里的鱼1 小时前
牛客网题解 | 栈的压入、弹出序列
开发语言·c++·笔记·算法·leetcode·stl
chuxinweihui4 小时前
初识c++
开发语言·c++·学习
blueshaw7 小时前
CMake中的“包管理“模块FetchContent
c++·cmake
LILI000007 小时前
C++静态编译标准库(libgcc、libstdc++)
开发语言·c++
致微8 小时前
【Vue bug】:deep()失效
前端·vue.js·bug
孞㐑¥9 小时前
C++之特殊类设计及类型转换
开发语言·c++·经验分享·笔记
毛茸茸斑斑点点10 小时前
补题 (Multiples of 5)
c++
CodeWithMe10 小时前
【中间件】bthread_基础_TaskControl
c++·中间件