From 4979447881836c86f0bf24a164d3ca920323f9eb Mon Sep 17 00:00:00 2001
From: Andres Freund
Date: Thu, 9 Sep 2021 17:49:39 -0700
Subject: [PATCH v6 1/2] windows: Improve crash / assert / exception handling.
---
src/backend/main/main.c | 48 +++++++++++++++++++++++++++++++++++++++--
.cirrus.yml | 6 +++++-
2 files changed, 51 insertions(+), 3 deletions(-)
diff --git a/src/backend/main/main.c b/src/backend/main/main.c
index 9124060bde7..111e7867cc7 100644
--- a/src/backend/main/main.c
+++ b/src/backend/main/main.c
@@ -22,6 +22,10 @@
#include
+#if defined(WIN32)
+#include
+#endif
+
#if defined(__NetBSD__)
#include
#endif
@@ -237,8 +241,48 @@ startup_hacks(const char *progname)
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.
+ */
+#if !defined(__MINGW32__) && !defined(__MINGW64__)
+ _set_abort_behavior(_CALL_REPORTFAULT | _WRITE_ABORT_MSG,
+ _CALL_REPORTFAULT | _WRITE_ABORT_MSG);
+#endif /* MINGW */
+
+ /*
+ * 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. Now we try to disable sources of popups
+ * separately below (note that SEM_NOGPFAULTERRORBOX didn't 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
diff --git a/.cirrus.yml b/.cirrus.yml
index 19b3737fa11..89fbff14abb 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -423,7 +423,11 @@ task:
- cd src/tools/msvc
- perl vcregress.pl ecpgcheck
- on_failure: *on_failure
+ on_failure:
+ <<: *on_failure
+ crashlog_artifacts:
+ path: "crashlog-**.txt"
+ type: text/plain
task:
--
2.34.0