From: Radoslaw Zarzynski Date: Thu, 22 Apr 2021 16:06:04 +0000 (+0000) Subject: crimson/common: print the address that caused the fault on SIGSEGV. X-Git-Tag: v17.1.0~2163^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=324661c6846f83eba83e303d9c68667d9e1868b3;p=ceph.git crimson/common: print the address that caused the fault on SIGSEGV. Signed-off-by: Radoslaw Zarzynski --- 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();