+/** @brief show the backtrace of the current point (lovely while debugging) */
+void xbt_backtrace_display_current()
+{
+ simgrid::xbt::Backtrace().display();
+}
+
+namespace simgrid {
+namespace xbt {
+
+std::unique_ptr<char, void(*)(void*)> demangle(const char* name)
+{
+#ifdef __GXX_ABI_VERSION
+ int status;
+ auto res = std::unique_ptr<char, void (*)(void*)>(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<char, void (*)(void*)>(xbt_strdup(name), &std::free);
+}
+
+class BacktraceImpl {
+ short refcount_ = 1;
+
+public:
+ void ref() { refcount_++; }
+ bool unref()
+ {
+ refcount_--;
+ if (refcount_ == 0) {
+ delete this;
+ return true;
+ } else {
+ return false;
+ }
+ }
+#if HAVE_BOOST_STACKTRACE
+ boost::stacktrace::stacktrace st;
+#endif
+};
+
+Backtrace::Backtrace()
+{
+#if HAVE_BOOST_STACKTRACE
+ impl_ = new BacktraceImpl();
+ impl_->st = boost::stacktrace::stacktrace();
+#endif
+}
+Backtrace::Backtrace(const Backtrace& bt)
+{
+ impl_ = bt.impl_;
+ if (impl_)
+ impl_->ref();
+}
+
+Backtrace::Backtrace(Backtrace&& bt)
+{
+ impl_ = bt.impl_;
+ bt.impl_ = nullptr;
+}
+
+Backtrace& Backtrace::operator=(const Backtrace& rhs)
+{
+ if (this != &rhs) {
+ if (impl_)
+ impl_->unref();
+ impl_ = rhs.impl_;
+ if (impl_)
+ impl_->ref();
+ }
+ return *this;