#include <unistd.h>
+#if defined(WIN32)
+#include <crtdbg.h>
+#endif
+
#if defined(__NetBSD__)
#include <sys/param.h>
#endif
exit(1);
}
- /* In case of general protection fault, don't show GUI popup box */
- SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
+ /*
+ * By default abort() only generates a crash-dump in *non* debug
+ * builds. As our Assert() / ExceptionalCondition() uses abort(),
+ * leaving the default in place would make debugging harder.
+ *
+ * MINGW's own C runtime doesn't have _set_abort_behavior(). When
+ * targetting Microsoft's UCRT with mingw, it never links to the debug
+ * version of the library and thus doesn't need the call to
+ * _set_abort_behavior() either.
+ */
+#if !defined(__MINGW32__) && !defined(__MINGW64__)
+ _set_abort_behavior(_CALL_REPORTFAULT | _WRITE_ABORT_MSG,
+ _CALL_REPORTFAULT | _WRITE_ABORT_MSG);
+#endif /* !defined(__MINGW32__) &&
+ * !defined(__MINGW64__) */
+
+ /*
+ * SEM_FAILCRITICALERRORS causes more errors to be reported to
+ * callers.
+ *
+ * We used to also specify SEM_NOGPFAULTERRORBOX, but that prevents
+ * windows crash reporting from working. Which includes registered
+ * just-in-time debuggers, making it unnecessarily hard to debug
+ * problems on windows. Now we try to disable sources of popups
+ * separately below (note that SEM_NOGPFAULTERRORBOX did not actually
+ * prevent all sources of such popups).
+ */
+ SetErrorMode(SEM_FAILCRITICALERRORS);
+
+ /*
+ * Show errors on stderr instead of popup box (note this doesn't
+ * affect errors originating in the C runtime, see below).
+ */
+ _set_error_mode(_OUT_TO_STDERR);
+
+ /*
+ * In DEBUG builds, errors, including assertions, C runtime errors are
+ * reported via _CrtDbgReport. By default such errors are displayed
+ * with a popup (even with NOGPFAULTERRORBOX), preventing forward
+ * progress. Instead report such errors stderr (and the debugger).
+ * This is C runtime specific and thus the above incantations aren't
+ * sufficient to suppress these popups.
+ */
+ _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+ _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
+ _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
+ _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+ _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
#if defined(_M_AMD64) && _MSC_VER == 1800