From 324661c6846f83eba83e303d9c68667d9e1868b3 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Thu, 22 Apr 2021 16:06:04 +0000 Subject: [PATCH] crimson/common: print the address that caused the fault on SIGSEGV. Signed-off-by: Radoslaw Zarzynski --- src/crimson/common/fatal_signal.cc | 11 +++++++++-- src/crimson/common/fatal_signal.h | 4 +++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/crimson/common/fatal_signal.cc b/src/crimson/common/fatal_signal.cc index 36c641b29e2d1..312858ec8341e 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); @@ -62,11 +62,18 @@ static void print_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_backtrace("Segmentation fault"); + print_segv_info(siginfo); break; case SIGABRT: print_backtrace("Aborting"); diff --git a/src/crimson/common/fatal_signal.h b/src/crimson/common/fatal_signal.h index 2b847e543da8e..987f75bf94bf2 100644 --- a/src/crimson/common/fatal_signal.h +++ b/src/crimson/common/fatal_signal.h @@ -3,12 +3,14 @@ #pragma once +#include + class FatalSignal { public: FatalSignal(); private: - static void signaled(int signum); + static void signaled(int signum, const siginfo_t* siginfo); template void install_oneshot_signals_handler(); -- 2.39.5