src/os/windows/vm/os_windows.cpp

Print this page

        

*** 986,1020 **** static BOOL (WINAPI *_MiniDumpWriteDump)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION); ! void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) { HINSTANCE dbghelp; EXCEPTION_POINTERS ep; MINIDUMP_EXCEPTION_INFORMATION mei; MINIDUMP_EXCEPTION_INFORMATION* pmei; HANDLE hProcess = GetCurrentProcess(); DWORD processId = GetCurrentProcessId(); HANDLE dumpFile; MINIDUMP_TYPE dumpType; static const char* cwd; // Default is to always create dump for debug builds, on product builds only dump on server versions of Windows. #ifndef ASSERT // If running on a client version of Windows and user has not explicitly enabled dumping ! if (!os::win32::is_windows_server() && !CreateMinidumpOnCrash) { VMError::report_coredump_status("Minidumps are not enabled by default on client versions of Windows", false); return; // If running on a server version of Windows and user has explictly disabled dumping ! } else if (os::win32::is_windows_server() && !FLAG_IS_DEFAULT(CreateMinidumpOnCrash) && !CreateMinidumpOnCrash) { VMError::report_coredump_status("Minidump has been disabled from the command line", false); return; } #else ! if (!FLAG_IS_DEFAULT(CreateMinidumpOnCrash) && !CreateMinidumpOnCrash) { VMError::report_coredump_status("Minidump has been disabled from the command line", false); return; } #endif --- 986,1030 ---- static BOOL (WINAPI *_MiniDumpWriteDump)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION); ! void os::check_create_dump_limit(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) { ! // First presume we can dump core file, detail checking done in abort() ! jio_snprintf(buffer, bufferSize, "%s\\hs_err_pid%u.mdmp", get_current_directory(NULL, 0), current_process_id()); ! VMError::report_coredump_status(buffer, true); ! } ! ! void os::abort(bool dump_core, void* exceptionRecord, void* contextRecord) { HINSTANCE dbghelp; EXCEPTION_POINTERS ep; MINIDUMP_EXCEPTION_INFORMATION mei; MINIDUMP_EXCEPTION_INFORMATION* pmei; HANDLE hProcess = GetCurrentProcess(); DWORD processId = GetCurrentProcessId(); HANDLE dumpFile; MINIDUMP_TYPE dumpType; static const char* cwd; + static char buffer[O_BUFLEN]; + + os::shutdown(); + if (!dump_core) return; // Default is to always create dump for debug builds, on product builds only dump on server versions of Windows. #ifndef ASSERT // If running on a client version of Windows and user has not explicitly enabled dumping ! if (!os::win32::is_windows_server() && !CreateCoredumpOnCrash) { VMError::report_coredump_status("Minidumps are not enabled by default on client versions of Windows", false); return; // If running on a server version of Windows and user has explictly disabled dumping ! } else if (os::win32::is_windows_server() && !FLAG_IS_DEFAULT(CreateCoredumpOnCrash) && !CreateCoredumpOnCrash) { VMError::report_coredump_status("Minidump has been disabled from the command line", false); return; } #else ! if (!FLAG_IS_DEFAULT(CreateCoredumpOnCrash) && !CreateCoredumpOnCrash) { VMError::report_coredump_status("Minidump has been disabled from the command line", false); return; } #endif
*** 1046,1062 **** dumpType = (MINIDUMP_TYPE)(dumpType | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules); #endif cwd = get_current_directory(NULL, 0); ! jio_snprintf(buffer, bufferSize, "%s\\hs_err_pid%u.mdmp", cwd, current_process_id()); dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (dumpFile == INVALID_HANDLE_VALUE) { VMError::report_coredump_status("Failed to create file for dumping", false); return; } if (exceptionRecord != NULL && contextRecord != NULL) { ep.ContextRecord = (PCONTEXT) contextRecord; ep.ExceptionRecord = (PEXCEPTION_RECORD) exceptionRecord; mei.ThreadId = GetCurrentThreadId(); --- 1056,1073 ---- dumpType = (MINIDUMP_TYPE)(dumpType | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules); #endif cwd = get_current_directory(NULL, 0); ! jio_snprintf(buffer, sizeof(buffer), "%s\\hs_err_pid%u.mdmp", cwd, current_process_id()); dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (dumpFile == INVALID_HANDLE_VALUE) { VMError::report_coredump_status("Failed to create file for dumping", false); return; } + if (exceptionRecord != NULL && contextRecord != NULL) { ep.ContextRecord = (PCONTEXT) contextRecord; ep.ExceptionRecord = (PEXCEPTION_RECORD) exceptionRecord; mei.ThreadId = GetCurrentThreadId();
*** 1077,1104 **** if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, 0, (LPTSTR)&msgbuf, 0, NULL) != 0) { ! jio_snprintf(buffer, bufferSize, "Call to MiniDumpWriteDump() failed (Error 0x%x: %s)", error, msgbuf); LocalFree(msgbuf); } else { // Call to FormatMessage failed, just include the result from GetLastError ! jio_snprintf(buffer, bufferSize, "Call to MiniDumpWriteDump() failed (Error 0x%x)", error); } VMError::report_coredump_status(buffer, false); } else { VMError::report_coredump_status(buffer, true); } CloseHandle(dumpFile); - } - - - void os::abort(bool dump_core) { - os::shutdown(); - // no core dump on Windows win32::exit_process_or_thread(win32::EPT_PROCESS, 1); } // Die immediately, no exit hook, no abort hook, no cleanup. void os::die() { --- 1088,1109 ---- if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, 0, (LPTSTR)&msgbuf, 0, NULL) != 0) { ! jio_snprintf(buffer, sizeof(buffer), "Call to MiniDumpWriteDump() failed (Error 0x%x: %s)", error, msgbuf); LocalFree(msgbuf); } else { // Call to FormatMessage failed, just include the result from GetLastError ! jio_snprintf(buffer, sizeof(buffer), "Call to MiniDumpWriteDump() failed (Error 0x%x)", error); } VMError::report_coredump_status(buffer, false); } else { VMError::report_coredump_status(buffer, true); } CloseHandle(dumpFile); win32::exit_process_or_thread(win32::EPT_PROCESS, 1); } // Die immediately, no exit hook, no abort hook, no cleanup. void os::die() {