自定义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文件生成方式

  3. 通过WinDbg工具的命令

    用WinDbg来Attach崩溃提示窗口的process,然后输入.dump /m C:\myapp.dmp命令,即可生成默认的miniDump文件(只包含系统信息、加载的模块(DLL)信息、 进程信息和线程信息)。
  4. 通过Windows任务管理器,选择指定进程,右键生成转储文件(此时的转储文件即为Full User-Mode Dumps,包含所有信息,所以文件比较大)。
  5. 通过代码在程序崩溃时生成Dump文件。

    ```CPP

    include

    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);

``## 2. 分析Dump文件 ###1. 使用Visual Studio - 选择与生成Dump文件相同版本的VS。 - 启动VS并打开Dump文件。 - 必须保证生成Dump文件的程序的PDB文件和源代码相一致。 - VS2005打开Dump文件时,直接按F5调试,代码会停在出错的地方,通过Call Stack窗口查看。 - VS2010打开Dump文件时, ![Dump][1] 需要通过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,添加srvD:\Symbolshttp://msdl.microsoft.com/download/symbols- File->Symbol File Path,添加程序的PDB文件夹路径。这样可以调试系统DLL,也可以调试自有程序。 - 然后在WinDbg命令行中输入!analyze -v,等待WinDbg分析完毕。 - ![WinDbg][2] - 通过上图,即可以看到代码崩溃的行数。 ##3. 自定义崩溃窗口 1. 通常Windows会提供一个默认的崩溃提示窗口,或者是程序直接闪退。 ![此处输入图片的描述][3] 2. 重写ExceptionFilter函数,即可以重新定义崩溃窗口,用以提示用户发送相关信息给软件提供商。 ![此处输入图片的描述][4] 3. 示例代码 示例代码是Win32类型的DLL,导出接口SetCustomUnhandledExceptionFilter`在Solution的启动Project的最开始调用一次即可。

下载

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

  1. 使用VS2012调试Dump文件

    前一节我讲了怎么设置C++崩溃时生成Dump文件 , 点击 传送门 , 这一节我讲讲怎么使用 VS2012 调试生成的 Dump 文件 , 甚至可以精确到出错的那一行代码上面 ; 1. 生成 Dump ...

  2. (转)解决WinDbg调试Dump文件不同环境mscordacwks.dll版本问题

    解决WinDbg调试Dump文件不同环境mscordacwks.dll版本问题   开发人员提交一个dump文件(Windows Server 2008 R2),当前调试环境Windows Serve ...

  3. 调试dump文件

    1.设置好pdb文件和源代码路径 为了能正确分析Dump文件,我们必须要指定和程序一起出来的PDB文件,如果程序重新被编译了一次,即使代码没有任何变化,之前的PDB文件我们不能再继续使用.

  4. C++ 程序崩溃时生成Dump文件

    #include <DbgHelp.h> //生产DUMP文件 int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExcept ...

  5. 使用VS调试DUMP文件

    使用前准备: 1.保存编译文件的PDB文件(要和生成exe文件的对应) 2.在开发机器上,使用vs直接双击打开dmp文件,注意 进程名称 ,这个是程序运行crash的时候所在的目录位置,这个很重要. ...

  6. Qt 使用 Google Breakpad 捕获程序崩溃报告(dump文件) good

    http://blog.csdn.net/GoForwardToStep/article/details/56685810

  7. 如何使用dump文件进行调试

    转载[文尾出处链接] 1 简介第一次遇到程序崩溃的问题,之前为单位开发了一个插件程序,在本机运行没有出现问题,但把生成的可执行文件拷贝到服务器上一运行程序,刚进入插件代码,插件服务就崩溃了,当时被这个 ...

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

    程序崩溃的两种主要现象: a. 程序在运行中的时候,突然弹出错误窗口,然后点错误窗口的确定时,程序直接关闭 例如: “应用程序错误” “C++错误之类的窗口” “程序无响应” “假死”等 此种崩溃特点 ...

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

    最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发 ...

随机推荐

  1. kafka 0.10.2 解决java无法生产消息到指定topic问题

    主要是修改server.properties的advertised.listeners advertised.listeners=PLAINTEXT://192.168.59.132:9092

  2. 刨根究底字符编码之十——Unicode字符集的字符编码方式CEF

    Unicode字符集的字符编码方式CEF 一.字符编码方式CEF的选择 1. 由于Unicode字符集非常大,有些字符的编号(码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须使用 ...

  3. js实现分页

    <html> <head> <meta charset='utf-8'> <script type="text/javascript" s ...

  4. JAVA设计模式初探之装饰者模式

    定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种 ...

  5. DNS分析之 dnsdict6 使用方法

    基本用法就是: dnsdict6 -d46 -t 10 baidu.com

  6. orcle :Could not initialize "D:\app\Administrator\product\11.2.0\dbhome_1\bin\oci.dll" Make sure you have the 32 bits Oracle Client installed.

    服务器重启后,数据库登录信息为空 错误信息: ---------------------------(Not logged on) - PL/SQL Developer---------------- ...

  7. 用户权限模块之oauth2.0

    主要是在springsecurity上面扩展即可,所以内容也是基于上一个, sql: CREATE TABLE `auth_access_token` ( `id` int(11) NOT NULL ...

  8. 匿名属性 anonymous property

    利用匿名属性可以用很简洁的语法来自动声明不可变(immutable)的元组(tuple)类型. 属性:在字段用来表示类型和对象的状态的前提下,希望状态不被随意的更改,字段一般应该设置为private, ...

  9. CSS实现矩形按钮右边缘的中间有个往里凹的小半圆

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. Objective-C 编码风格指南

    本文转自:[Objective-C 编码风格指南 | www.samirchen.com][2] ## 背景 保证自己的代码遵循团队统一的编码规范是一个码农的基本节操,能够进入一个有统一编码规范的团队 ...