*/
-#include <pbd/stacktrace.h>
+#include "libpbd-config.h"
+
+#include "pbd/stacktrace.h"
+#include <cstdio>
#include <iostream>
+#include <string>
+
+void
+PBD::trace_twb ()
+{
+}
/* Obtain a backtrace and print it to stdout. */
#ifdef HAVE_EXECINFO
#include <execinfo.h>
-#include <stdlib.h>
+#include <cxxabi.h>
+
+static std::string
+symbol_demangle (const std::string& l)
+{
+ int status;
+
+ try {
+
+ char* realname = abi::__cxa_demangle (l.c_str(), 0, 0, &status);
+ std::string d (realname);
+ free (realname);
+ return d;
+ } catch (std::exception) {
+
+ }
+
+ return l;
+}
+
+std::string
+PBD::demangle (std::string const & l)
+{
+ std::string::size_type const b = l.find_first_of ("(");
+
+ if (b == std::string::npos) {
+ return symbol_demangle (l);
+ }
+
+ std::string::size_type const p = l.find_last_of ("+");
+ if (p == std::string::npos) {
+ return symbol_demangle (l);
+ }
+
+ if ((p - b) <= 1) {
+ return symbol_demangle (l);
+ }
+
+ std::string const fn = l.substr (b + 1, p - b - 1);
+
+ return symbol_demangle (fn);
+}
void
PBD::stacktrace (std::ostream& out, int levels)
size_t i;
size = backtrace (array, 200);
- strings = backtrace_symbols (array, size);
-
- if (strings) {
- printf ("Obtained %zd stack frames.\n", size);
-
- for (i = 0; i < size && (levels == 0 || i < size_t(levels)); i++) {
- out << strings[i] << std::endl;
+ if (size) {
+ strings = backtrace_symbols (array, size);
+
+ if (strings) {
+
+ for (i = 0; i < size && (levels == 0 || i < size_t(levels)); i++) {
+ out << " " << demangle (strings[i]) << std::endl;
+ }
+
+ free (strings);
}
-
- free (strings);
+ } else {
+ out << "no stacktrace available!" << std::endl;
}
}
#else
+std::string
+PBD::demangle (std::string const & l) /* JE - !!!! 'PBD' namespace might possibly get removed (except it's still used in 'libs/canvas/item.cc') */
+{
+ return std::string();
+}
+
void
-PBD::stacktrace (std::ostream& out, int levels)
+PBD::stacktrace (std::ostream& out, int /*levels*/)
{
out << "stack tracing is not enabled on this platform" << std::endl;
}