summaryrefslogtreecommitdiff
path: root/src/backtrace.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2015-11-09 01:15:34 +0100
committerMarcel Holtmann <marcel@holtmann.org>2015-11-09 01:15:34 +0100
commit4959c6d454769f4e5d89a3432348d637ac4009f9 (patch)
tree89bdb347895b816bcaca3a7c1761514332ce3a46 /src/backtrace.c
parent98c97bd63f199fa1209429b5dd01692f41058d81 (diff)
downloadbluez-4959c6d454769f4e5d89a3432348d637ac4009f9.tar.gz
core: Initialize the backtracer early on at start
Diffstat (limited to 'src/backtrace.c')
-rw-r--r--src/backtrace.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/backtrace.c b/src/backtrace.c
index 938025b45..052649620 100644
--- a/src/backtrace.c
+++ b/src/backtrace.c
@@ -28,15 +28,30 @@
#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,