读懂DUMP文件

目录

一、什么是Dump文件

二、Dump文件的类型

2.1 内核模式Dump

2.2 用户模式Dump

三、Dump文件的生成

3.1 通过调试工具生成

3.2 通过使用任务管理器生成

3.3 通过编程自动生成

四、各种抓取DUMP的工具


一、什么是Dump文件

对于程序崩溃,最快的解决方式是生成dump文件,通过生成dump文件使用调试工具进行调试,还原程序崩溃时的状态,能够起到快速定位排查问题的作用。dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开。


二、Dump文件的类型

2.1 内核模式Dump

Dump文件分为两大类,内核模式Dump和用户模式Dump。内核模式Dump是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump。

2.2 用户模式Dump

用户模式Dump进一步可以分为完整Full Dump和Mini dump。Full Dump包含了某个进程完整的地址空间数据,以及许多用于调试的信息,而Mini dump则有许多类型,根据需要可以包含不同的信息,有的可能只包含某个线程和部分模块的信息。

三、Dump文件的生成

Dump文件能够保存程序内部的内存、堆栈、句柄、线程等程序运行相关的信息,非常具有重要性。

3.1 通过调试工具生成

通过调试工具创建。调试工具如Visual Studio,Windbg以及微软提供的ADplus都可以创建DUMP,在Windbg中通过.dump命令来生成。

3.2 通过使用任务管理器生成

该方式可以生成.DMP文件,通过打开任务管理器,找到插件服务对应的进程,右击,选择创建转储文件:

.DMP文件的存放位置如下图所示:

3.3 通过编程自动生成

当程序遇到未处理异常(主要指非指针造成)导致程序崩溃死,如果在异常发生之前调用了SetUnhandledExceptionFilter()函数,异常交给函数处理。因而,在程序开始处增加SetUnhandledExceptionFilter()函数,并在函数中利用适当的方法生成Dump文件,即可实现需要的功能。
在编程过程中,可以预期的异常都通过结构化异常(try/catch)进行了处理。此时,如果发生了未预期的异常,这些异常处理代码无法处理,则转由Windows提供的默认异常处理器来进行处理,这个特殊的异常处理函数为UnhandledExceptionFilter。该函数会显示一个消息框,提示发生了未处理的异常,同时,让用户选择结束或调试该进程。也就是如下界面:
因此,为了更友好的处理未预期的异常(主要是创建内存转储),可以覆盖默认的异常处理操作。这是通过函数SetUnhandledExceptionFilter完成的,函数原型如下:

LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
        _In_ LPTOP_LEVEL_EXCEPTION_FILTER  lpTopLevelExceptionFilter

lpTopLevelExceptionFilter即异常处理函数指针,如果设置为NULL,则默认使用UnhandledExceptionFilter。因此我们可以对照lpTopLevelExceptionFilter自定义一个异常处理函数。我们需要创建内存转储。这通过函数MiniDumpWriteDump来实现。
下述代码是一个通过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;
}

四、各种抓取DUMP的工具

任务管理器

任务管理器是自带抓取转储文件的工具。按住 Ctrl + Shift + Esc 即可打开。打开任务管理器后,在需要转储的进程上右键 -> 创建转储文件(C),即可自动保存转储文件到 %tmp% 目录下。

process explorer

process explorer 比系统自带的任务管理器更强大,打开 process explorer,在需要转储的进程上,右键 -> Create Dump -> Create Full Dump... 就可以保存转储文件了。( Create Minidump... 抓取的信息少,但抓取的转储文件小,适合网络传输,根据自己的需要选择)

 Visual Studio

visual studio 简称 vs,大家应该对 vs 应该非常熟悉了,我就不多介绍了。打开 vs,附加到需要转储的进程上,点击 Break All 按钮(或者按快捷键 Ctrl + Alt + Break)暂停目标进程。然后点击 Debug -> Save Dump As... 就可以保存转储文件了。如果不暂停目标进程,Save Dump As... 按钮是置灰的

windbg

windbg 是 windows系统上非常强大的调试器,windbg能分析转储文件,当然能保存转储文件了。打开 windbg,附加到需要转储的进程上,执行 .dump [Options] path/to/save/dump.dmp

Core Dump文件是在程序崩溃时生成的文件,其中包含了程序运行时的内存、堆栈指针、寄存器状态和内存管理信息等。\[1\]当一个进程异常终止时,可以选择将进程的用户空间内存数据全部保存在磁盘上,文件名通常为core。\[2\]Core Dump文件可以通过sysctl/proc来设置文件名和文件路径。它通常以ELF格式保存,可以用于分析程序崩溃的原因。\[1\]通过使用gdb调试工具,可以检查Core Dump文件以查明错误的原因,这被称为事后调试。\[2\]默认情况下,系统不允许生成Core Dump文件,因为它可能包含用户密码等敏感信息。\[2\]如果需要生成Core Dump文件,可以通过设置core_pattern文件来指定生成的文件格式和存储路径。\[3\] #### 引用[.reference_title] - *1* *2* [Core Dump文件](https://blog.csdn.net/qq_37954088/article/details/79765491)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [linux中coredump文件分析](https://blog.csdn.net/weixin_44698673/article/details/126271862)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赋能大师兄

读后有收获可以请作者喝咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值