diff --git a/packaging/cmake/config.cmake.h.in b/packaging/cmake/config.cmake.h.in index fe159910a4..9dcd4ec76a 100644 --- a/packaging/cmake/config.cmake.h.in +++ b/packaging/cmake/config.cmake.h.in @@ -13,6 +13,7 @@ #cmakedefine OS_LINUX #cmakedefine OS_MACOS #cmakedefine OS_WINDOWS +#cmakedefine STATIC_BUILD // required compilation options diff --git a/src/daemon/daemon-status-file.c b/src/daemon/daemon-status-file.c index a34940e865..452cc20f8d 100644 --- a/src/daemon/daemon-status-file.c +++ b/src/daemon/daemon-status-file.c @@ -1115,6 +1115,22 @@ void daemon_status_file_check_crash(void) { } } +static void daemon_status_file_save_again_if_we_can_get_stack_trace(void) { + if(!session_status.fatal.stack_trace[0]) { + buffer_flush(static_save_buffer); + capture_stack_trace(static_save_buffer); + + if(buffer_strlen(static_save_buffer) > 0) { + strncpyz( + session_status.fatal.stack_trace, + buffer_tostring(static_save_buffer), + sizeof(session_status.fatal.stack_trace) - 1); + + daemon_status_file_save(static_save_buffer, &session_status, false); + } + } +} + // -------------------------------------------------------------------------------------------------------------------- // ng_log() hook for receiving fatal message information @@ -1156,6 +1172,8 @@ void daemon_status_file_register_fatal(const char *filename, const char *functio freez((void *)message); freez((void *)errno_str); freez((void *)stack_trace); + + daemon_status_file_save_again_if_we_can_get_stack_trace(); } // -------------------------------------------------------------------------------------------------------------------- @@ -1181,6 +1199,7 @@ static void daemon_status_file_out_of_memory(void) { dsf_release(session_status); daemon_status_file_save(static_save_buffer, &session_status, false); + daemon_status_file_save_again_if_we_can_get_stack_trace(); } void daemon_status_file_deadly_signal_received(EXIT_REASON reason) { @@ -1202,14 +1221,8 @@ void daemon_status_file_deadly_signal_received(EXIT_REASON reason) { // save what we know already daemon_status_file_save(static_save_buffer, &session_status, false); - bool can_safely_capture_stack_trace = reason != EXIT_REASON_SIGABRT || capture_stack_trace_is_async_signal_safe(); - - if(can_safely_capture_stack_trace && !session_status.fatal.stack_trace[0]) { - buffer_flush(static_save_buffer); - capture_stack_trace(static_save_buffer); - strncpyz(session_status.fatal.stack_trace, buffer_tostring(static_save_buffer), sizeof(session_status.fatal.stack_trace) - 1); - daemon_status_file_save(static_save_buffer, &session_status, false); - } + if(reason != EXIT_REASON_SIGABRT || capture_stack_trace_is_async_signal_safe()) + daemon_status_file_save_again_if_we_can_get_stack_trace(); } bool daemon_status_file_has_last_crashed(void) { diff --git a/src/libnetdata/log/nd_log-stacktrace.c b/src/libnetdata/log/nd_log-stacktrace.c index 1935b0bc3f..7688162454 100644 --- a/src/libnetdata/log/nd_log-stacktrace.c +++ b/src/libnetdata/log/nd_log-stacktrace.c @@ -7,7 +7,9 @@ bool nd_log_forked = false; #define NO_STACK_TRACE_PREFIX "stack trace not available: " #if defined(HAVE_LIBUNWIND) +#if !defined(STATIC_BUILD) #define UNW_LOCAL_ONLY +#endif #include <libunwind.h> void capture_stack_trace_init(void) { @@ -19,7 +21,11 @@ void capture_stack_trace_flush(void) { } bool capture_stack_trace_is_async_signal_safe(void) { +#if defined(STATIC_BUILD) + return false; +#else return true; +#endif } void capture_stack_trace(BUFFER *wb) { diff --git a/src/libnetdata/log/nd_log.c b/src/libnetdata/log/nd_log.c index 2f73b2d33b..6ded092f9e 100644 --- a/src/libnetdata/log/nd_log.c +++ b/src/libnetdata/log/nd_log.c @@ -268,8 +268,11 @@ static void nd_logger(const char *file, const char *function, const unsigned lon // set the common fields that are automatically set by the logging subsystem - if(likely(!thread_log_fields[NDF_STACK_TRACE].entry.set) && priority <= NDLP_WARNING) +#if 0 + // getting stack traces is crashing on some architectures, so we get them only for daemon status file + if(likely(!thread_log_fields[NDF_STACK_TRACE].entry.set) && priority <= NDLP_ALERT) // only on fatal errors thread_log_fields[NDF_STACK_TRACE].entry = ND_LOG_FIELD_CB(NDF_STACK_TRACE, stack_trace_formatter, NULL); +#endif if(likely(!thread_log_fields[NDF_INVOCATION_ID].entry.set)) thread_log_fields[NDF_INVOCATION_ID].entry = ND_LOG_FIELD_UUID(NDF_INVOCATION_ID, &nd_log.invocation_id);