mirror of
https://github.com/ceph/ceph
synced 2025-02-22 18:47:18 +00:00
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:
commit
d1fdae6d73
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user