From: Martin Quinson Date: Thu, 16 May 2019 09:06:56 +0000 (+0200) Subject: Use addr2line as a fallback for stacktraces when backtrace is not available X-Git-Tag: v3.22.4~126^2~1 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/9900c8f9847ec57bd5e69aa82ada3c90fa542a56?hp=-c Use addr2line as a fallback for stacktraces when backtrace is not available --- 9900c8f9847ec57bd5e69aa82ada3c90fa542a56 diff --git a/CMakeLists.txt b/CMakeLists.txt index 12d1189ff4..868e384c19 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -253,22 +253,31 @@ endif() # Usable components: https://www.boost.org/doc/libs/1_65_1/doc/html/stacktrace/configuration_and_build.html set(_Boost_STACKTRACE_HEADERS "boost/stacktrace.hpp") set(_Boost_STACKTRACE_BACKTRACE_HEADERS "boost/stacktrace.hpp") +set(_Boost_STACKTRACE_ADDR2LINE_HEADERS "boost/stacktrace.hpp") if(minimal_java) # When we want a minimal jarfile, don't even search for boost optional components message(STATUS "Don't even look for boost optional components, as we build a minimal jar file") else() - find_package(Boost 1.59 COMPONENTS context stacktrace_backtrace) + find_package(Boost 1.59 COMPONENTS context stacktrace_backtrace stacktrace_addr2line) set(Boost_FOUND 1) # These components are optionals message(STATUS "Mandatory components found. SimGrid is compilable.") 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) + message (STATUS " stacktrace: found the fast 'backtrace' implementation. Activating human-readable stack traces.") + set(HAVE_BOOST_STACKTRACE_BACKTRACE 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) + set(HAVE_BOOST_STACKTRACE_BACKTRACE 0) + + if (Boost_STACKTRACE_ADDR2LINE_FOUND) + message (STATUS " stacktrace: found the slow 'addr2line' implementation. Activating human-readable stack traces.") + set(HAVE_BOOST_STACKTRACE_ADDR2LINE 1) + set(SIMGRID_DEP "${SIMGRID_DEP} -lboost_stacktrace_addr2line") + else() + message (STATUS " stacktrace: MISSING. Install libboost-stacktrace-dev to display the stacktraces.") + set(HAVE_BOOST_STACKTRACE_ADDR2LINE 0) + endif() endif() if(Boost_CONTEXT_FOUND) diff --git a/ChangeLog b/ChangeLog index 91fbb8ce94..7dd1b9a45b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ SimGrid (3.23) NOT RELEASED (Release Target: June 21. 2019, 15:54 UTC) General: - Stop setting random seed with srand48() at initialization. + - Use addr2line as a fallback for stacktraces when backtrace is not available. XBT: - New log appenders: stdout and stderr. Use stdout for xbt_help. diff --git a/src/internal_config.h.in b/src/internal_config.h.in index 854107028c..f6e6193193 100644 --- a/src/internal_config.h.in +++ b/src/internal_config.h.in @@ -99,4 +99,5 @@ /* The lib unwind library (for MC and backtrace display) */ #cmakedefine01 HAVE_LIBUNWIND /* The boost_stacktrace_backtrace library */ -#cmakedefine01 HAVE_BOOST_STACKTRACE +#cmakedefine01 HAVE_BOOST_STACKTRACE_BACKTRACE /* prefered */ +#cmakedefine01 HAVE_BOOST_STACKTRACE_ADDR2LINE /* fallback */ diff --git a/src/mc/remote/RemoteClient.cpp b/src/mc/remote/RemoteClient.cpp index 4763c9eaa5..3dea61744e 100644 --- a/src/mc/remote/RemoteClient.cpp +++ b/src/mc/remote/RemoteClient.cpp @@ -42,6 +42,7 @@ static const std::vector filtered_libraries = { "libboost_chrono", "libboost_context", "libboost_context-mt", + "libboost_stacktrace_addr2line", "libboost_stacktrace_backtrace", "libboost_system", "libboost_thread", diff --git a/src/xbt/backtrace.cpp b/src/xbt/backtrace.cpp index 837062a9a6..a7c85854b4 100644 --- a/src/xbt/backtrace.cpp +++ b/src/xbt/backtrace.cpp @@ -26,9 +26,12 @@ #include #endif -#if HAVE_BOOST_STACKTRACE +#if HAVE_BOOST_STACKTRACE_BACKTRACE #define BOOST_STACKTRACE_USE_BACKTRACE #include +#elif HAVE_BOOST_STACKTRACE_ADDR2LINE +#define BOOST_STACKTRACE_USE_ADDR2LINE +#include #endif XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_backtrace, xbt, "Backtrace"); @@ -71,14 +74,14 @@ public: return false; } } -#if HAVE_BOOST_STACKTRACE +#if HAVE_BOOST_STACKTRACE_BACKTRACE || HAVE_BOOST_STACKTRACE_ADDR2LINE boost::stacktrace::stacktrace st; #endif }; Backtrace::Backtrace() { -#if HAVE_BOOST_STACKTRACE +#if HAVE_BOOST_STACKTRACE_BACKTRACE || HAVE_BOOST_STACKTRACE_ADDR2LINE impl_ = new BacktraceImpl(); impl_->st = boost::stacktrace::stacktrace(); #endif @@ -129,7 +132,7 @@ std::string const Backtrace::resolve() const { std::string result(""); -#if HAVE_BOOST_STACKTRACE +#if HAVE_BOOST_STACKTRACE_BACKTRACE || HAVE_BOOST_STACKTRACE_ADDR2LINE std::stringstream ss; ss << impl_->st; result.append(ss.str());