From ef35cb23539ac1984373ad5e6775c7fd26d6f948 Mon Sep 17 00:00:00 2001 From: moneromooo-monero Date: Sat, 14 Apr 2018 10:49:17 +0100 Subject: optional boost stacktrace to get stack traces on mac and windows too Thanks to iDunk for lots of testing to get this to work on Windows --- src/common/stack_trace.cpp | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'src/common/stack_trace.cpp') diff --git a/src/common/stack_trace.cpp b/src/common/stack_trace.cpp index 9c2bf4b53..1e762bf54 100644 --- a/src/common/stack_trace.cpp +++ b/src/common/stack_trace.cpp @@ -26,18 +26,19 @@ // 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__ || defined __ANDROID__ -#define USE_UNWIND -#else +#ifdef USE_BOOST_STACKTRACE +#include +#elif defined USE_EASYLOGGING_STACKTRACE #define ELPP_FEATURE_CRASH_LOG 1 #endif #include "easylogging++/easylogging++.h" #include -#ifdef USE_UNWIND +#ifdef USE_LIBUNWIND_STACKTRACE #define UNW_LOCAL_ONLY #include #include +#include #endif #ifndef STATICLIB #include @@ -51,6 +52,8 @@ #define ST_LOG(x) CINFO(el::base::Writer,el::base::DispatchAction::FileOnlyLog,MONERO_DEFAULT_LOG_CATEGORY) << x +#ifdef STACK_TRACE_ON_EXCEPTIONS + // from http://stackoverflow.com/questions/11665829/how-can-i-print-stack-trace-for-caught-exceptions-in-c-code-injection-in-c // The decl of __cxa_throw in /usr/include/.../cxxabi.h uses @@ -95,6 +98,8 @@ void CXA_THROW(void *ex, CXA_THROW_INFO_T *info, void (*dest)(void*)) __real___cxa_throw(ex, info, dest); } +#endif + namespace { std::string stack_trace_log; @@ -110,7 +115,7 @@ void set_stack_trace_log(const std::string &log) void log_stack_trace(const char *msg) { -#ifdef USE_UNWIND +#ifdef USE_LIBUNWIND_STACKTRACE unw_context_t ctx; unw_cursor_t cur; unw_word_t ip, off; @@ -124,7 +129,7 @@ void log_stack_trace(const char *msg) ST_LOG(msg); ST_LOG("Unwound call stack:"); -#ifdef USE_UNWIND +#ifdef USE_LIBUNWIND_STACKTRACE if (unw_getcontext(&ctx) < 0) { ST_LOG("Failed to create unwind context"); return; @@ -153,7 +158,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 +#elif defined USE_BOOST_STACKTRACE + std::stringstream ss; + ss << boost::stacktrace::stacktrace(); + std::vector lines; + std::string s = ss.str(); + boost::split(lines, s, boost::is_any_of("\n")); + for (const auto &line: lines) + ST_LOG(line); +#elif defined USE_EASYLOGGING_STACKTRACE std::stringstream ss; ss << el::base::debug::StackTrace(); std::vector lines; -- cgit v1.2.3