aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2017-02-04 12:33:03 +0000
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2017-02-04 12:33:03 +0000
commitcd34fc655d5bf4ed5d9425222b78a771b7a55294 (patch)
tree1192907b0dee5ecea635d63ccbcf8cd5d2ca75e3
parentMerge pull request #1663 (diff)
downloadmonero-cd34fc655d5bf4ed5d9425222b78a771b7a55294.tar.xz
Use easylogging++'s stack trace facility where possible
This avoids using libunwind, which often causes trouble.
-rw-r--r--CMakeLists.txt20
-rw-r--r--contrib/epee/include/misc_log_ex.h3
-rw-r--r--src/common/stack_trace.cpp19
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