C++ 生成dump文件

1int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers) 2{ 3 // 定义函数指针 4 typedef BOOL(WINAPI * MiniDumpWriteDumpT)( 5 HANDLE, 6 DWORD, 7 HANDLE, 8 MINIDUMP_TYPE, 9 PMINIDUMP_EXCEPTION_INFORMATION, 10 PMINIDUMP_USER_STREAM_INFORMATION, 11 PMINIDUMP_CALLBACK_INFORMATION 12 ); 13 // 从 "DbgHelp.dll" 库中获取 "MiniDumpWriteDump" 函数 14 MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL; 15 HMODULE hDbgHelp = LoadLibrary(_T("DbgHelp.dll")); 16 if (NULL == hDbgHelp) 17 { 18 return EXCEPTION_CONTINUE_EXECUTION; 19 } 20 pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump"); 21 22 if (NULL == pfnMiniDumpWriteDump) 23 { 24 FreeLibrary(hDbgHelp); 25 return EXCEPTION_CONTINUE_EXECUTION; 26 } 27 // 创建 dmp 文件件 28 TCHAR szFileName[MAX_PATH] = {0}; 29 TCHAR* szVersion = _T("dump"); 30 SYSTEMTIME stLocalTime; 31 GetLocalTime(&stLocalTime); 32 wsprintf(szFileName, L"%s-%04d%02d%02d-%02d%02d%02d.dmp", 33 szVersion, stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, 34 stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond); 35 HANDLE hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE, 36 FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0); 37 if (INVALID_HANDLE_VALUE == hDumpFile) 38 { 39 FreeLibrary(hDbgHelp); 40 return EXCEPTION_CONTINUE_EXECUTION; 41 } 42 // 写入 dmp 文件 43 MINIDUMP_EXCEPTION_INFORMATION expParam; 44 expParam.ThreadId = GetCurrentThreadId(); 45 expParam.ExceptionPointers = pExceptionPointers; 46 expParam.ClientPointers = FALSE; 47 pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), 48 hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &expParam : NULL), NULL, NULL); 49 // 释放文件 50 CloseHandle(hDumpFile); 51 FreeLibrary(hDbgHelp); 52 return EXCEPTION_EXECUTE_HANDLER; 53} 54 55LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo) 56{ 57 // 这里做一些异常的过滤或提示 58 if (IsDebuggerPresent()) 59 { 60 return EXCEPTION_CONTINUE_SEARCH; 61 } 62 return GenerateMiniDump(lpExceptionInfo); 63} 64 65int main() 66{ 67 // 加入崩溃dump文件功能 68 SetUnhandledExceptionFilter(ExceptionFilter); 69 // 使程序崩溃产生 Dump 文件 70 int *p = NULL; 71 *p=1; 72}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )