• 自定义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文件时, 
      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分析完毕。
    • WinDbg
    • 通过上图,即可以看到代码崩溃的行数。

    3. 自定义崩溃窗口

      1. 通常Windows会提供一个默认的崩溃提示窗口,或者是程序直接闪退。 
        此处输入图片的描述
      2. 重写ExceptionFilter函数,即可以重新定义崩溃窗口,用以提示用户发送相关信息给软件提供商。 
        此处输入图片的描述
      3. 示例代码 
        示例代码是Win32类型的DLL,导出接口SetCustomUnhandledExceptionFilter在Solution的启动Project的最开始调用一次即可。 
        下载
  • 相关阅读:
    krpano--控制热点跳转到场景的指定视角
    bzoj 4237: 稻草人 -- CDQ分治
    bzoj 4176: Lucas的数论 -- 杜教筛,莫比乌斯反演
    bzoj 3545/3551: [ONTAK2010]Peaks -- 主席树,最小生成树,倍增
    bzoj 4627: [BeiJing2016]回转寿司 -- 权值线段树
    bzoj 1901: Zju2112 Dynamic Rankings -- 主席树,树状数组,哈希
    bzoj 3252: 攻略 -- 长链剖分+贪心
    bzoj 5055: 膜法师 -- 树状数组
    bzoj 1006: [HNOI2008]神奇的国度 -- 弦图(最大势算法)
    bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治
  • 原文地址:https://www.cnblogs.com/feihe0755/p/7193709.html
Copyright © 2020-2023  润新知