dump.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include <Windows.h>
  2. #include <DbgHelp.h>
  3. #include "dump.h"
  4. int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers) {
  5. typedef BOOL(WINAPI * MiniDumpWriteDumpT)(
  6. HANDLE,
  7. DWORD,
  8. HANDLE,
  9. MINIDUMP_TYPE,
  10. PMINIDUMP_EXCEPTION_INFORMATION,
  11. PMINIDUMP_USER_STREAM_INFORMATION,
  12. PMINIDUMP_CALLBACK_INFORMATION
  13. );
  14. MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;
  15. HMODULE hDbgHelp = LoadLibrary(L"dbghelp.dll");
  16. if (NULL == hDbgHelp) {
  17. return EXCEPTION_CONTINUE_EXECUTION;
  18. }
  19. pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
  20. if (NULL == pfnMiniDumpWriteDump) {
  21. FreeLibrary(hDbgHelp);
  22. return EXCEPTION_CONTINUE_EXECUTION;
  23. }
  24. TCHAR szFileName[MAX_PATH] = { 0 };
  25. //TCHAR* szVersion = SOFTWARE_VERSION;
  26. // convert flutter version chat to tchar
  27. TCHAR szVersion[MAX_PATH] = { 0 };
  28. const char* pszMultiByteVersion = FLUTTER_VERSION;
  29. int iSize = MultiByteToWideChar(CP_ACP, 0, pszMultiByteVersion , -1, NULL, 0);
  30. MultiByteToWideChar(CP_ACP, 0, pszMultiByteVersion, -1, szVersion, iSize);
  31. SYSTEMTIME stLocalTime;
  32. GetLocalTime(&stLocalTime);
  33. wsprintf(szFileName, L"%04d%02d%02d_%02d%02d%02d_%s.dmp",
  34. stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
  35. stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond, szVersion);
  36. HANDLE hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE,
  37. FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
  38. if (INVALID_HANDLE_VALUE == hDumpFile) {
  39. FreeLibrary(hDbgHelp);
  40. return EXCEPTION_CONTINUE_EXECUTION;
  41. }
  42. MINIDUMP_EXCEPTION_INFORMATION expParam;
  43. expParam.ThreadId = GetCurrentThreadId();
  44. expParam.ExceptionPointers = pExceptionPointers;
  45. expParam.ClientPointers = FALSE;
  46. pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
  47. hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &expParam : NULL), NULL, NULL);
  48. CloseHandle(hDumpFile);
  49. FreeLibrary(hDbgHelp);
  50. return EXCEPTION_EXECUTE_HANDLER;
  51. }
  52. LONG ApplicationCrashHandler(LPEXCEPTION_POINTERS lpExceptionInfo){
  53. if (IsDebuggerPresent()) {
  54. return EXCEPTION_CONTINUE_SEARCH;
  55. }
  56. return GenerateMiniDump(lpExceptionInfo);
  57. }