中间件底层,websocket

CrashException.h 2.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #ifndef CRASH_EXCEPTION_H
  2. #define CRASH_EXCEPTION_H
  3. /**********************************************************************
  4. *@projectName CrashTest
  5. *@brief windows捕获全局异常写本地dump文件
  6. **********************************************************************/
  7. /*
  8. ****************************************************************************************************
  9. * windows平台建议选择MSVC编译器,可以用vs定位到出错代码行
  10. ****************************************************************************************************
  11. */
  12. #ifdef _WIN32
  13. #include <TCHAR.h>
  14. #include "Windows.h"
  15. #include "DbgHelp.h"
  16. int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers)
  17. {
  18. // 定义函数指针
  19. typedef BOOL(WINAPI * MiniDumpWriteDumpT)(
  20. HANDLE,
  21. DWORD,
  22. HANDLE,
  23. MINIDUMP_TYPE,
  24. PMINIDUMP_EXCEPTION_INFORMATION,
  25. PMINIDUMP_USER_STREAM_INFORMATION,
  26. PMINIDUMP_CALLBACK_INFORMATION
  27. );
  28. // 从 "DbgHelp.dll" 库中获取 "MiniDumpWriteDump" 函数
  29. MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;
  30. HMODULE hDbgHelp = LoadLibrary(_T("DbgHelp.dll"));
  31. if (NULL == hDbgHelp)
  32. {
  33. return EXCEPTION_CONTINUE_EXECUTION;
  34. }
  35. pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
  36. if (NULL == pfnMiniDumpWriteDump)
  37. {
  38. FreeLibrary(hDbgHelp);
  39. return EXCEPTION_CONTINUE_EXECUTION;
  40. }
  41. // 创建 dmp 文件
  42. TCHAR szFileName[MAX_PATH] = { 0 };
  43. SYSTEMTIME stLocalTime;
  44. GetLocalTime(&stLocalTime);
  45. sprintf_s(szFileName, MAX_PATH, "wsServer_%04d%02d%02d-%02d%02d%02d.dmp",
  46. stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
  47. stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond);
  48. HANDLE hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE,
  49. FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
  50. if (INVALID_HANDLE_VALUE == hDumpFile)
  51. {
  52. FreeLibrary(hDbgHelp);
  53. return EXCEPTION_CONTINUE_EXECUTION;
  54. }
  55. // 写入 dmp 文件
  56. MINIDUMP_EXCEPTION_INFORMATION expParam;
  57. expParam.ThreadId = GetCurrentThreadId();
  58. expParam.ExceptionPointers = pExceptionPointers;
  59. expParam.ClientPointers = FALSE;
  60. pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
  61. hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &expParam : NULL), NULL, NULL);
  62. // 释放文件
  63. CloseHandle(hDumpFile);
  64. FreeLibrary(hDbgHelp);
  65. GetDingDing()->Push("wsServer服务异常关闭,请尽快重启");
  66. return EXCEPTION_EXECUTE_HANDLER;
  67. }
  68. LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
  69. {
  70. // 这里做一些异常的过滤或提示
  71. if (IsDebuggerPresent())
  72. {
  73. return EXCEPTION_CONTINUE_SEARCH;
  74. }
  75. return GenerateMiniDump(lpExceptionInfo);
  76. }
  77. #endif // _WIN32
  78. #endif // CRASH_EXCEPTION_H