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}
C++ 生成dump文件
Stella981
2021-10-11
1229 0 0
点赞
收藏
评论区
加载中...