前言:通过drwtsn32、NTSD、CDB等调试工具生成Dump文件, drwtsn32存在的缺点虽然NTSD、CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD、CDB等调试工具。了解了mini dump文件格式后,完全可以程序自动生成Dump文件。

本文主要讨论以下内容:

1、  运行原理

2、  程序修改

3、  注意事项

一、   运行原理

当程序遇到未处理异常(主要指非指针造成)导致程序崩溃死,如果在异常发生之前调用了SetUnhandledExceptionFilter()函数,异常交给函数处理。MSDN中描述为:

Issuing SetUnhandledExceptionFilter replaces the existing top-level exception filter for all existing and all future threads in the calling process.

因而,在程序开始处增加SetUnhandledExceptionFilter()函数,并在函数中利用适当的方法生成Dump文件,即可实现需要的功能。

二、   程序修改

1、  重载 << 操作符。(本步可以不实现)

std::ostream& operator<<(std::ostream& os, const EXCEPTION_RECORD& red)

{

return os << "   Thread ID:" << GetCurrentThreadId()

<< "   ExceptionCode: " << red.ExceptionCode << "/n"

<< "   ExceptionFlags: " << red.ExceptionFlags << "/n"

<< "   ExceptionAddress: " << red.ExceptionAddress << "/n"

<< "   NumberParameters: " << red.NumberParameters;

}

2、  实现UnhandledExceptionFilter

#include "minidmp.h"

LONG WINAPI GPTUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)

{

CreateMiniDump(pExceptionInfo, L"Exception.dmp");

std::cerr << "未知错误:" << (*pExceptionInfo->ExceptionRecord) << std::endl;

exit(pExceptionInfo->ExceptionRecord->ExceptionCode);

return EXCEPTION_EXECUTE_HANDLER;    // 程序停止运行

}

3、  在异常发生之前调用SetUnhandledExceptionFilter(GPTUnhandledExceptionFilter);

通常在Main()函数开始时调用即可。

4、  CreateMiniDump()函数在minidmp.h头文件中定义,文件如下:

#pragma once

#include <windows.h>

#include <imagehlp.h>

#include <stdlib.h>

#pragma comment(lib, "dbghelp.lib")

inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName)

{

if(pModuleName == 0)

{

return FALSE;

}

WCHAR szFileName[_MAX_FNAME] = L"";

_wsplitpath(pModuleName, NULL, NULL, szFileName, NULL);

if(wcsicmp(szFileName, L"ntdll") == 0)

return TRUE;

return FALSE;

}

inline BOOL CALLBACK MiniDumpCallback(PVOID                            pParam,

const PMINIDUMP_CALLBACK_INPUT   pInput,

PMINIDUMP_CALLBACK_OUTPUT        pOutput)

{

if(pInput == 0 || pOutput == 0)

return FALSE;

switch(pInput->CallbackType)

{

case ModuleCallback:

if(pOutput->ModuleWriteFlags & ModuleWriteDataSeg)

if(!IsDataSectionNeeded(pInput->Module.FullPath))

pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);

case IncludeModuleCallback:

case IncludeThreadCallback:

case ThreadCallback:

case ThreadExCallback:

return TRUE;

default:;

}

return FALSE;

}

inline void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCTSTR strFileName)

{

HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE,

0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))

{

MINIDUMP_EXCEPTION_INFORMATION mdei;

mdei.ThreadId           = GetCurrentThreadId();

mdei.ExceptionPointers  = pep;

mdei.ClientPointers     = FALSE;

MINIDUMP_CALLBACK_INFORMATION mci;

mci.CallbackRoutine     = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;

mci.CallbackParam       = 0;

MINIDUMP_TYPE mdt       = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory |

MiniDumpWithDataSegs |

MiniDumpWithHandleData |

0x00000800 /*MiniDumpWithFullMemoryInfo*/ |

0x00001000 /*MiniDumpWithThreadInfo*/ |

MiniDumpWithUnloadedModules);

MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),

hFile, mdt, (pep != 0) ? &mdei : 0, 0, &mci);

CloseHandle(hFile);

}

}

三、   注意事项

1、  可执行文件(exe)必须找到dbghelp.dll,才能生成Dump文件。这个DLL可以从调试工具包中找到。

2、  当异常代码定位成功以后,如果无法阻止异常的产生,可以用 __try 结构包装异常代码,__try 和 try 不同,前者可以捕获非法指针产生的异常。

__try {

// 会异常的函数

}

__except( EXCEPTION_EXECUTE_HANDLER ){

// 异常处理

}

参考文档:

http://blog.csdn.net/ArCoolGG/archive/2007/04/05/1553027.aspx

http://www.debuginfo.com/articles/effminidumps.html

程序自动生成Dump文件的更多相关文章

  1. 程序自动生成Dump文件()

    前言:通过drwtsn32.NTSD.CDB等调试工具生成Dump文件, drwtsn32存在的缺点虽然NTSD.CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD.CDB等调试工具.了解了 ...

  2. windows程序崩溃生成dump文件

    第一种: 通过任务管理器:这种适用在程序挂了(crash)的时候进程还未退出,比如我运行程序,出现了下面的错: 此时打开任务管理器,右击相应进程,点击"Create Dump File“: ...

  3. 使用ProcDump自动生成Dump文件

    ProcDump工具来自Sysinternals Suite 最近用来自动产生Dump文件 一是用来监视服务器程序无响应 procdump -accepteula -64 -ma -h server. ...

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

    #include "Windows.h"#include "DbgHelp.h" int GenerateMiniDump(PEXCEPTION_POINTER ...

  5. 如何设置C++崩溃时生成Dump文件

    Dump 文件是进程的内存镜像 , 可以把程序的执行状态通过调试器保存到dump文件中 ; Dump 文件是用来给驱动程序编写人员调试驱动程序用的 , 这种文件必须用专用工具软件打开 , 比如使用 W ...

  6. 获取崩溃时的调用栈和生成dump文件,然后自动重启

    首先要说明的是:  linux 下 比较方便可以得到 崩溃时的调用栈,win下 比较难办   1. linux 获取调用栈 代码奉上: #include <execinfo.h> //在头 ...

  7. 自动生成.py文件头部的C语言小程序

    每次都 vi xxx.py 然后再打 #!/usr/bin/env python 等等的程序头信息感觉有点麻烦,于是便想着写一个小程序自动生成这些头信息了,顺便在 ~/.bashrc 里写入 alia ...

  8. Qt自动生成.rc文件并配置对应属性 程序图标 版本 描述等

    Qt项目配置文件pro里需要如下配置,进行qmake,build后会自动生成.rc文件,并将对应的信息写入文件中 VERSION = 1.0.0.1 RC_ICONS = "http.ico ...

  9. 调试SQLSERVER (一)生成dump文件的方法

    调试SQLSERVER (一)生成dump文件的方法 调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置调试SQLSERVER (三)使用Windbg调试SQLSERVER ...

随机推荐

  1. JqGrid 使用方法详解

    JQGrid JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGrid Demo 是一个在线的演示项目.在这里,可以知道jqgrid可以做什么事情. 下面 ...

  2. using System.Threading;

    /// <summary> /// 执行动作:耗时而已 /// </summary> private void TestThread(string threadName) { ...

  3. ASP.NET中使用开源插件zTree的小结

    在最近的项目应用中,找到了zTree免费的好东西,这里总结一下: 源码下载:http://www.ztree.me/ 效果是酱紫的: 前台代码: 样式和脚本 <link rel="st ...

  4. (转)设置Win7防火墙规则 顺畅访问局域网

    在Windows 7系统的电脑上搭建WAMP环境后,发现在局域网中其他电脑不能访问.有朋友告诉小强,这可能是因为当时Windows 7自带的防火墙屏蔽了80端口,只需要重新设置规则就可以了. 点击Wi ...

  5. Qt实现桌面动态背景雪花飘落程序

            曾经收到过一份礼物,一个雪花飘落的程序,觉得效果很炫,通过前几篇的学习,我们已经掌握了贴图的一些技巧了,那么现在就可以自己实现了(当然你必须先拥有qt信号与槽的基础知识),这里先看效果 ...

  6. [android]netd与NetworkManagementService初印象

    [功能]Netd是什么,主要负责什么功能 为什么这次会接触Netd主要是因为在设置防火墙时候碰到了.关于Netd可以干什么可以从Netd的源码中CommandListener中得到答案.按照我的理解, ...

  7. [CSS]下拉菜单

    原理:先让下拉菜单隐藏,鼠标移到的时候在显示出来 1>display 无动画效果,图片是秒出 2>opacity 有动画效果,我这里是1S出现,推荐配合绝对定位使用

  8. 数据库(MSSQLServer,Oracle,DB2,MySql)常见语句以及问题

    创建数据库表 create table person ( FName varchar(), FAge int, FRemark varchar(), primary key(FName) ) 基本sq ...

  9. Android桌面悬浮清内存app概述

    今天闲来无事写了一个清内存的小东西,类似360,在桌面上悬浮,点击后清除后台无用程序,清除后台程序是通过调用ActivityManger.killBackgroundProcesses的方式来进行的, ...

  10. PHP中CURL技术模拟登陆抓取网站信息,用与微信公众平台成绩查询

    伴随微信的红火,微信公众平台成为许多开发者的下一个目标.笔者本身对于这种新鲜事物没有如此多的吸引力.但是最近有朋友帮忙开发微信公众平台中一个成绩查询的功能.于是便在空余时间研究了一番. 主要的实现步骤 ...