X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/acc4596bfe40a4bf7f59d5b94bc5643f86806dda..5ee23970780a802b53a76ca272464a462223e7e8:/src/xbt/backtrace.cpp diff --git a/src/xbt/backtrace.cpp b/src/xbt/backtrace.cpp index f897e12adb..669856acda 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" @@ -22,6 +35,37 @@ 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, NULL, NULL, &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