From 5729a4b928faa36bba3b9a7a9a937e34a2ce6c1e Mon Sep 17 00:00:00 2001 From: Marcel Lauhoff Date: Fri, 26 Jul 2024 09:44:45 +0200 Subject: [PATCH] global: set up breakpad crash reporting Signed-off-by: Marcel Lauhoff --- src/common/ceph_context.h | 2 ++ src/common/options/global.yaml.in | 8 ++++++++ src/global/global_init.cc | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/src/common/ceph_context.h b/src/common/ceph_context.h index cd8dd1404d5..14e157f41c6 100644 --- a/src/common/ceph_context.h +++ b/src/common/ceph_context.h @@ -34,6 +34,7 @@ #include "common/cmdparse.h" #include "common/code_environment.h" #include "msg/msg_types.h" +#include "breakpad/src/client/linux/handler/exception_handler.h" #ifdef WITH_CRIMSON #include "crimson/common/config_proxy.h" #include "crimson/common/perf_counters_collection.h" @@ -143,6 +144,7 @@ public: ConfigProxy _conf; ceph::logging::Log *_log; + std::unique_ptr _ex_handler; /* init ceph::crypto */ void init_crypto(); diff --git a/src/common/options/global.yaml.in b/src/common/options/global.yaml.in index c7a707c3f21..484b58cd933 100644 --- a/src/common/options/global.yaml.in +++ b/src/common/options/global.yaml.in @@ -433,6 +433,14 @@ options: flags: - startup with_legacy: true +- name: breakpad + type: bool + level: advanced + desc: setup breakpad crash handler + default: false + flags: + - startup + with_legacy: true - name: crash_dir type: str level: advanced diff --git a/src/global/global_init.cc b/src/global/global_init.cc index 79defaec376..839951249c9 100644 --- a/src/global/global_init.cc +++ b/src/global/global_init.cc @@ -26,6 +26,8 @@ #include "extblkdev/ExtBlkDevPlugin.h" #include "global/global_context.h" #include "global/global_init.h" +#include +#include #include "global/pidfile.h" #include "global/signal_handler.h" #include "include/compat.h" @@ -178,6 +180,15 @@ void global_pre_init( g_conf().complain_about_parse_error(g_ceph_context); } +static bool dumpCallback( + const google_breakpad::MinidumpDescriptor& descriptor, void* context, + bool succeeded) { + char buf[1024]; + snprintf(buf, sizeof(buf), "minidump created in path %s", descriptor.path()); + dout_emergency(buf); + return succeeded; +} + boost::intrusive_ptr global_init(const std::map *defaults, std::vector < const char* >& args, @@ -215,6 +226,13 @@ global_init(const std::map *defaults, if (g_conf()->fatal_signal_handlers) { install_standard_sighandlers(); } + + if (g_conf()->breakpad) { + google_breakpad::MinidumpDescriptor descriptor(g_conf()->crash_dir); + g_ceph_context->_ex_handler.reset( + new google_breakpad::ExceptionHandler(descriptor, nullptr, dumpCallback, nullptr, true, -1)); + } + ceph::register_assert_context(g_ceph_context); if (g_conf()->log_flush_on_exit) -- 2.39.5