自定义VS程序异常处理及调试Dump文件(一)

1. Dump文件

1. Dump文件介绍

Dump文件(Dump File),也叫转储文件,以.DMP为文件后缀。dump文件是进程在内存中的镜像文件,通过转换然后存储成以.DMP后缀的文件。dump文件根据存储时的选项不同,会生成不同大小的文件,其中记录信息也自然有所不同。

2. Dump文件分类

程序分两种,内核模式程序和用户模式程序,也即Ring0程序和Ring3程序。Dump文件是伴随着程序而生成的,所以Dump文件也同样分两种。 
1. Kernel-Mode Dump Files(内核模式Dump文件),主要是驱动程序,此文不涉及。 
2. User-Mode Dump Files(用户模式Dump文件),主要是应用程序及服务程序,此文所讲。 
用户模式Dump文件又分Full User-Mode Dumps和Minidumps。前者生成的是完整的内存快照,所以文件比较大。后者依然生成选项,生成包含不同信息的Dump文件。此文以Minidumps文件来分析调试。

3. Dump文件生成方式

  1. 通过WinDbg工具的命令 
    用WinDbg来Attach崩溃提示窗口的process,然后输入.dump /m C:\myapp.dmp命令,即可生成默认的miniDump文件(只包含系统信息、加载的模块(DLL)信息、 进程信息和线程信息)。
  2. 通过Windows任务管理器,选择指定进程,右键生成转储文件(此时的转储文件即为Full User-Mode Dumps,包含所有信息,所以文件比较大)。
  3. 通过代码在程序崩溃时生成Dump文件。
#include <DbgHelp.h>
#pragma comment(lib, "Dbghelp.lib")
// 此函数需要包含上面头文件和引入相应的库
LONG WINAPI ExceptionFilter(EXCEPTION_POINTERS* _pExcp)
{
    HANDLE hFile = CreateFile(
        "d:\\Format.dmp",
        GENERIC_WRITE,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
    if (INVALID_HANDLE_VALUE == hFile)
    {
        return EXCEPTION_CONTINUE_EXECUTION;
    }

    MINIDUMP_EXCEPTION_INFORMATION einfo = {0};
    einfo.ThreadId = ::GetCurrentThreadId();
    einfo.ExceptionPointers = _pExcp;
    einfo.ClientPointers = FALSE;  

    MiniDumpWriteDump(GetCurrentProcess(),
        GetCurrentProcessId(),
        hFile,
        MiniDumpNormal,  // 指定生成默认的Minidump文件
        &einfo,
        NULL,
        NULL);
    CloseHandle(hFile);   

    return   EXCEPTION_EXECUTE_HANDLER;
}

// 下面函数放在当前模块的入口函数处,指定ExceptionFilter替换原生的异常处理
// 即当原本要弹出崩溃提示窗口前,需要经过此函数处理,可以处理完立即退出,也可以继续
SetUnhandledExceptionFilter(ExceptionFilter); 

Dump文件

1. 使用Visual Studio

  • 选择与生成Dump文件相同版本的VS。
  • 启动VS并打开Dump文件。
  • 必须保证生成Dump文件的程序的PDB文件和源代码相一致。
  • VS2005打开Dump文件时,直接按F5调试,代码会停在出错的地方,通过Call Stack窗口查看。
  • VS2010打开Dump文件时, 
     
    需要通过Set symbol paths设置符号文件路径,也即PDB文件路径。然后点击Debug with Native Only,代码即会暂时在出错的地方,通过Call Stack窗口查看相关信息。

2. 使用WinDbg

  • 选择相应版本的WinDbg,x86还是AMD64(也即X64,因为64桌面架构系统是AMD最新发布)。
  • File->Open Crush Dump,打开指定的Dump文件。
  • File->Symbol File Path,添加srv*D:\Symbols*http://msdl.microsoft.com/download/symbols
  • File->Symbol File Path,添加程序的PDB文件夹路径。这样可以调试系统DLL,也可以调试自有程序。
  • 然后在WinDbg命令行中输入!analyze -v,等待WinDbg分析完毕。
  • 通过上图,即可以看到代码崩溃的行数。

3. 自定义崩溃窗口

    1. 通常Windows会提供一个默认的崩溃提示窗口,或者是程序直接闪退。 
    2. 重写ExceptionFilter函数,即可以重新定义崩溃窗口,用以提示用户发送相关信息给软件提供商。 
    3. 示例代码 
      示例代码是Win32类型的DLL,导出接口SetCustomUnhandledExceptionFilter在Solution的启动Project的最开始调用一次即可。 
      下载
时间: 2024-10-10 23:33:09

自定义VS程序异常处理及调试Dump文件(一)的相关文章

WinDbg抓取程序报错dump文件的方法

程序崩溃的两种主要现象: a. 程序在运行中的时候,突然弹出错误窗口,然后点错误窗口的确定时,程序直接关闭 例如: “应用程序错误” “C++错误之类的窗口” “程序无响应” “假死”等 此种崩溃特点:程序已异常,在你未点出错窗口的确定或其他按,所有错误信息都还保留在PC的内存中,可以直接抓取Dump文件.当然,如果你知道 怎么样操作可以让程序崩溃,也可以用守株待兔的抓取方法抓Dump文件. b.程序在运行中的时候,窗口和进程突然消失,没有任何错误窗体 典型的现象:程序自动关闭 或者玩游戏时,游

dotnet core调试docker下生成的dump文件

最近公司预生产环境的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发到预生产还是会有内存暴涨现象,反而更改GC模式后内存使用保持较低水平,百思不得其解,所以想到使用调试dump文件方式来分析应用内存状况. 环境: lldb:3.9 dotnetcore:2.1.6 docker image:microsoft/dotnet:2.1.6-aspnetcore-runtime (根据文档,d

Dump文件的生成和使用

1 简介 第一次遇到程序崩溃的问题,之前为单位开发了一个插件程序,在本机运行没有出现问题,但把生成的可执行文件拷贝到服务器上一运行程序,刚进入插件代码,插件服务就崩溃了,当时被这个问题整的很惨,在同事的帮助下了解到,对于程序崩溃,最快的解决方式是生成dump文件,通过生成dump文件使用调试工具进行调试,还原程序崩溃时的状态,能够起到快速定位排查问题的作用.Dump文件是进程的内存镜像.可以把程序的执行状态通过调试器保存到dump文件中.Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种

WinDbg-如何抓取dump文件

这要分两种情况: 第一种情况:如果是Vista或者是Windows2008操作系统就是一个简单的事情,在任务管理器中,切换到"进程"选项卡,右键点击你想要创建dump文件的进程,然后选择"Create Dump File"即可.如果你想要创建dump文件的进程是w3wp.exe,可能会看到有很多w3wp,但不知道哪一个是你要要抓的网站,可以通过下需的命令查看,对于vista或win2008系统使用:%windir%/system32/inetsrv/appcmd l

Windows下生成dump文件方法

[转载请注明出处]:http://blog.csdn.net/longlong530 一. 背景 没人能保证自己的软件在各种未知环境运行下,会木有任何问题.那么如果程序崩溃了怎么办?看日志?日志不全又怎么办?日志能帮你定位的多细致呢?如果能有种方法记录程序最后工作的状态,比如堆栈调用情况等,那么我们就可以获悉"它是如何挂掉的~" 二. 调研 我们对程序bug引起的程序崩溃的五种定位方法进行了调研,并最终选择方案5为我所在项目使用的程序崩溃定位方案. 方案1: 崩溃地址 + MAP文件

windows server dump文件

1. mini dump: ***** 需要包含 dbghelp.dll 库 ****mini_dump.h文件: // reference:https://msdn.microsoft.com/zh-cn/library/windows/desktop/ee416349(v=vs.85).aspx #ifndef mini_dump_h__#define mini_dump_h__ namespace minidump{ void MiniDumpBegin(const char* app_n

WinDbg分析DUMP文件

1. 如何生成dump文件? 原理:通过SetUnhandledExceptionFilter设置捕获dump的入口,然后通过MiniDumpWriteDump生成dump文件: SetUnhandledExceptionFilter:https://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(SETUNHANDLEDEXCEPTIONFILTER);k(DevLang-%22C%2B%2B%22)&a

Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)

记录一下 Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 需要在运行时生成core dump文件 首先在pro结尾里加入 QMAKE_CC += -g QMAKE_CXX += -g QMAKE_LINK += -g 在终端输入 ulimit -c 显示为 0 然后输入 ulimit -c unlimited 继续在终端运行编写的程序 出错后,会在当前目录生成 core 文件 然后在终端执行 “gdb 你的程序名 core” 然后输入 bt 对该错误进行跟踪调试 (gdb)

编写的windows程序,崩溃时产生crash dump文件的办法

一.引言 dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法,所以程序崩溃时,除了日志文件,dump文件便成了我们查找错误的最后一根救命的稻草.windows程序产生dump文件和linux程序产生dump文件的方式不一样,linux默认是不让产生core dump文件,只要在用户自己的~/.bash_profile文件中增加 ulimit -S -c unlimited > /dev/null 2>&1 这样程序崩溃就可以产生可调试的core d