From 634fac4410203fb12983ca3765247fe26ac4395a Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 27 Jul 2025 02:01:58 +1000 Subject: [PATCH] CrashHandler: Fix recursive backtrace on Linux --- src/common/assert.cpp | 2 -- src/common/crash_handler.cpp | 13 ++++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/common/assert.cpp b/src/common/assert.cpp index 325b5c867..b3060a24f 100644 --- a/src/common/assert.cpp +++ b/src/common/assert.cpp @@ -82,8 +82,6 @@ extern "C" __attribute__((weak)) void android_set_abort_message(const char*); { #ifndef __ANDROID__ std::fputs(szMsg, stderr); - CrashHandler::WriteDumpForCaller(szMsg); - std::fputs("Aborting application.\n", stderr); std::fflush(stderr); std::abort(); #else diff --git a/src/common/crash_handler.cpp b/src/common/crash_handler.cpp index 88804f4cb..5cbe17add 100644 --- a/src/common/crash_handler.cpp +++ b/src/common/crash_handler.cpp @@ -285,6 +285,7 @@ const char* CrashHandler::GetSignalName(int signal_no) // clang-format off case SIGSEGV: return "SIGSEGV"; case SIGBUS: return "SIGBUS"; + case SIGABRT: return "SIGABRT"; default: return "UNKNOWN"; // clang-format on } @@ -391,9 +392,13 @@ void CrashHandler::CrashSignalHandler(int signal, siginfo_t* siginfo, void* ctx) lock.unlock(); // We can't continue from here. Just bail out and dump core. - std::fputs("Aborting application.\n", stderr); - std::fflush(stderr); - std::abort(); + static const char abort_message[] = "Aborting application.\n"; + write(STDERR_FILENO, abort_message, sizeof(abort_message) - 1); + + // Call default abort signal handler, regardless of whether this was SIGSEGV or SIGABRT. + lock.lock(); + std::signal(SIGABRT, SIG_DFL); + raise(SIGABRT); } bool CrashHandler::Install(CleanupHandler cleanup_handler) @@ -412,8 +417,6 @@ bool CrashHandler::Install(CleanupHandler cleanup_handler) return false; if (sigaction(SIGSEGV, &sa, nullptr) != 0) return false; - - sa.sa_flags = SA_SIGINFO; if (sigaction(SIGABRT, &sa, nullptr) != 0) return false;