From 2863f0c17d4eaf04b8f90d743bf6d5da3b58bb30 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 9 Sep 2021 17:49:39 -0700 Subject: [PATCH v4 2/2] windows: Improve crash / assert / exception handling. --- src/backend/main/main.c | 45 +++++++++++++++++++++++++++++++++++++++-- .cirrus.yml | 6 ++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/backend/main/main.c b/src/backend/main/main.c index ad84a45e28c..5115ad91898 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -26,6 +26,10 @@ #include #endif +#if defined(WIN32) +#include +#endif + #if defined(_M_AMD64) && _MSC_VER == 1800 #include #include @@ -237,8 +241,45 @@ startup_hacks(const char *progname) exit(1); } - /* In case of general protection fault, don't show GUI popup box */ - SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); + /* + * 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 several sources of 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); + + + /* + * 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. + */ +#ifndef __MINGW64__ + _set_abort_behavior(_CALL_REPORTFAULT | _WRITE_ABORT_MSG, + _CALL_REPORTFAULT | _WRITE_ABORT_MSG); +#endif + + /* + * In case of errors (including assertions) on the C runtime level, + * report them to stderr (and the debugger) instead of displaying a + * popup. This is C runtime specific and thus the above incantations + * aren't sufficient to suppress these popups. + */ + _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); + _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); #if defined(_M_AMD64) && _MSC_VER == 1800 diff --git a/.cirrus.yml b/.cirrus.yml index 4116e0155dc..3ffb3f3d67f 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -415,6 +415,12 @@ task: - cd src/tools/msvc - perl vcregress.pl ecpgcheck + always: + cores_script: cat crashlog.txt || true + dump_artifacts: + path: "crashlog.txt" + type: text/plain + on_failure: *on_failure -- 2.34.0