自定义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. 在windows环境下利用virtualenv搭建Python虚拟环境

    安装Python 安装时只有一点需要注意,一定一定要将Python添加到系统环境变量那一项勾选. 安装 virtualenv 加入系统目录之后,命令行(CMD)下就多了一条命令:pip.用pip可以自 ...

  2. 热部署环境下,dubbo序列化的bug和优化

    一.问题的发现与解决 (1)     在热部署下,使用dubbo的序列化一个pojo对象,反序列化时报错:ClassNotFoundException. 最后发现原因是我们的框架选择使用了java序列 ...

  3. Unity3d: 资源释放时存储空间不足引发的思考和遇到的问题

    手机游戏第一次启动基本上都会做资源释放的操作,这个时候需要考虑存储空间是否足够,但是Unity没有自带获取设备存储空间大小的 接口,需要调用本地方法分别去android或ios获取,这样挺麻烦的.而且 ...

  4. 关于oracle数据库备份还原-impdp,expdp

    初始化: -- 创建表空间 CREATE TABLESPACE 表空间名 DATAFILE '文件名.dat' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE UNL ...

  5. 请教 C# 异步 async await 问题

    各位园友,之前对C#异步只是肤浅了解,请教一个具体问题. 需求: 前台会发送一个Array,这个数组都是 id的集合,比较大.分两步,首先保存这些id,然后去调用异步方法. 可以正常返回json,也可 ...

  6. Webpack 开发工具与模块热替换

    Webpack 开发工具与模块热替换 ​⚠️ 注意: 永远不要在生产环境中使用这些工具,永远不要. devtool 当 JavaScript 异常抛出时,你常会想知道这个错误发生在哪个文件的哪一行.然 ...

  7. 基于C#的Appium自动化测试框架(Ⅰ)

    因为工作原因,使用的编程语言都是C#,但是国内相应的Appium资料少得可怜,Java版本的Appium也考虑过,但是奈何自己搞不定Eclipse这个编译环境[说白了就是因为懒-- 无意中看到了外面的 ...

  8. MySQL基础语法------增删改查

    1.增 1.1建立数据库 create database test2; 格式:create database <数据库名> 1.2建表 create table student( sno ...

  9. java基础(System.err和System.out)

    今天有位同事在使用System.err和System.out遇上了一些小问题. 看了些资料总结下: 1.JDK文档对两者的解释: out: "标准"输出流.此流已打开并准备接受输出 ...

  10. cookie 与 session

    cookie简介 Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据.一般情况下,Cookie通过HTTP headers从服务端返回到客户端.多数web程序都支持Co ...