15 #ifndef NINJA_BOOTSTRAP
23 typedef BOOL (WINAPI *MiniDumpWriteDumpFunc) (
30 IN CONST PMINIDUMP_CALLBACK_INFORMATION
OPTIONAL
35 char temp_path[MAX_PATH];
36 GetTempPath(
sizeof(temp_path), temp_path);
37 char temp_file[MAX_PATH];
38 sprintf(temp_file,
"%s\\ninja_crash_dump_%d.dmp",
39 temp_path, GetCurrentProcessId());
42 DeleteFile(temp_file);
46 HMODULE dbghelp = LoadLibrary(
"dbghelp.dll");
47 if (dbghelp == NULL) {
48 Error(
"failed to create minidump: LoadLibrary('dbghelp.dll'): %s",
49 GetLastErrorString().c_str());
53 MiniDumpWriteDumpFunc mini_dump_write_dump =
54 (MiniDumpWriteDumpFunc)GetProcAddress(dbghelp,
"MiniDumpWriteDump");
55 if (mini_dump_write_dump == NULL) {
56 Error(
"failed to create minidump: GetProcAddress('MiniDumpWriteDump'): %s",
57 GetLastErrorString().c_str());
61 HANDLE hFile = CreateFileA(temp_file, GENERIC_READ | GENERIC_WRITE, 0, NULL,
62 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
64 Error(
"failed to create minidump: CreateFileA(%s): %s",
65 temp_file, GetLastErrorString().c_str());
69 MINIDUMP_EXCEPTION_INFORMATION mdei;
70 mdei.ThreadId = GetCurrentThreadId();
71 mdei.ExceptionPointers = pep;
72 mdei.ClientPointers = FALSE;
74 MiniDumpWithHandleData);
76 BOOL rv = mini_dump_write_dump(GetCurrentProcess(), GetCurrentProcessId(),
77 hFile, mdt, (pep != 0) ? &mdei : 0, 0, 0);
81 Error(
"MiniDumpWriteDump failed: %s", GetLastErrorString().c_str());
85 Warning(
"minidump created: %s", temp_file);
88 #endif // NINJA_BOOTSTRAP
IN IN IN IN CONST PMINIDUMP_EXCEPTION_INFORMATION
IN IN IN IN CONST OPTIONAL IN CONST OPTIONAL IN CONST PMINIDUMP_CALLBACK_INFORMATION OPTIONAL
void CreateWin32MiniDump(_EXCEPTION_POINTERS *pep)
Creates a windows minidump in temp folder.
IN IN IN IN CONST OPTIONAL IN CONST PMINIDUMP_USER_STREAM_INFORMATION
typedef BOOL(WINAPI *MiniDumpWriteDumpFunc)(IN HANDLE
void Warning(const char *msg,...)
Log a warning message.
void Error(const char *msg,...)
Log an error message.