DUMP文件分析1:DUMP文件简介

article/2025/10/22 1:17:46

1.1 DUMP文件类型

Windows下Dump文件分为两大类,内核模式Dump和用户模式Dump。内核模式Dump是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump。用户模式Dump进一步可以分为完整Dump(Full Dump)和迷你Dump(Minidump)。完整Dump包含了某个进程完整的地址空间数据,以及许多用于调试的信息,而Minidump则有许多类型,根据需要可以包含不同的信息,有的可能只包含某个线程和部分模块的信息。

1.2 DUMP文件的创建

本节讲述几种常用的DUMP文件创建方法。这里只讲述用户模式Dump文件创建,因为除部分专业开发人士(驱动开发)外,一般的开发人员只涉及应用程序的调试。
方法(1),通过调试工具创建。调试工具如Visual Studio,Windbg以及微软提供的ADplus都可以创建DUMP,在Windbg中通过.dump命令来生成。
方法(2),通过任务管理器创建。打开任务管理器,找到目标进程,右键——“创建转储文件”,即可保存DUMP。这种方式创建的DUMP文件为完整的Minidump,缺乏灵活性。不过,开发者的软件崩溃之后,又没有提供自动措施时,用户可以通过这种方法手动保存DUMP文件,然后提供给开发者分析,操作简单。不过,这种方法所产生的DUMP文件与其它几种方法产生的有差异,读者可以自己用windbg进行对比,这一点我在后面会详细讲到。
方法(3),通过编程自动创建。这是软件开发者使用的方式,例如,WPS中可以看到的对话框:

就是通过编程实现自动内存转储,然后上传到服务器,供开发者研究。
在编程过程中,可以预期的异常都通过结构化异常(try/catch)进行了处理。此时,如果发生了未预期的异常,这些异常处理代码无法处理,则转由Windows提供的默认异常处理器来进行处理,这个特殊的异常处理函数为UnhandledExceptionFilter。该函数会显示一个消息框,提示发生了未处理的异常,同时,让用户选择结束或调试该进程。也就是如下界面:

因此,为了更友好的处理未预期的异常(主要是创建内存转储),可以覆盖默认的异常处理操作。这是通过函数SetUnhandledExceptionFilter完成的,函数原型如下:

LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(_In_ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter

lpTopLevelExceptionFilter即异常处理函数指针,如果设置为NULL,则默认使用UnhandledExceptionFilter。因此,我们对照UnhandledExceptionFilter的函数原型实现自己的异常处理函数:

LONG WINAPI MyUnhandledExceptionFilter( struct _EXCEPTION_POINTERS *ExceptionInfo )
{AfxMessageBox("已成功创建崩溃转储!");return EXCEPTION_EXECUTE_HANDLER;
}

然后在程序中设置该函数:
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
此时,再运行示例,如下:

成功的接手了异常处理。接下来,我们需要创建内存转储。这通过函数MiniDumpWriteDump来实现。加上内存转储功能之后的异常处理代码如下:

LONG WINAPI MyUnhandledExceptionFilter( struct _EXCEPTION_POINTERS *ExceptionInfo )
{HANDLE hFile = CreateFile("mini.dmp", GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if( hFile == INVALID_HANDLE_VALUE )return EXCEPTION_EXECUTE_HANDLER;MINIDUMP_EXCEPTION_INFORMATION mdei;mdei.ThreadId = GetCurrentThreadId();mdei.ExceptionPointers = ExceptionInfo;mdei.ClientPointers = NULL;MINIDUMP_CALLBACK_INFORMATION mci;  mci.CallbackRoutine     = NULL;  mci.CallbackParam       = 0;  MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mdei, NULL, &mci);  CloseHandle(hFile);AfxMessageBox("已成功创建崩溃转储!");return EXCEPTION_EXECUTE_HANDLER;
}

此时,运行程序,即可得到内存转储文件mini.dmp。需要注意的是,栈溢出类型的异常使用这种方法一般是捕捉不到的。为什么?我在栈溢出笔记中详细写过SEH,栈溢出会破坏SEH(结构化异常处理)框架,导致SEH失效。读者可以自己尝试。

1.3 小结

本节主要对DUMP文件进行了简单的介绍,并展示了创建DUMP文件的几种途径,其中,通过编程实现的应该是开发者应该掌握的方法。这样不仅仅给用户提供了比较友好的崩溃提示,还自动保存了DUMP文件,这对于那些不易重现的Bug将大大提高调试效率。

(本节的程序是一个简单的MFC程序,具体见第2节)


http://chatgpt.dhexx.cn/article/W7RyGtU4.shtml

相关文章

VS中dumpbin.exe工具的使用

用VS2010生成的.obj文件、.lib库、.dll库、.exe执行文件,如果想查看其中这些文件或库包含了哪些函数以及相关的信息(符号清单),可以通过VS2010自带的dumpbin工具来完成。 dumpbin.exe为Microsoft COFF二进制文件转换器,它显示有关通用对象文…

查看dll或exe文件的依赖项——使用vs自带的dumpbin工具

在使用vs写程序的时候,我们经常会将程序生成为dll或是exe文件,而这些文件通常也会需要依赖其他库的dll才能单独使用。那我们该如何确定某个dll或是exe文件依赖了哪些dll呢?这个问题可以通过使用vs自带的dumpbin工具来解决。下面详细介绍其使用…

用dumpbin.exe工具查看DLL

用dumpbin.exe工具查看DLL,dumpbin.exe是VS自带的工具。我装的是VS2010,所以路径是:C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\下就可以看到dumpbin.exe了。 怎么使用dumpbin.exe呢?因为dumpbin.exe有可…

dump文件,windbg

dump文件,在VC中的调试还是非常非常非常有用的,因为我们也不会经每一行代码都加上日志,当然如果你愿意,也可以每一行都加上日志; 在Windows上,添加dump文件方法: 方法一:一个是在程…

dump分析

在项目运行过程中会产生很多的数据,如果这些数据是强引用是不会被垃圾回收器回收的,如果不及时手动清理则会越来越多,造成内存溢出。 在启动时在jvm命令增加内存溢出生成dump文件,这样在内存溢出的时候就会生成内存快照文件&#…

dumpbin工具的使用(配图)

WINR CMD进入指令界面 作用:配置dumpbin在CMD的运行环境 vs2010->VC->bin Dumpbin所在位置:X86系统 和X64系统的可运行文件 双击运行可使用,显示可运行的指令 查看静态库的信息要用命令行来实现: dumpbin /LINKERMEMBE…

VS2010中dumpbin工具的使用

用VS2010生成的.obj文件、.lib库、.dll库、.exe执行文件,如果想查看其中这些文件或库包含了哪些函数以及相关的信息(符号清单),可以通过VS2010自带的dumpbin工具来完成。 dumpbin.exe为Microsoft COFF二进制文件转换器,它显示有关通用对象文…

VS自带工具:dumpbin的使用

用VS2010生成的.obj文件、.lib库、.dll库、.exe执行文件,如果想查看其中这些文件或库包含了哪些函数以及相关的信息(符号清单),可以通过VS2010自带的dumpbin工具来完成。 1.输入Dumpbin -imports calldll.exe查看它的输入信息,可以看到它加载…

DUMPBIN工具的使用

dumpbin.exe是微软二进制文件转储器。显示有关通用对象文件格式 (COFF) 的二进制文件的信息。 可以使用 DUMPBIN 检查 COFF 对象文件、 COFF 对象、 可执行文件和动态链接库 (Dll) 的标准库。 dumpbin.exe所在路径是 vs安装目录\VC\bin\dumpbin.exe。 我的电脑VS安装路径是E:…

Java中常见异常及异常处理方式

Java异常的继承体系结构 java.lang.Throwable是Java语言中所有错误或异常的超类,在Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型Error类是指Java运行…

23、Java——常见异常的原因和解决办法

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:乐趣国学的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:Java案例分…

java各种异常总结

一、java异常汇总 1.Throwable 是所有异常的祖先,Throwable有两个子类,Error和Exception; 2.Error是错误,表示运行应用程序中出现了严重错误,都是通过Error抛出的,一般程序无法处理; Exception是异常&am…

Java中常见的异常类型

异常类型 在 Java 中所有异常类型都是内置类 java.lang.Throwable 类的子类,即 Throwable 位于异常类层次结构的顶层。Throwable 类下有两个异常分支 Exception 和 Error,如图 1 所示。 Throwable 类是所有异常和错误的超类,下面有 Error 和…

Java常见的10个异常

1、NullPointerException: 空指针异常,当操作一个 null 对象的方法或属性时会抛出这个异常。是一个很头疼的异常,因为它是运行时异常,不需要手动捕获,但运行时碰到这个异常会中断程序。 2、OutOfMemoryError&#xff1…

MFC程序

第一个MFC 界面程序 创建C 空项目 #include <afxwin.h> #include <atlimage.h> #include "resource.h"//继承一个模态框 每一个窗口 对应一个 类 class Login :public CDialog {private:HICON h_icon;//图标类public://构造函数 并且 调用 父类的构造函…

最全的基于MFC的ActiveX控件开发教程

转自&#xff1a;http://www.cnblogs.com/qguohog/archive/2013/01/22/2871805.html 浏览器插件之ActiveX开发&#xff08;一&#xff09; 一般的Web应用对于浏览器插件能不使用的建议尽量不使用&#xff0c;因为其涉及到安全问题以及影响用户安装&#xff08;或自动下载注册安…

MFC经验

MFC框架各部分指针获取方式: 记住&#xff0c;是获取指针 MFC消息流程图: string CString char* 的互相转换: string 转 CString   CString.Format("%s", string.c_str()); //用c_str()比data()好    char 转 CString   CString.Format("%s",…

C++ MFC程序入门

1. 选择“MFC应用程序”,命名后选下一步 2. 点“下一步” 3. 选择“基于对话框” 4. 仅勾选“主框架”

MFC系列 - 第一个MFC入门程序

MFC&#xff0c;多年开发和教学&#xff0c;这门课程&#xff0c;新课改决定将它砍掉&#xff0c;Qt也是我们的趋势&#xff0c;同时在我的Qt系列中详细讲解了Qt的系列教学。MFC虽然很古老&#xff0c;但是还是得佩服微软搞得这套框架&#xff0c;让一代又一代Windows程序员无不…