]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/common: print the address that caused the fault on SIGSEGV. 40991/head
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 22 Apr 2021 16:06:04 +0000 (16:06 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 22 Apr 2021 16:49:08 +0000 (16:49 +0000)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/common/fatal_signal.cc
src/crimson/common/fatal_signal.h

index 36c641b29e2d19a8d1a3000c5e8d509b07c080b3..312858ec8341e2e1f84b96088b2cf4bb614d08f1 100644 (file)
@@ -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");
index 2b847e543da8e8237c74739085e8e223545a26a7..987f75bf94bf2cf976235d7920505ac274805bfb 100644 (file)
@@ -3,12 +3,14 @@
 
 #pragma once
 
+#include <csignal>
+
 class FatalSignal {
 public:
   FatalSignal();
 
 private:
-  static void signaled(int signum);
+  static void signaled(int signum, const siginfo_t* siginfo);
 
   template <int... SigNums>
   void install_oneshot_signals_handler();