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. angularJS 源码阅读之一:toDebugString

    简介: 这个函数返回调试字符串: number,boolean,string,null,undefined,都会转为字符串. function 中括号前面有空格的,会去除函数体,没空格的,会输出函数的 ...

  2. Ant部署(linux)

    1.下载 mkdir /opt/ant cd /opt/ant wget http://mirror.bit.edu.cn/apache//ant/binaries/apache-ant-1.9.4- ...

  3. 交叉编译 tesseract

      官方参考资料说明: tesseract 依赖库: (https://github.com/tesseract-ocr/tesseract/wiki/Compiling#linux) leptoni ...

  4. 《javascript 高级程序设计》笔记

    1-4章 1.变量①.ECMAScript 变量是松散类型的,也就是说可以用来保存任何类型的数据.换句话说每个变量仅仅是一个用于保存值的占位符.②.如果在函数中使用var定义一个变量,那么这个变量在函 ...

  5. HashSet TreeSet 源码

    1 HashSet 1.1 父类 java.lang.Object 继承者 java.util.AbstractCollection<E> 继承者 java.util.AbstractSe ...

  6. 机器学习 —— 类不平衡问题与SMOTE过采样算法

    在前段时间做本科毕业设计的时候,遇到了各个类别的样本量分布不均的问题——某些类别的样本数量极多,而有些类别的样本数量极少,也就是所谓的类不平衡(class-imbalance)问题. 本篇简述了以下内 ...

  7. 【SpringMVC】使用SpringMVC进行上传文件!

    写在前面: 之前在上传文件的时候,使用的是commons-file-upload这个插件,非常方便,能控制每个文件的大小,总共大小,缓存,以及支持多个文件的同时上传,但是写一次上传文件的后台代码量太大 ...

  8. python3之微信文章爬虫

    前提: python3.4 windows 作用:通过搜狗的微信搜索接口http://weixin.sogou.com/来搜索相关微信文章,并将标题及相关链接导入Excel表格中 说明:需xlsxwr ...

  9. 【css】border-image

    1. border-image 一个新css3 样式 给边框增加图片,还可以拉升 或重复图片 round 为重复 sketch 为拉升 border: 15px solid transparent; ...

  10. HTML随笔2

    1. 快捷键: * div*8 + tab键 - 可快捷出现八个div标签. * 标签名."名称" + tab键 - 可快速出现类名为"名称"的该标签,如果不加 ...