24 typedef BOOL (WINAPI *MiniDumpWriteDumpFunc) (
29 IN CONST PMINIDUMP_EXCEPTION_INFORMATION, OPTIONAL
30 IN CONST PMINIDUMP_USER_STREAM_INFORMATION, OPTIONAL
31 IN CONST PMINIDUMP_CALLBACK_INFORMATION OPTIONAL
35 void CreateWin32MiniDump(_EXCEPTION_POINTERS* pep) {
36 char temp_path[MAX_PATH];
37 GetTempPathA(
sizeof(temp_path), temp_path);
38 char temp_file[MAX_PATH];
39 sprintf(temp_file,
"%s\\ninja_crash_dump_%lu.dmp",
40 temp_path, GetCurrentProcessId());
43 DeleteFileA(temp_file);
47 HMODULE dbghelp = LoadLibraryA(
"dbghelp.dll");
48 if (dbghelp == NULL) {
49 Error(
"failed to create minidump: LoadLibrary('dbghelp.dll'): %s",
50 GetLastErrorString().c_str());
54 MiniDumpWriteDumpFunc mini_dump_write_dump = FunctionCast
55 <MiniDumpWriteDumpFunc>(GetProcAddress(dbghelp,
"MiniDumpWriteDump"));
56 if (mini_dump_write_dump == NULL) {
57 Error(
"failed to create minidump: GetProcAddress('MiniDumpWriteDump'): %s",
58 GetLastErrorString().c_str());
62 HANDLE hFile = CreateFileA(temp_file, GENERIC_READ | GENERIC_WRITE, 0, NULL,
63 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
65 Error(
"failed to create minidump: CreateFileA(%s): %s",
66 temp_file, GetLastErrorString().c_str());
70 MINIDUMP_EXCEPTION_INFORMATION mdei;
71 mdei.ThreadId = GetCurrentThreadId();
72 mdei.ExceptionPointers = pep;
73 mdei.ClientPointers = FALSE;
74 MINIDUMP_TYPE mdt = (MINIDUMP_TYPE) (MiniDumpWithDataSegs |
75 MiniDumpWithHandleData);
77 BOOL rv = mini_dump_write_dump(GetCurrentProcess(), GetCurrentProcessId(),
78 hFile, mdt, (pep != 0) ? &mdei : 0, 0, 0);
82 Error(
"MiniDumpWriteDump failed: %s", GetLastErrorString().c_str());
86 Warning(
"minidump created: %s", temp_file);
void Error(const char *msg, va_list ap)
void Warning(const char *msg, va_list ap)