mirror of
https://github.com/netdata/netdata.git
synced 2025-04-13 09:11:50 +00:00
disable UNW_LOCAL_ONLY on static builds (#19858)
* disable UNW_LOCAL_ONLY on static builds * disable stack traces with logs; get stack traces on deadly conditions only after saving status file * signal handler safety only when UNW_LOCAL_ONLY is set * removed warning
This commit is contained in:
parent
c718bca80d
commit
b942b581a5
4 changed files with 32 additions and 9 deletions
packaging/cmake
src
|
@ -13,6 +13,7 @@
|
||||||
#cmakedefine OS_LINUX
|
#cmakedefine OS_LINUX
|
||||||
#cmakedefine OS_MACOS
|
#cmakedefine OS_MACOS
|
||||||
#cmakedefine OS_WINDOWS
|
#cmakedefine OS_WINDOWS
|
||||||
|
#cmakedefine STATIC_BUILD
|
||||||
|
|
||||||
// required compilation options
|
// required compilation options
|
||||||
|
|
||||||
|
|
|
@ -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
|
// 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 *)message);
|
||||||
freez((void *)errno_str);
|
freez((void *)errno_str);
|
||||||
freez((void *)stack_trace);
|
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);
|
dsf_release(session_status);
|
||||||
|
|
||||||
daemon_status_file_save(static_save_buffer, &session_status, false);
|
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) {
|
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
|
// save what we know already
|
||||||
daemon_status_file_save(static_save_buffer, &session_status, false);
|
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(reason != EXIT_REASON_SIGABRT || capture_stack_trace_is_async_signal_safe())
|
||||||
|
daemon_status_file_save_again_if_we_can_get_stack_trace();
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool daemon_status_file_has_last_crashed(void) {
|
bool daemon_status_file_has_last_crashed(void) {
|
||||||
|
|
|
@ -7,7 +7,9 @@ bool nd_log_forked = false;
|
||||||
#define NO_STACK_TRACE_PREFIX "stack trace not available: "
|
#define NO_STACK_TRACE_PREFIX "stack trace not available: "
|
||||||
|
|
||||||
#if defined(HAVE_LIBUNWIND)
|
#if defined(HAVE_LIBUNWIND)
|
||||||
|
#if !defined(STATIC_BUILD)
|
||||||
#define UNW_LOCAL_ONLY
|
#define UNW_LOCAL_ONLY
|
||||||
|
#endif
|
||||||
#include <libunwind.h>
|
#include <libunwind.h>
|
||||||
|
|
||||||
void capture_stack_trace_init(void) {
|
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) {
|
bool capture_stack_trace_is_async_signal_safe(void) {
|
||||||
|
#if defined(STATIC_BUILD)
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
return true;
|
return true;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void capture_stack_trace(BUFFER *wb) {
|
void capture_stack_trace(BUFFER *wb) {
|
||||||
|
|
|
@ -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
|
// 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);
|
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))
|
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);
|
thread_log_fields[NDF_INVOCATION_ID].entry = ND_LOG_FIELD_UUID(NDF_INVOCATION_ID, &nd_log.invocation_id);
|
||||||
|
|
Loading…
Add table
Reference in a new issue