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);
// 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");
#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();