X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fstacktrace.cc;h=805b9a2e840e211fd1dac478e364db0071c776f3;hb=cd28d62b26214770cfc269aafe666ec2fb3f2607;hp=82a78c6fe2b7476f374336c03306b7aa26513a96;hpb=9e8082aad6645f67cb18ea608abb6a854fd268d0;p=ardour.git diff --git a/libs/pbd/stacktrace.cc b/libs/pbd/stacktrace.cc index 82a78c6fe2..805b9a2e84 100644 --- a/libs/pbd/stacktrace.cc +++ b/libs/pbd/stacktrace.cc @@ -1,12 +1,72 @@ -#include +/* + Copyright (C) 2000-2007 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "libpbd-config.h" + +#include "pbd/stacktrace.h" +#include #include +void +PBD::trace_twb () +{ +} + /* Obtain a backtrace and print it to stdout. */ #ifdef HAVE_EXECINFO #include -#include +#include + +std::string demangle (std::string const & l) +{ + std::string::size_type const b = l.find_first_of ("("); + if (b == std::string::npos) { + return l; + } + + std::string::size_type const p = l.find_last_of ("+"); + if (p == std::string::npos) { + return l; + } + + if ((p - b) <= 1) { + return l; + } + + std::string const fn = l.substr (b + 1, p - b - 1); + + int status; + try { + + char* realname = abi::__cxa_demangle (fn.c_str(), 0, 0, &status); + std::string d (realname); + free (realname); + return d; + + } catch (std::exception) { + + } + + return l; +} void PBD::stacktrace (std::ostream& out, int levels) @@ -17,24 +77,27 @@ 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 < 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 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; } @@ -42,7 +105,7 @@ PBD::stacktrace (std::ostream& out, int levels) void c_stacktrace () { - PBD::stacktrace (cout); + PBD::stacktrace (std::cout); } #endif /* HAVE_EXECINFO */