X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/acc4596bfe40a4bf7f59d5b94bc5643f86806dda..d9d29f9c45022aeb18af277c995291c0547bbc0d:/src/xbt/backtrace.cpp diff --git a/src/xbt/backtrace.cpp b/src/xbt/backtrace.cpp index f897e12adb..8831610058 100644 --- a/src/xbt/backtrace.cpp +++ b/src/xbt/backtrace.cpp @@ -1,9 +1,22 @@ /* Copyright (c) 2005-2016. The SimGrid Team. All rights reserved. */ +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + #include +#include + +#include + +// Try to detect and use the C++ intanium ABI for name demangling: +#ifdef __GXX_ABI_VERSION +#include +#endif -#include #include +#include +#include +#include #include "src/internal_config.h" @@ -13,8 +26,8 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_backtrace, xbt, "Backtrace"); } -/** @brief show the backtrace of the current point (lovely while debuging) */ -void xbt_backtrace_display_current(void) +/** @brief show the backtrace of the current point (lovely while debugging) */ +void xbt_backtrace_display_current() { const std::size_t size = 10; xbt_backtrace_location_t bt[size]; @@ -22,6 +35,36 @@ void xbt_backtrace_display_current(void) xbt_backtrace_display(bt, used); } +namespace simgrid { +namespace xbt { + +std::unique_ptr demangle(const char* name) +{ +#ifdef __GXX_ABI_VERSION + int status; + auto res = std::unique_ptr( + abi::__cxa_demangle(name, nullptr, nullptr, &status), + std::free + ); + if (res != nullptr) + return res; + // We did not manage to resolve this. Probably because this is not a mangled symbol: +#endif + // Return the symbol: + return std::unique_ptr(xbt_strdup(name), std::free); +} + +std::vector backtrace() +{ + const std::size_t size = 10; + xbt_backtrace_location_t loc[size]; + size_t used = xbt_backtrace_current(loc, size); + return std::vector(loc, loc + used); +} + +} +} + #if HAVE_BACKTRACE && HAVE_EXECINFO_H && HAVE_POPEN && defined(ADDR2LINE) # include "src/xbt/backtrace_linux.cpp" #else