有时,在我们的程序运行的时候,会遇到一些崩溃问题,尤其是概率出现的时候,如果能捕获其异常,那么对于我们快速定位bug是很有帮助的
这里借用网上搜寻回来的函数,记录一下:
头文件及库:
1 #include <dbghelp.h> 2 #pragma comment ( lib, "dbghelp.lib" )
1 wstring GetPresentTime() 2 { 3 SYSTEMTIME time; 4 GetLocalTime(&time); 5 6 TCHAR wszTime[128]; 7 swprintf_s(wszTime, _T("%04d-%02d-%02d %02d-%02d-%02d-%03d"), time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond, time.wMilliseconds); 8 9 return wstring(wszTime); 10 } 11 12 void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException) 13 { 14 // 创建Dump文件 15 // 16 HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 17 18 // Dump信息 19 // 20 MINIDUMP_EXCEPTION_INFORMATION dumpInfo; 21 dumpInfo.ExceptionPointers = pException; 22 dumpInfo.ThreadId = GetCurrentThreadId(); 23 dumpInfo.ClientPointers = TRUE; 24 25 // 写入Dump文件内容 26 // 27 MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL); 28 29 CloseHandle(hDumpFile); 30 } 31 32 LONG CallBackCrashHandler(EXCEPTION_POINTERS *pException) 33 { 34 MessageBox(NULL,L"你的程序 遇到一个错误,已停止运行,请重新启动",L"错误",MB_OK); 35 36 // 以当前时间为文件名 37 // 38 TCHAR szModuleDir[128]; 39 DWORD dwLength=GetModuleFileName(NULL,szModuleDir,128); 40 41 for(DWORD dw=dwLength-1;dw>0;dw--) 42 { 43 if(szModuleDir[dw]==‘\\‘) 44 { 45 szModuleDir[dw+1]=0; 46 break; 47 } 48 } 49 50 wstring strDumpFileName = szModuleDir + GetPresentTime() +_T(".dmp"); 51 52 // 创建Dump文件 53 // 54 CreateDumpFile(strDumpFileName.data(), pException); 55 56 return EXCEPTION_EXECUTE_HANDLER; 57 }
调用:
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CallBackCrashHandler);
也许有些bug不能抓到,例如刚开始的一些初始化信息时的异常,不过大部分还是可以的
会提供小小的帮助。
时间: 2024-10-08 02:32:51