OSDN Git Service

core: Initialize the backtracer early on at start
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 9 Nov 2015 00:15:34 +0000 (01:15 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 9 Nov 2015 00:15:34 +0000 (01:15 +0100)
src/backtrace.c
src/backtrace.h
src/main.c

index 938025b..0526496 100644 (file)
 #include <unistd.h>
 #include <inttypes.h>
 
+#ifdef HAVE_BACKTRACE_SUPPORT
+#include <execinfo.h>
+#include <elfutils/libdwfl.h>
+#endif
+
 #include "src/log.h"
 #include "src/backtrace.h"
 
+void btd_backtrace_init(void)
+{
 #ifdef HAVE_BACKTRACE_SUPPORT
-#include <execinfo.h>
-#include <elfutils/libdwfl.h>
+       void *frames[1];
+
+       /*
+        * initialize the backtracer, since the ctor calls dlopen(), which
+        * calls malloc(), which isn't signal-safe.
+        */
+       backtrace(frames, 1);
+#endif
+}
 
 void btd_backtrace(uint16_t index)
 {
+#ifdef HAVE_BACKTRACE_SUPPORT
        char *debuginfo_path = NULL;
        const Dwfl_Callbacks callbacks = {
                .find_debuginfo = dwfl_standard_find_debuginfo,
index 654d67d..b3eef6d 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <stdint.h>
 
+void btd_backtrace_init(void);
 void btd_backtrace(uint16_t index);
 
 void btd_assertion_message_expr(const char *file, int line,
index 9124dc5..2001cee 100644 (file)
@@ -48,6 +48,7 @@
 #include "gdbus/gdbus.h"
 
 #include "log.h"
+#include "backtrace.h"
 
 #include "lib/uuid.h"
 #include "hcid.h"
@@ -585,6 +586,8 @@ int main(int argc, char *argv[])
 
        umask(0077);
 
+       btd_backtrace_init();
+
        event_loop = g_main_loop_new(NULL, FALSE);
 
        signal = setup_signalfd();