From 6f65a15bb9a91b9f5314ad1ff85229b348d30a6e Mon Sep 17 00:00:00 2001 From: Stenzek Date: Thu, 17 Jul 2025 21:17:06 +1000 Subject: [PATCH] CrashHandler: Catch SIGABRT --- src/common/crash_handler.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/common/crash_handler.cpp b/src/common/crash_handler.cpp index 45d4cc933..88804f4cb 100644 --- a/src/common/crash_handler.cpp +++ b/src/common/crash_handler.cpp @@ -6,6 +6,7 @@ #include "file_system.h" #include "string_util.h" #include +#include #include #include @@ -195,6 +196,21 @@ static void PureCallHandler() __fastfail(FAST_FAIL_INVALID_ARG); } +static void AbortSignalHandler(int signal) +{ + // if the debugger is attached, or we're recursively crashing, let it take care of it. + if (!s_in_crash_handler && !IsDebuggerPresent()) + { + s_in_crash_handler = true; + if (s_cleanup_handler) + s_cleanup_handler(); + + WriteMinidumpAndCallstack(nullptr, "Pure call handler invoked"); + } + + TerminateProcess(GetCurrentProcess(), 0xFAFAFAFAu); +} + bool CrashHandler::Install(CleanupHandler cleanup_handler) { // load dbghelp at install/startup, that way we're not LoadLibrary()'ing after a crash @@ -208,6 +224,12 @@ bool CrashHandler::Install(CleanupHandler cleanup_handler) SetUnhandledExceptionFilter(ExceptionHandler); _set_invalid_parameter_handler(InvalidParameterHandler); _set_purecall_handler(PureCallHandler); +#ifdef _DEBUG + _set_abort_behavior(_WRITE_ABORT_MSG, _WRITE_ABORT_MSG | _CALL_REPORTFAULT); +#else + _set_abort_behavior(_WRITE_ABORT_MSG | _CALL_REPORTFAULT, _WRITE_ABORT_MSG | _CALL_REPORTFAULT); +#endif + signal(SIGABRT, AbortSignalHandler); return true; } @@ -391,6 +413,10 @@ bool CrashHandler::Install(CleanupHandler cleanup_handler) if (sigaction(SIGSEGV, &sa, nullptr) != 0) return false; + sa.sa_flags = SA_SIGINFO; + if (sigaction(SIGABRT, &sa, nullptr) != 0) + return false; + s_cleanup_handler = cleanup_handler; return true; }