From: Martin Quinson Date: Sun, 28 Oct 2018 23:13:08 +0000 (+0100) Subject: provide a backtrace implementation that uses boost.stacktrace X-Git-Tag: v3_22~830 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/4a8bc21517c2e7759a0036d879338f84ed6bf56e?hp=f17b9a490a2fc481082483fce016d57605d429a0 provide a backtrace implementation that uses boost.stacktrace --- diff --git a/CMakeLists.txt b/CMakeLists.txt index e2f7f6719a..61416d942e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -267,6 +267,7 @@ message(STATUS "Looking for optional Boost components:") if (Boost_STACKTRACE_BACKTRACE_FOUND) message (STATUS " stacktrace: found. Activating human-readable stack traces.") set(HAVE_BOOST_STACKTRACE 1) + set(SIMGRID_DEP "${SIMGRID_DEP} -lboost_stacktrace_backtrace") else() message (STATUS " stacktrace: MISSING. Install libboost-stacktrace-dev to display the stacktraces.") set(HAVE_BOOST_STACKTRACE 0) diff --git a/src/xbt/backtrace.cpp b/src/xbt/backtrace.cpp index baa1f647b7..469b757bb1 100644 --- a/src/xbt/backtrace.cpp +++ b/src/xbt/backtrace.cpp @@ -5,6 +5,12 @@ #include "src/internal_config.h" +#include "simgrid/simix.h" /* SIMIX_process_self_get_name() */ +#include +#include +#include +#include + #include #include #include @@ -23,11 +29,10 @@ #include #endif -#include "simgrid/simix.h" /* SIMIX_process_self_get_name() */ -#include -#include -#include -#include +#if HAVE_BOOST_STACKTRACE +#define BOOST_STACKTRACE_USE_BACKTRACE +#include +#endif XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_backtrace, xbt, "Backtrace"); @@ -91,14 +96,19 @@ public: refcount_--; return refcount_ == 0; } -#if HAVE_BACKTRACE +#if HAVE_BOOST_STACKTRACE + boost::stacktrace::stacktrace st; +#elif HAVE_BACKTRACE std::vector frames; #endif }; Backtrace::Backtrace() { -#if HAVE_BACKTRACE +#if HAVE_BOOST_STACKTRACE + impl_ = new BacktraceImpl(); + impl_->st = boost::stacktrace::stacktrace(); +#elif HAVE_BACKTRACE impl_ = new BacktraceImpl(); impl_->frames.resize(15); int used = backtrace(impl_->frames.data(), impl_->frames.size()); @@ -119,10 +129,8 @@ Backtrace::Backtrace(const Backtrace& bt) Backtrace::~Backtrace() { - if (impl_->unref()) { -#if HAVE_BACKTRACE + if (impl_ != nullptr && impl_->unref()) { delete impl_; -#endif } } } // namespace xbt @@ -168,7 +176,11 @@ std::vector resolve_backtrace(const Backtrace& bt) { std::vector result; -#if HAVE_BACKTRACE && HAVE_EXECINFO_H && HAVE_POPEN && defined(ADDR2LINE) +#if HAVE_BOOST_STACKTRACE + std::stringstream ss; + ss << bt.impl_->st; + result.push_back(ss.str()); +#elif HAVE_BACKTRACE && HAVE_EXECINFO_H && HAVE_POPEN && defined(ADDR2LINE) // FIXME: This code could be greatly improved/simplified with // http://cairo.sourcearchive.com/documentation/1.9.4/backtrace-symbols_8c-source.html if (bt.impl_->frames.size() == 0) diff --git a/tools/cmake/src/internal_config.h.in b/tools/cmake/src/internal_config.h.in index 3b9e9f461b..20ffec75d4 100644 --- a/tools/cmake/src/internal_config.h.in +++ b/tools/cmake/src/internal_config.h.in @@ -111,3 +111,5 @@ #cmakedefine01 HAVE_GRAPHVIZ /* The lib unwind library (for MC and backtrace display) */ #cmakedefine01 HAVE_LIBUNWIND +/* The boost_stacktrace_backtrace library */ +#cmakedefine01 HAVE_BOOST_STACKTRACE