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