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);