From ef89de9dc1dcf55be2dfaa9658916806699554ac Mon Sep 17 00:00:00 2001 From: Ryan Macnak Date: Fri, 17 Nov 2023 19:02:33 +0000 Subject: [PATCH] [standalone] Symbolize si_code in crash dumps. TEST=remove PROT_EXEC, see ACCERR Change-Id: I99bb5b2aba4f40dd8b6e074ed652f8cbbd69cdd6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/336280 Reviewed-by: Martin Kustermann Commit-Queue: Ryan Macnak --- runtime/bin/platform_android.cc | 30 ++++++++++++++++++++++++++++-- runtime/bin/platform_linux.cc | 30 ++++++++++++++++++++++++++++-- runtime/bin/platform_macos.cc | 28 ++++++++++++++++++++++++++-- 3 files changed, 82 insertions(+), 6 deletions(-) diff --git a/runtime/bin/platform_android.cc b/runtime/bin/platform_android.cc index fd2fc6aedd5..b682e3d60a5 100644 --- a/runtime/bin/platform_android.cc +++ b/runtime/bin/platform_android.cc @@ -26,11 +26,37 @@ const char* Platform::executable_name_ = nullptr; int Platform::script_index_ = 1; char** Platform::argv_ = nullptr; +static const char* strcode(int si_signo, int si_code) { +#define CASE(signo, code) \ + if (si_signo == signo && si_code == code) return #code; + + CASE(SIGILL, ILL_ILLOPC); + CASE(SIGILL, ILL_ILLOPN); + CASE(SIGILL, ILL_ILLADR); + CASE(SIGILL, ILL_ILLTRP); + CASE(SIGILL, ILL_PRVOPC); + CASE(SIGILL, ILL_PRVREG); + CASE(SIGILL, ILL_COPROC); + CASE(SIGILL, ILL_BADSTK); + CASE(SIGSEGV, SEGV_MAPERR); + CASE(SIGSEGV, SEGV_ACCERR); + CASE(SIGBUS, BUS_ADRALN); + CASE(SIGBUS, BUS_ADRERR); + CASE(SIGBUS, BUS_OBJERR); + CASE(SIGBUS, BUS_MCEERR_AR); + CASE(SIGBUS, BUS_MCEERR_AO); + CASE(SIGTRAP, TRAP_BRKPT); + CASE(SIGTRAP, TRAP_TRACE); +#undef CASE + return "?"; +} + static void segv_handler(int signal, siginfo_t* siginfo, void* context) { Syslog::PrintErr( "\n===== CRASH =====\n" - "si_signo=%s(%d), si_code=%d, si_addr=%p\n", - strsignal(siginfo->si_signo), siginfo->si_signo, siginfo->si_code, + "si_signo=%s(%d), si_code=%s(%d), si_addr=%p\n", + strsignal(siginfo->si_signo), siginfo->si_signo, + strcode(siginfo->si_signo, siginfo->si_code), siginfo->si_code, siginfo->si_addr); Dart_DumpNativeStackTrace(context); Dart_PrepareToAbort(); diff --git a/runtime/bin/platform_linux.cc b/runtime/bin/platform_linux.cc index 66f5e92e124..fe9cda64a50 100644 --- a/runtime/bin/platform_linux.cc +++ b/runtime/bin/platform_linux.cc @@ -25,11 +25,37 @@ const char* Platform::executable_name_ = nullptr; int Platform::script_index_ = 1; char** Platform::argv_ = nullptr; +static const char* strcode(int si_signo, int si_code) { +#define CASE(signo, code) \ + if (si_signo == signo && si_code == code) return #code; + + CASE(SIGILL, ILL_ILLOPC); + CASE(SIGILL, ILL_ILLOPN); + CASE(SIGILL, ILL_ILLADR); + CASE(SIGILL, ILL_ILLTRP); + CASE(SIGILL, ILL_PRVOPC); + CASE(SIGILL, ILL_PRVREG); + CASE(SIGILL, ILL_COPROC); + CASE(SIGILL, ILL_BADSTK); + CASE(SIGSEGV, SEGV_MAPERR); + CASE(SIGSEGV, SEGV_ACCERR); + CASE(SIGBUS, BUS_ADRALN); + CASE(SIGBUS, BUS_ADRERR); + CASE(SIGBUS, BUS_OBJERR); + CASE(SIGBUS, BUS_MCEERR_AR); + CASE(SIGBUS, BUS_MCEERR_AO); + CASE(SIGTRAP, TRAP_BRKPT); + CASE(SIGTRAP, TRAP_TRACE); +#undef CASE + return "?"; +} + static void segv_handler(int signal, siginfo_t* siginfo, void* context) { Syslog::PrintErr( "\n===== CRASH =====\n" - "si_signo=%s(%d), si_code=%d, si_addr=%p\n", - strsignal(siginfo->si_signo), siginfo->si_signo, siginfo->si_code, + "si_signo=%s(%d), si_code=%s(%d), si_addr=%p\n", + strsignal(siginfo->si_signo), siginfo->si_signo, + strcode(siginfo->si_signo, siginfo->si_code), siginfo->si_code, siginfo->si_addr); Dart_DumpNativeStackTrace(context); Dart_PrepareToAbort(); diff --git a/runtime/bin/platform_macos.cc b/runtime/bin/platform_macos.cc index 7afc2012663..4d0784ef0e8 100644 --- a/runtime/bin/platform_macos.cc +++ b/runtime/bin/platform_macos.cc @@ -37,11 +37,35 @@ const char* Platform::executable_name_ = nullptr; int Platform::script_index_ = 1; char** Platform::argv_ = nullptr; +static const char* strcode(int si_signo, int si_code) { +#define CASE(signo, code) \ + if (si_signo == signo && si_code == code) return #code; + + CASE(SIGILL, ILL_ILLOPC); + CASE(SIGILL, ILL_ILLOPN); + CASE(SIGILL, ILL_ILLADR); + CASE(SIGILL, ILL_ILLTRP); + CASE(SIGILL, ILL_PRVOPC); + CASE(SIGILL, ILL_PRVREG); + CASE(SIGILL, ILL_COPROC); + CASE(SIGILL, ILL_BADSTK); + CASE(SIGSEGV, SEGV_MAPERR); + CASE(SIGSEGV, SEGV_ACCERR); + CASE(SIGBUS, BUS_ADRALN); + CASE(SIGBUS, BUS_ADRERR); + CASE(SIGBUS, BUS_OBJERR); + CASE(SIGTRAP, TRAP_BRKPT); + CASE(SIGTRAP, TRAP_TRACE); +#undef CASE + return "?"; +} + static void segv_handler(int signal, siginfo_t* siginfo, void* context) { Syslog::PrintErr( "\n===== CRASH =====\n" - "si_signo=%s(%d), si_code=%d, si_addr=%p\n", - strsignal(siginfo->si_signo), siginfo->si_signo, siginfo->si_code, + "si_signo=%s(%d), si_code=%s(%d), si_addr=%p\n", + strsignal(siginfo->si_signo), siginfo->si_signo, + strcode(siginfo->si_signo, siginfo->si_code), siginfo->si_code, siginfo->si_addr); Dart_DumpNativeStackTrace(context); Dart_PrepareToAbort();