自定义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 消息生产者

    package cn.xiaojf.kafka.producer; import org.apache.kafka.clients.producer.KafkaProducer; import org ...

  2. web—URL不同形式地址的问题

    浏览网页时,不同的网站有不同的URL显示方式. 第一种形式: http://www.cnblogs.com/sylarmeng/p/6738695.html 具体的文章用数字(或组合字母)字符串来标识 ...

  3. Oracle数据库------体系结构

    ORACLE体系结构包括:实例(Instance),数据库文件,用户进程(User process),服务器进程以及其他文件. 1.ORACLE实例(instance)     1).要访问数据库必须 ...

  4. testlink(以及服务器)问题定位思路

    testlink又炸了,记录下问题定位思路: 1.翻阅logs: tail -100f ***.log 2.将关键字百度: 但是狗日的网上一般不会告诉我们这修改的文件在哪(上下图无关联,因为图是后面随 ...

  5. c++ thread

    Either pthread_join(3) or pthread_detach() should be called for each thread,that an application crea ...

  6. sleep()

    sleep() 方法可以使当前线程(即调用该方法的线程)暂停执行一段时间, 让其他线程有机会继续执行, 但它并不释放对象锁: 所以当sleep()方法结束时: 当前线程还是拥有对象锁: 当线程拥有对象 ...

  7. Swing系列之控件一

    Swing系列之控件 JTextArea JTextArea是一个实现多行文本的控件 构造函数 JTextArea() 构造新的TextArea. JTextArea(Document doc) 构造 ...

  8. phpcms v9模版调用代码

    首页调用栏目{pc:content action="category" siteid="$siteid" num="15" order=&q ...

  9. sublime text 3双击选择无法选择$符号

    创建/Data/Packages/User/PHP.sublime-settings文件,内容为"word_separators": "./\\()\"'-:, ...

  10. js判断一个数组是否为空

    var s = []; if(s.length == 0){ alert('空数组'); }