C++代码中,使用DbgHelp模块的MINIDUMP编程生成

#include "DbgHelp.h"
typedef BOOL (WINAPI* MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,
CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam); long CSE_Exception::_DbgDumpError(struct _EXCEPTION_POINTERS *excpInfo, LPCTSTR szPrex )
{ LONG retval = EXCEPTION_CONTINUE_SEARCH; HMODULE hDll = ::LoadLibrary(_T("DBGHELP.DLL"));
LPCTSTR szResult = NULL;
MINIDUMPWRITEDUMP pDump = NULL; if (hDll)
pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(hDll,"MiniDumpWriteDump"); if (pDump)
{
TCHAR szDumpPath [_MAX_PATH] = {0};
TCHAR szDumpFile [_MAX_PATH] = {0};
GetModuleFileName(NULL, szDumpPath, _MAX_PATH);
_tcsrchr(szDumpPath, _T('\\'))[1] = 0;
_tcscat(szDumpPath, _T("..\\logs\")); time_t timeCurrent = time(0);
struct tm* tmc = localtime(&timeCurrent);
if ( tmc )
_stprintf(szDumpFile, _T("%s%d_%d_%d_%d_%d.dmp"), szPrex, tmc->tm_mon+1, tmc->tm_mday, tmc->tm_hour, tmc->tm_min, tmc->tm_sec);
else
_tcscpy(szDumpFile, _T("error.dmp"));
_tcscat(szDumpPath, szDumpFile); // create the file
HANDLE hFile = ::CreateFile( szDumpPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL ); if (hFile!=INVALID_HANDLE_VALUE)
{
if (excpInfo == NULL) //如果没有传入异常, 比如是在程序里面调用的, 生成一个异常
{
// Generate exception to get proper context in dump DWORD dwSize = 0;
char *sz = "_EXCEPTION_POINTERS is null";
::WriteFile(hFile, sz, strlen(sz), &dwSize, NULL);
}
else
{
MINIDUMP_EXCEPTION_INFORMATION eInfo;
eInfo.ThreadId = GetCurrentThreadId(); //把需要的信息添进去
eInfo.ExceptionPointers = excpInfo;
eInfo.ClientPointers = FALSE; // Dump的类型是小型的, 节省空间. 可以参考MSDN生成更详细的Dump.
pDump(
GetCurrentProcess(),
GetCurrentProcessId(),
hFile,
MiniDumpNormal,
excpInfo ? &eInfo : NULL,
NULL,
NULL);
}
::CloseHandle(hFile); }
}
if( hDll )
::FreeLibrary(hDll); return retval;
} void CSE_Exception::InitSEException()
{
_set_se_translator( CSE_Exception::trans_func );
} void CSE_Exception::_DumpCallStack()
{
__try
{
__try
{
RaiseException(1, 0, 0, NULL);
}
__finally
{
}
}
__except(_DbgDumpError(GetExceptionInformation(), _T("T")),
EXCEPTION_CONTINUE_EXECUTION)
{
}
} void CSE_Exception::trans_func( unsigned int uSENum, _EXCEPTION_POINTERS* pExp )
{
#define SE_BUF_SIZE 250
TCHAR pszBuf[SE_BUF_SIZE+2]; _DbgDumpError(pExp, _T("e"));
switch(uSENum)
{
case EXCEPTION_ACCESS_VIOLATION:
_sntprintf(pszBuf, SE_BUF_SIZE, _T("Access Violation: IP: 0xX %s Address: 0xX"),
pExp->ExceptionRecord->ExceptionAddress, pExp->ExceptionRecord->ExceptionInformation[0]?_T("Write"):_T("Read"), pExp->ExceptionRecord->ExceptionInformation[1]);
break;
case EXCEPTION_INT_DIVIDE_BY_ZERO:
_sntprintf(pszBuf, SE_BUF_SIZE, _T("INT_DIVIDE_BY_ZERO"));
break;
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
_sntprintf(pszBuf, SE_BUF_SIZE, _T("FLT_DIVIDE_BY_ZERO"));
break;
case EXCEPTION_ILLEGAL_INSTRUCTION:
_sntprintf(pszBuf, SE_BUF_SIZE, _T("ILLEGAL_INSTRUCTION"));
break;
case EXCEPTION_PRIV_INSTRUCTION:
_sntprintf(pszBuf, SE_BUF_SIZE, _T("EXCEPTION_PRIV_INSTRUCTION"));
break;
case EXCEPTION_STACK_OVERFLOW:
_sntprintf(pszBuf, SE_BUF_SIZE, _T("EXCEPTION_STACK_OVERFLOW"));
break;
default:
_sntprintf(pszBuf, SE_BUF_SIZE, _T("Unknown SE_exception: X"), uSENum);
break;
} CSE_Exception e(pszBuf);
e.m_nSENumber = uSENum;
e.m_SERecord = *(pExp->ExceptionRecord);
e.m_SEContext = *(pExp->ContextRecord); throw e;
}

  然后在程序的InitInstance中加入代码如下:

LONG WINAPI DbgUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
CSE_Exception::_DbgDumpError(pExceptionInfo, _T("E"));
return EXCEPTION_CONTINUE_SEARCH; // 程序停止运行
}
BOOL CDCPWorkerApp::InitInstance()
{
//EHA
CSE_Exception::InitSEException();
//捕获未处理的异常
SetUnhandledExceptionFilter(DbgUnhandledExceptionFilter);
}

  

C++生成dump文件的更多相关文章

  1. 使用dbghelp生成dump文件以及事后调试分析

    前言 在产品的实际应用环境中,如果我们的程序在客户那里出现了问题,例如程序异常了,而这个时候的现象又不能还原或者很难还原重现,那么只有使用dump文件来保存程序的当前运行信息,例如调用堆栈等,同时使用 ...

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

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

  3. 程序自动生成Dump文件

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

  4. 如何生成Dump文件

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何生成Dump文件.

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

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

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

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

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

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

  8. JVM在遇到OOM(OutOfMemoryError)时生成Dump文件

    方法一: 命令:jmap -dump:format=b,file=heap.bin file:保存路径及文件名pid:进程编号(windows通过任务管理器查看,linux通过ps aux查看) du ...

  9. WinDBG 技巧:如何生成Dump 文件(.dump 命令)

    程序崩溃(crash)的时候, 为了以后能够调试分析问题, 可以使用WinDBG要把当时程序内存空间数据都保存下来,生成的文件称为dump 文件. 步骤: 1) 打开WinDBG并将之Attach 到 ...

  10. windows生成dump文件

    windows下程序有时突然崩溃了,偶发性的崩溃很难找.于是就需要保存崩溃时的dump信息了. 下面是关于如何生成dmp文件的代码. 头文件 #pragma once #include <win ...

随机推荐

  1. 在suse上折腾iptables

    需求背景:有台服务器希望屏蔽掉某IP对它的SSH连接. 临时客串下DevOps,下面的做法可能在专业运维的同学里不太专业,还请指教. 该服务器的操作系统是SuSE Linux,服务器上是安装了ipta ...

  2. App Extensions篇之Sticker Pack Extension

    转载请标明原文链接:http://www.cnblogs.com/zhanggui/p/7151795.html 前言 上一篇文章对App Extension做了简单介绍以及对Share Extens ...

  3. 在ubuntu下使用minicom连接交换机/路由器Console口

    首先下载并安装minicom sudo apt-get install minicom 然后将Console线一端连上交换机的Console口,另一端连上电脑(我这里是通过USB口连接的) 然后查看对 ...

  4. Python中的元类(metaclass)

    推荐+收藏:深刻理解Python中的元类(metaclass) 做一些笔记学习学习: 在大多数编程语言中,类就是用来描述如何生成一个对象的代码段,在Python中类也是一个对象,这个(类)对象自身拥有 ...

  5. 使用Spring boot + jQuery上传文件(kotlin)

    文件上传也是常见的功能,趁着周末,用Spring boot来实现一遍. 前端部分 前端使用jQuery,这部分并不复杂,jQuery可以读取表单内的文件,这里可以通过formdata对象来组装键值对, ...

  6. 【转载】java InputStream读取数据问题

    原文链接:http://www.cnblogs.com/MyFavorite/archive/2010/10/19/1855758.html 1. 关于InputStream.read()     在 ...

  7. 文本三剑客---gawk基础

    gawk程序是Unix中原始awk程序的GNU版本.gawk程序让流编辑器迈上了一个新的台阶,它提供了一种编程语言而不只是编辑器命令.在gawk编程语言中,可以完成下面的事情: (1)定义变量来保存数 ...

  8. maven引入已经拥有的jar包

    <!-- https://mvnrepository.com/artifact/jfree/jcommon --><dependency>    <groupId> ...

  9. Ubuntu上安装PHP环境-mysql+apache+php-Linux操作系统

    安装MYSQL   1. sudo apt-get install mysql-server 或者 apt-get isntall mysql-client   2. 安装过程中会提示设置密码,注意设 ...

  10. Experience of Python Learning Week 1

    1.The founder of python is Guido van Rossum ,he created it on Christmas in 1989, smriti of ABC langu ...