diff --git a/src/crimson/common/fatal_signal.cc b/src/crimson/common/fatal_signal.cc index ed7b6a43f8d..312858ec834 100644 --- a/src/crimson/common/fatal_signal.cc +++ b/src/crimson/common/fatal_signal.cc @@ -37,7 +37,7 @@ void FatalSignal::install_oneshot_signal_handler() if (static std::atomic_bool handled{false}; handled.exchange(true)) { return; } - FatalSignal::signaled(sig); + FatalSignal::signaled(sig, info); ::signal(sig, SIG_DFL); }; sigfillset(&sa.sa_mask); @@ -50,7 +50,7 @@ void FatalSignal::install_oneshot_signal_handler() } -static void print_with_backtrace(std::string_view cause) { +static void print_backtrace(std::string_view cause) { std::cerr << cause; if (seastar::engine_is_ready()) { std::cerr << " on shard " << seastar::this_shard_id(); @@ -62,17 +62,24 @@ static void print_with_backtrace(std::string_view cause) { // see handle_fatal_signal() } -void FatalSignal::signaled(const int signum) +static void print_segv_info(const siginfo_t* siginfo) +{ + std::cerr << "Fault at location: " << siginfo->si_addr << std::endl; + std::cerr << std::flush; +} + +void FatalSignal::signaled(const int signum, const siginfo_t* siginfo) { switch (signum) { case SIGSEGV: - print_with_backtrace("Aborting"); + print_backtrace("Segmentation fault"); + print_segv_info(siginfo); break; case SIGABRT: - print_with_backtrace("Segmentation fault"); + print_backtrace("Aborting"); break; default: - print_with_backtrace(fmt::format("Signal {}", signum)); + print_backtrace(fmt::format("Signal {}", signum)); break; } } diff --git a/src/crimson/common/fatal_signal.h b/src/crimson/common/fatal_signal.h index 158b87f0c76..987f75bf94b 100644 --- a/src/crimson/common/fatal_signal.h +++ b/src/crimson/common/fatal_signal.h @@ -3,13 +3,14 @@ #pragma once +#include + class FatalSignal { public: FatalSignal(); private: - static void signaled(int signum); - static void print_backtrace(int signum); + static void signaled(int signum, const siginfo_t* siginfo); template void install_oneshot_signals_handler();