minidump.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "stdafx.h"
  2. #include <strsafe.h>
  3. #include "minidupm.h"
  4. int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExceptionPointers, PWCHAR pwAppName)
  5. {
  6. BOOL bOwnDumpFile = FALSE;
  7. HANDLE hDumpFile = hFile;
  8. MINIDUMP_EXCEPTION_INFORMATION ExpParam;
  9. typedef BOOL(WINAPI * MiniDumpWriteDumpT)(
  10. HANDLE,
  11. DWORD,
  12. HANDLE,
  13. MINIDUMP_TYPE,
  14. PMINIDUMP_EXCEPTION_INFORMATION,
  15. PMINIDUMP_USER_STREAM_INFORMATION,
  16. PMINIDUMP_CALLBACK_INFORMATION
  17. );
  18. MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;
  19. HMODULE hDbgHelp = LoadLibrary(L"DbgHelp.dll");
  20. if (hDbgHelp)
  21. pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
  22. if (pfnMiniDumpWriteDump)
  23. {
  24. if (hDumpFile == NULL || hDumpFile == INVALID_HANDLE_VALUE)
  25. {
  26. TCHAR szPath[MAX_PATH] = { 0 };
  27. TCHAR szFileName[MAX_PATH] = { 0 };
  28. TCHAR* szAppName = pwAppName;
  29. TCHAR* szVersion = L"v1.0";
  30. TCHAR dwBufferSize = MAX_PATH;
  31. SYSTEMTIME stLocalTime;
  32. GetLocalTime(&stLocalTime);
  33. GetTempPath(dwBufferSize, szPath);
  34. StringCchPrintf(szFileName, MAX_PATH, L"%s%s", szPath, szAppName);
  35. CreateDirectory(szFileName, NULL);
  36. StringCchPrintf(szFileName, MAX_PATH, L"%s%s//%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp",
  37. szPath, szAppName, szVersion,
  38. stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
  39. stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond,
  40. GetCurrentProcessId(), GetCurrentThreadId());
  41. hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE,
  42. FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
  43. bOwnDumpFile = TRUE;
  44. OutputDebugString(szFileName);
  45. }
  46. if (hDumpFile != INVALID_HANDLE_VALUE)
  47. {
  48. ExpParam.ThreadId = GetCurrentThreadId();
  49. ExpParam.ExceptionPointers = pExceptionPointers;
  50. ExpParam.ClientPointers = FALSE;
  51. pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
  52. hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &ExpParam : NULL), NULL, NULL);
  53. if (bOwnDumpFile)
  54. CloseHandle(hDumpFile);
  55. }
  56. }
  57. if (hDbgHelp != NULL)
  58. FreeLibrary(hDbgHelp);
  59. return EXCEPTION_EXECUTE_HANDLER;
  60. }
  61. LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
  62. {
  63. if (IsDebuggerPresent())
  64. {
  65. return EXCEPTION_CONTINUE_SEARCH;
  66. }
  67. return GenerateMiniDump(NULL, lpExceptionInfo, L"YAServer");
  68. }