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