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

相关推荐
Rachelhi16 分钟前
C++高级编程深度指南:内存管理、安全函数、递归、错误处理、命令行参数解析、可变参数应用与未定义行为规避
开发语言·c++
MaisieKim_1 小时前
如何实现 C/C++ 与 Python 的通信
c语言·c++·python
1001101_QIA2 小时前
【QT】理解QT机制之“元对象系统”
开发语言·c++·qt·算法
a东方青2 小时前
[蓝桥杯C++ 2024 国 B ] 立定跳远(二分)
c++·算法·蓝桥杯·c++20
2501_915373883 小时前
Java调用C++教程:JNI与JNA两种方式详解
java·开发语言·c++
LuckyRich14 小时前
【cpp-httplib】 安装与使用
c++·http
中微子4 小时前
从C++看JavaScript闭包:执行上下文与作用域的跨语言对比
前端·c++
希望_睿智4 小时前
实战设计模式之建造者模式
c++·设计模式·架构
@曲终5 小时前
C++:栈帧、命名空间、引用
java·开发语言·c++·经验分享·笔记
強云5 小时前
原子操作(C++)
c++