CrashHandler: Fix recursive backtrace on Linux

This commit is contained in:
Stenzek 2025-07-27 02:01:58 +10:00
parent 2b18df0910
commit 634fac4410
No known key found for this signature in database
2 changed files with 8 additions and 7 deletions

View File

@ -82,8 +82,6 @@ extern "C" __attribute__((weak)) void android_set_abort_message(const char*);
{ {
#ifndef __ANDROID__ #ifndef __ANDROID__
std::fputs(szMsg, stderr); std::fputs(szMsg, stderr);
CrashHandler::WriteDumpForCaller(szMsg);
std::fputs("Aborting application.\n", stderr);
std::fflush(stderr); std::fflush(stderr);
std::abort(); std::abort();
#else #else

View File

@ -285,6 +285,7 @@ const char* CrashHandler::GetSignalName(int signal_no)
// clang-format off // clang-format off
case SIGSEGV: return "SIGSEGV"; case SIGSEGV: return "SIGSEGV";
case SIGBUS: return "SIGBUS"; case SIGBUS: return "SIGBUS";
case SIGABRT: return "SIGABRT";
default: return "UNKNOWN"; default: return "UNKNOWN";
// clang-format on // clang-format on
} }
@ -391,9 +392,13 @@ void CrashHandler::CrashSignalHandler(int signal, siginfo_t* siginfo, void* ctx)
lock.unlock(); lock.unlock();
// We can't continue from here. Just bail out and dump core. // We can't continue from here. Just bail out and dump core.
std::fputs("Aborting application.\n", stderr); static const char abort_message[] = "Aborting application.\n";
std::fflush(stderr); write(STDERR_FILENO, abort_message, sizeof(abort_message) - 1);
std::abort();
// 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) bool CrashHandler::Install(CleanupHandler cleanup_handler)
@ -412,8 +417,6 @@ bool CrashHandler::Install(CleanupHandler cleanup_handler)
return false; return false;
if (sigaction(SIGSEGV, &sa, nullptr) != 0) if (sigaction(SIGSEGV, &sa, nullptr) != 0)
return false; return false;
sa.sa_flags = SA_SIGINFO;
if (sigaction(SIGABRT, &sa, nullptr) != 0) if (sigaction(SIGABRT, &sa, nullptr) != 0)
return false; return false;