程序崩溃时,调用DbgHelp生成minidump文件

来源:互联网 发布:公务员数学题软件 编辑:程序博客网 时间:2024/05/20 03:41

用到dbghelp.lib和dbghelp.dll文件,生成minidump文件,直接看代码:

#include <iostream>#include <windows.h>#include <dbghelp.h>#pragma comment(lib, "dbghelp.lib")static LONG WINAPI pfnUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo){if (IsDebuggerPresent()){return EXCEPTION_CONTINUE_SEARCH;}typedef BOOL(WINAPI* MiniDumpWriteDumpT)(HANDLE,DWORD,HANDLE,MINIDUMP_TYPE,PMINIDUMP_EXCEPTION_INFORMATION,PMINIDUMP_USER_STREAM_INFORMATION,PMINIDUMP_CALLBACK_INFORMATION);HMODULE hDbgHelp = LoadLibrary("dbghelp.dll");if (NULL == hDbgHelp){return EXCEPTION_CONTINUE_EXECUTION;}SYSTEMTIME stSysTime;memset(&stSysTime, 0, sizeof(SYSTEMTIME));GetLocalTime(&stSysTime);TCHAR szFile[MAX_PATH] = { 0 };//根据字符集,有时候可能为WCHARwsprintf(szFile, "%0.4d-%0.2d-%0.2d-%0.2d-%0.2d-%0.2d-%0.3d.dmp",\stSysTime.wYear, stSysTime.wMonth, stSysTime.wDay, stSysTime.wHour,\stSysTime.wMinute, stSysTime.wSecond, stSysTime.wMilliseconds);HANDLE hFile = CreateFile(szFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,\0, CREATE_ALWAYS, 0, 0);if (INVALID_HANDLE_VALUE != hFile){MINIDUMP_EXCEPTION_INFORMATION objExInfo;objExInfo.ThreadId = ::GetCurrentThreadId();objExInfo.ExceptionPointers = pExceptionInfo;objExInfo.ClientPointers = NULL;BOOL bOk = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile,\MiniDumpWithDataSegs, (pExceptionInfo ? &objExInfo : NULL), NULL, NULL);CloseHandle(hFile);}FreeLibrary(hDbgHelp);return EXCEPTION_EXECUTE_HANDLER;}int main(int argc, char** argv){SetUnhandledExceptionFilter(pfnUnhandledExceptionFilter);int* pTest = NULL;*pTest = 1;char* pFileName = "./test.txt";WCHAR wszFileName[MAX_PATH] = { 0 };MultiByteToWideChar(CP_ACP, 0, pFileName, strlen(pFileName) + 1, wszFileName, sizeof(wszFileName) / sizeof(wszFileName[0]));getchar();return 0;}

另外一种做法:

#include <iostream>#include <windows.h>#include <dbghelp.h>#pragma comment(lib, "dbghelp.lib")static LONG WINAPI pfnUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo){if (IsDebuggerPresent()){return EXCEPTION_CONTINUE_SEARCH;}typedef BOOL(WINAPI* MiniDumpWriteDumpT)(HANDLE,DWORD,HANDLE,MINIDUMP_TYPE,PMINIDUMP_EXCEPTION_INFORMATION,PMINIDUMP_USER_STREAM_INFORMATION,PMINIDUMP_CALLBACK_INFORMATION);HMODULE hDbgHelp = LoadLibrary("dbghelp.dll");if (NULL == hDbgHelp){return EXCEPTION_CONTINUE_EXECUTION;}MiniDumpWriteDumpT pfnMinidumpWriteDump = NULL;pfnMinidumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");if (NULL == pfnMinidumpWriteDump){FreeLibrary(hDbgHelp);return EXCEPTION_CONTINUE_EXECUTION;}SYSTEMTIME stSysTime;memset(&stSysTime, 0, sizeof(SYSTEMTIME));GetLocalTime(&stSysTime);TCHAR szFile[MAX_PATH] = { 0 };//根据字符集,有时候可能为WCHARwsprintf(szFile, "%0.4d-%0.2d-%0.2d-%0.2d-%0.2d-%0.2d-%0.3d.dmp",\stSysTime.wYear, stSysTime.wMonth, stSysTime.wDay, stSysTime.wHour,\stSysTime.wMinute, stSysTime.wSecond, stSysTime.wMilliseconds);HANDLE hFile = CreateFile(szFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,\0, CREATE_ALWAYS, 0, 0);if (INVALID_HANDLE_VALUE != hFile){MINIDUMP_EXCEPTION_INFORMATION objExInfo;objExInfo.ThreadId = ::GetCurrentThreadId();objExInfo.ExceptionPointers = pExceptionInfo;objExInfo.ClientPointers = NULL;BOOL bOk = pfnMinidumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile,\MiniDumpWithDataSegs, (pExceptionInfo ? &objExInfo : NULL), NULL, NULL);CloseHandle(hFile);}FreeLibrary(hDbgHelp);return EXCEPTION_EXECUTE_HANDLER;}