Merge pull request #40991 from rzarzynski/wip-crimson-backtrace-si_addr

crimson/common: print the address that caused the fault on SIGSEGV.

Reviewed-by: Kefu Chai <kchai@redhat.com>
This commit is contained in:
Kefu Chai 2021-04-23 12:57:16 +08:00 committed by GitHub
commit d1fdae6d73
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 8 deletions

View 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);
@ -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;
}
}

View File

@ -3,13 +3,14 @@
#pragma once
#include <csignal>
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 <int... SigNums>
void install_oneshot_signals_handler();