diff options
author | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2017-02-04 12:33:03 +0000 |
---|---|---|
committer | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2017-02-04 12:33:03 +0000 |
commit | cd34fc655d5bf4ed5d9425222b78a771b7a55294 (patch) | |
tree | 1192907b0dee5ecea635d63ccbcf8cd5d2ca75e3 | |
parent | Merge pull request #1663 (diff) | |
download | monero-cd34fc655d5bf4ed5d9425222b78a771b7a55294.tar.xz |
Use easylogging++'s stack trace facility where possible
This avoids using libunwind, which often causes trouble.
Diffstat (limited to '')
-rw-r--r-- | CMakeLists.txt | 20 | ||||
-rw-r--r-- | contrib/epee/include/misc_log_ex.h | 3 | ||||
-rw-r--r-- | src/common/stack_trace.cpp | 19 |
3 files changed, 34 insertions, 8 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index cee3d8c97..454a462f1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -275,17 +275,23 @@ add_definitions("-DBLOCKCHAIN_DB=${BLOCKCHAIN_DB}") # Can't install hook in static build on OSX, because OSX linker does not support --wrap # On ARM, having libunwind package (with .so's only) installed breaks static link. -if(APPLE OR (ARM AND STATIC)) +if (APPLE) + set(DEFAULT_STACK_TRACE OFF) + set(LIBUNWIND_LIBRARIES "") +elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT MINGW) + set(DEFAULT_STACK_TRACE ON) + set(LIBUNWIND_LIBRARIES "") +elseif (ARM AND STATIC) set(DEFAULT_STACK_TRACE OFF) set(LIBUNWIND_LIBRARIES "") else() find_package(Libunwind) - if(LIBUNWIND_FOUND) - set(DEFAULT_STACK_TRACE ON) - else() - set(DEFAULT_STACK_TRACE OFF) - set(LIBUNWIND_LIBRARIES "") - endif() + if(LIBUNWIND_FOUND) + set(DEFAULT_STACK_TRACE ON) + else() + set(DEFAULT_STACK_TRACE OFF) + set(LIBUNWIND_LIBRARIES "") + endif() endif() option(STACK_TRACE "Install a hook that dumps stack on exception" ${DEFAULT_STACK_TRACE}) diff --git a/contrib/epee/include/misc_log_ex.h b/contrib/epee/include/misc_log_ex.h index f04282438..fbfd6941f 100644 --- a/contrib/epee/include/misc_log_ex.h +++ b/contrib/epee/include/misc_log_ex.h @@ -51,8 +51,9 @@ #define ELPP_THREAD_SAFE #define ELPP_DEFAULT_LOG_FILE "" -#define ELPP_STACKTRACE 0 +#define ELPP_STACKTRACE_ON_CRASH 0 #define ELPP_DISABLE_DEFAULT_CRASH_HANDLING +#define ELPP_FEATURE_CRASH_LOG 1 #define ELPP_DISABLE_CHECK_MACROS #include "easylogging++.h" diff --git a/src/common/stack_trace.cpp b/src/common/stack_trace.cpp index 99e4bda2c..67065aae7 100644 --- a/src/common/stack_trace.cpp +++ b/src/common/stack_trace.cpp @@ -26,11 +26,17 @@ // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#if !defined __GNUC__ || defined __MINGW32__ || defined __MINGW64__ +#define USE_UNWIND +#endif + #include "common/stack_trace.h" #include "misc_log_ex.h" +#ifdef USE_UNWIND #define UNW_LOCAL_ONLY #include <libunwind.h> #include <cxxabi.h> +#endif #ifndef STATICLIB #include <dlfcn.h> #endif @@ -99,6 +105,7 @@ void set_stack_trace_log(const std::string &log) void log_stack_trace(const char *msg) { +#ifdef USE_UNWIND unw_context_t ctx; unw_cursor_t cur; unw_word_t ip, off; @@ -106,10 +113,13 @@ void log_stack_trace(const char *msg) char sym[512], *dsym; int status; const char *log = stack_trace_log.empty() ? NULL : stack_trace_log.c_str(); +#endif if (msg) ST_LOG(msg); ST_LOG("Unwound call stack:"); + +#ifdef USE_UNWIND if (unw_getcontext(&ctx) < 0) { ST_LOG("Failed to create unwind context"); return; @@ -138,6 +148,15 @@ void log_stack_trace(const char *msg) ST_LOG(" " << std::setw(4) << level << std::setbase(16) << std::setw(20) << "0x" << ip << " " << (!status && dsym ? dsym : sym) << " + " << "0x" << off); free(dsym); } +#else + std::stringstream ss; + ss << el::base::debug::StackTrace(); + std::vector<std::string> lines; + std::string s = ss.str(); + boost::split(lines, s, boost::is_any_of("\n")); + for (const auto &line: lines) + ST_LOG(line); +#endif } } // namespace tools |