@cryptotaxi247 / netdata / commits / 259549943

Fix FreeBSD (Part II) (#20955)

thiagoftsm committed Sep 11, 2025 at 22:28 UTC 2595499433a2c9fe2510ad5c39f01c6f560456e4
7 files changed +45 -12
CMakeLists.txt
+19 -12
@@ -218,7 +218,7 @@ mark_as_advanced(ENABLE_SENTRY)
218 option(BUILD_FOR_PACKAGING "Include component files for native packages" False)
219 mark_as_advanced(BUILD_FOR_PACKAGING)
220
221 -cmake_dependent_option(ENABLE_LIBBACKTRACE "Use libbacktrace for stack traces in log output" True "OS_LINUX OR OS_WINDOWS OR OS_FREEBSD" False)
221 +cmake_dependent_option(ENABLE_LIBBACKTRACE "Use libbacktrace for stack traces in log output" True "OS_LINUX OR OS_WINDOWS" False)
222 mark_as_advanced(ENABLE_LIBBACKTRACE)
223 cmake_dependent_option(ENABLE_LIBUNWIND "Use libunwind for stack traces in log output" False "NOT ENABLE_LIBBACKTRACE" False)
224 mark_as_advanced(ENABLE_LIBUNWIND)
@@ -1015,17 +1015,6 @@ set(LIBNETDATA_FILES
1015 src/libnetdata/os/setproctitle.h
1016 src/libnetdata/paths/paths.c
1017 src/libnetdata/paths/paths.h
1018 - src/libnetdata/stacktrace/stacktrace.h
1019 - src/libnetdata/stacktrace/stacktrace-common.h
1020 - src/libnetdata/stacktrace/stacktrace-common.c
1021 - src/libnetdata/stacktrace/stacktrace-array.h
1022 - src/libnetdata/stacktrace/stacktrace-array.c
1023 - src/libnetdata/stacktrace/stacktrace-libbacktrace.c
1024 - src/libnetdata/stacktrace/stacktrace-libunwind.c
1025 - src/libnetdata/stacktrace/stacktrace-backtrace.c
1026 - src/libnetdata/stacktrace/stacktrace-none.c
1027 - src/libnetdata/stacktrace/stacktrace-log.c
1028 - src/libnetdata/stacktrace/stacktrace-unittest.c
1018 src/libnetdata/json/json-c-parser-inline.c
1019 src/libnetdata/parsers/duration.h
1020 src/libnetdata/parsers/timeframe.c
@@ -1154,6 +1143,24 @@ if(OS_WINDOWS)
1143 list(APPEND LIBNETDATA_FILES ${LIBNETDATA_WIN_FILES})
1144 endif()
1145
1146 +if(NOT OS_FREEBSD)
1147 + set(LIBNETDATA_STACKTRACE_FILES
1148 + src/libnetdata/stacktrace/stacktrace.h
1149 + src/libnetdata/stacktrace/stacktrace-common.h
1150 + src/libnetdata/stacktrace/stacktrace-common.c
1151 + src/libnetdata/stacktrace/stacktrace-array.h
1152 + src/libnetdata/stacktrace/stacktrace-array.c
1153 + src/libnetdata/stacktrace/stacktrace-libbacktrace.c
1154 + src/libnetdata/stacktrace/stacktrace-libunwind.c
1155 + src/libnetdata/stacktrace/stacktrace-backtrace.c
1156 + src/libnetdata/stacktrace/stacktrace-none.c
1157 + src/libnetdata/stacktrace/stacktrace-log.c
1158 + src/libnetdata/stacktrace/stacktrace-unittest.c
1159 + )
1160 +
1161 + list(APPEND LIBNETDATA_FILES ${LIBNETDATA_STACKTRACE_FILES})
1162 +endif()
1163 +
1164 list(APPEND LIBNETDATA_FILES ${INICFG_FILES})
1165 list(APPEND LIBNETDATA_FILES ${CONFIG_FILES})
1166
src/daemon/buildinfo.c
+2
@@ -1291,7 +1291,9 @@ __attribute__((constructor)) void initialize_build_info(void) {
1291 #ifdef HAVE_LIBMNL
1292 build_info_set_status(BIB_LIB_LIBMNL, true);
1293 #endif
1294 +#ifdef HAVE_LIBBACKTRACE
1295 build_info_set_value(BIB_LIB_STACKTRACE, stacktrace_backend());
1296 +#endif
1297
1298 #ifdef ENABLE_PLUGIN_APPS
1299 build_info_set_status(BIB_PLUGIN_APPS, true);
src/daemon/daemon.c
+4
@@ -428,7 +428,9 @@ int become_daemon(int dont_fork, const char *user) {
428 // the child
429 gettid_uncached();
430 nd_initialize_signals(false);
431 +#ifdef HAVE_LIBBACKTRACE
432 stacktrace_flush();
433 +#endif
434
435 // become session leader
436 if (setsid() < 0) {
@@ -451,7 +453,9 @@ int become_daemon(int dont_fork, const char *user) {
453 // the child
454 gettid_uncached();
455 nd_initialize_signals(false);
456 +#ifdef HAVE_LIBBACKTRACE
457 stacktrace_flush();
458 +#endif
459 }
460
461 // generate our pid file
src/daemon/main.c
+4
@@ -408,7 +408,9 @@ int netdata_main(int argc, char **argv) {
408 if (duration_unittest()) return 1;
409 if (unittest_waiting_queue()) return 1;
410 if (uuidmap_unittest()) return 1;
411 +#ifdef HAVE_LIBBACKTRACE
412 if (stacktrace_unittest()) return 1;
413 +#endif
414 if (test_cmd_pool_fifo()) return 1;
415 #ifdef OS_WINDOWS
416 if (perflibnamestest_main()) return 1;
@@ -468,10 +470,12 @@ int netdata_main(int argc, char **argv) {
470 unittest_running = true;
471 return uuid_unittest();
472 }
473 +#ifdef HAVE_LIBBACKTRACE
474 else if(strcmp(optarg, "stacktracetest") == 0) {
475 unittest_running = true;
476 return stacktrace_unittest();
477 }
478 +#endif
479 #ifdef OS_WINDOWS
480 else if(strcmp(optarg, "perflibdump") == 0) {
481 return windows_perflib_dump(optind + 1 > argc ? NULL : argv[optind]);
src/daemon/signal-handler.c
+2
@@ -173,7 +173,9 @@ void nd_initialize_signals(bool chain_existing) {
173 signals_block_all_except_deadly();
174
175 // Set the signal handler name for stack trace filtering
176 +#ifdef HAVE_LIBBACKTRACE
177 stacktrace_set_signal_handler_function("nd_signal_handler");
178 +#endif
179
180 struct sigaction act;
181 memset(&act, 0, sizeof(struct sigaction));
src/daemon/status-file.c
+8
@@ -707,7 +707,9 @@ static void daemon_status_file_migrate_once(void) {
707 session_status.reliability++;
708 }
709
710 +#ifdef HAVE_LIBBACKTRACE
711 safecpy(session_status.stack_traces, stacktrace_backend());
712 +#endif
713
714 fill_dmi_info(&session_status);
715
@@ -1321,9 +1323,11 @@ static void daemon_status_file_save_twice_if_we_can_get_stack_trace(BUFFER *wb,
1323 // IMPORTANT: NO LOCKS OR ALLOCATIONS HERE, THIS FUNCTION IS CALLED FROM SIGNAL HANDLERS
1324 // THIS FUNCTION MUST USE ONLY ASYNC-SIGNAL-SAFE OPERATIONS
1325
1326 +#ifdef HAVE_LIBBACKTRACE
1327 if(stacktrace_available())
1328 set_stack_trace_message_if_empty(&session_status, STACK_TRACE_INFO_PREFIX "will now attempt to get stack trace - if you see this message, we couldn't get it.");
1329 else
1330 +#endif
1331 set_stack_trace_message_if_empty(&session_status, STACK_TRACE_INFO_PREFIX "no stack trace backend available");
1332
1333 // save it without a stack trace to be sure we will have the event
@@ -1334,6 +1338,7 @@ static void daemon_status_file_save_twice_if_we_can_get_stack_trace(BUFFER *wb,
1338
1339 buffer_flush(wb);
1340
1341 +#ifdef HAVE_LIBBACKTRACE
1342 stacktrace_capture(wb);
1343
1344 // Store the first netdata function from the stack trace if available
@@ -1341,6 +1346,7 @@ static void daemon_status_file_save_twice_if_we_can_get_stack_trace(BUFFER *wb,
1346 if (first_nd_fn && *first_nd_fn &&
1347 (!ds->fatal.function[0] || strncmp(ds->fatal.function, "thread:", 7) == 0))
1348 safecpy(ds->fatal.function, first_nd_fn);
1349 +#endif
1350
1351 if(buffer_strlen(wb) > 0) {
1352 safecpy(ds->fatal.stack_trace, buffer_tostring(wb));
@@ -1488,6 +1494,7 @@ bool daemon_status_file_deadly_signal_received(EXIT_REASON reason, SIGNAL_CODE c
1494 }
1495 }
1496
1497 +#ifdef HAVE_LIBBACKTRACE
1498 bool safe_to_get_stack_trace = reason != EXIT_REASON_SIGABRT || stacktrace_capture_is_async_signal_safe();
1499 bool get_stack_trace = stacktrace_available() && safe_to_get_stack_trace && stack_trace_is_empty(&session_status);
1500
@@ -1502,6 +1509,7 @@ bool daemon_status_file_deadly_signal_received(EXIT_REASON reason, SIGNAL_CODE c
1509
1510 daemon_status_file_save(static_save_buffer, &session_status, false);
1511 }
1512 +#endif
1513
1514 return duplicate;
1515 }
src/libnetdata/log/nd_log-init.c
+6
@@ -136,7 +136,9 @@ void nd_log_initialize_for_external_plugins(const char *name) {
136
137 // nd_log(NDLS_COLLECTORS, NDLP_NOTICE, "FINAL_LOG_METHOD: %s", nd_log_id2method(method));
138
139 +#if defined(HAVE_LIBBACKTRACE)
140 stacktrace_init();
141 +#endif
142 }
143
144 // --------------------------------------------------------------------------------------------------------------------
@@ -266,7 +268,9 @@ void nd_log_initialize(void) {
268 for(size_t i = 0 ; i < _NDLS_MAX ; i++)
269 nd_log_open(&nd_log.sources[i], i);
270
271 +#if defined(HAVE_LIBBACKTRACE)
272 stacktrace_init();
273 +#endif
274 }
275
276 void nd_log_reopen_log_files(bool log) {
@@ -288,8 +292,10 @@ void nd_log_reopen_log_files_for_spawn_server(const char *name) {
292 nd_log.fatal_final_cb = NULL;
293
294 gettid_uncached();
295 +#if defined(HAVE_LIBBACKTRACE)
296 stacktrace_flush();
297 stacktrace_forked();
298 +#endif
299
300 if(nd_log.syslog.initialized) {
301 closelog();