WinDbg分析dump文件
一 、Windbg介绍:
Windbg是一款功能十分强大的调试工具,它设计了极其丰富的功能来支持各种调试任务,包括用户态调试、内核态调试、调试转储文件、远程调试等等。
二、具体使用
● STEP 1:生成dump文件

#include "stdafx.h" #include"windows.h" #include <DbgHelp.h> #include<iostream> #include <direct.h> #pragma comment(lib,"User32.lib") #pragma comment(lib, "DbgHelp.Lib") struct Object { int id; char name[32]; }; LONG WINAPI MyUnhandledFilter(struct _EXCEPTION_POINTERS *lpExceptionInfo) { LONG ret = EXCEPTION_EXECUTE_HANDLER; SYSTEMTIME st; CHAR szFileName[_MAX_PATH]; WCHAR szFileName1[_MAX_PATH]; ::GetLocalTime(&st); _getcwd(szFileName, _MAX_PATH); strcat(szFileName, "\\errorData.dmp"); //将char *转为WCHAR * MultiByteToWideChar(CP_ACP, 0, szFileName, strlen(szFileName) + 1, szFileName1, sizeof(szFileName1) / sizeof(szFileName1[0])); //创建dmp文件 HANDLE hFile = ::CreateFile(szFileName1, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { MINIDUMP_EXCEPTION_INFORMATION ExInfo; ExInfo.ThreadId = ::GetCurrentThreadId(); ExInfo.ExceptionPointers = lpExceptionInfo; ExInfo.ClientPointers = false; // 往dmp文件中写出错时的信息 BOOL bOK = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL); ::CloseHandle(hFile); } else { std::cout << "创建文件失败!" << std::endl; } return ret; } int _tmain(int argc, _TCHAR* argv[]) { SetUnhandledExceptionFilter(&MyUnhandledFilter); Object* obj = NULL; obj->id = 1; system("pause"); return 0; }
● STEP 2:打开Windbg,设置参数
(1)设置符号表路径
注意:C:\Users\zhao\Desktop\text1\Test2013\ConsoleApplication1\Debug,这个目录是当前程序编译时生成的.pdb文件路径。
SRV*d:\symbols* http://msdl.microsoft.com/download/symbols,这个目录是系统需要的符号路径,没有的话去微软官网下载。
(2)设置源代码路径
(3)dmp文件导入
● STEP 3:命令分析dump文件
(1)!analyze -v 分析dmp文件
* 这里需要注意的是:
①如果有pdb文件的话,尽可能的保证pdb文件和产生Dump文件的程序版本是匹配的。
②尽可能地保证所用来分析的源代码和程序版本是匹配的。
如果上述有不匹配的情况,很有可能导致分析时所得到的结果不是正确的,或者是在通过地址偏移定位出现异常代码的行数时导致定位不准确。
如果Dump文件是64位的,在分析时,需要根据被转储文件的位数来判断是否转为32位的,转换的命令如下:
.load wow64exts !sw 这两个命令可以将64位的Dump转为32位的 再次输入!sw则可将转为32位的Dump再次转为64的
三、常用命令
目前版本的Windbg共提供了20多条标准命令,140多条元命令和难以计数的大量扩展命令。
在这里只介绍一下比较常用的命令,其他的可以参考《Windbg用法详解》或者网上搜索
!analyze –v 自动分析 kv 查看堆栈
!runaway 显示所有线程的CPU消耗
!handle e00 f 显示句柄详细详细
!cs 00bcd034 临界对象
!teb查看TEB的结构
bp 下断点,还有条件断点
!address 显示整个地址空间和使用摘要的信息
dd 按字节查看
dt 查看结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南