#include <execinfo.h>
#include <sstream>
#include "../config.hh"
-
-// Copied from the binutils sources
-#define HAVE_DECL_BASENAME 1
-#define HAVE_DECL_ASPRINTF 1
-#define HAVE_DECL_VASPRINTF 1
-#include "impl/demangle.h"
+#include "Backtrace.hh"
#define prefix_
///////////////////////////////cc.p////////////////////////////////////////
{
void * entries[SENF_DEBUG_BACKTRACE_NUMCALLERS];
unsigned nEntries( ::backtrace(entries, SENF_DEBUG_BACKTRACE_NUMCALLERS) );
- char ** symbols = ::backtrace_symbols(entries, nEntries);
-
+
std::stringstream ss;
ss << "\nException at\n";
- for (unsigned i=0; i<nEntries; ++i) {
- std::string sym (symbols[i]);
- std::string::size_type fnStart (sym.find("("));
- if (fnStart != std::string::npos) {
- std::string::size_type fnEnd (sym.find(")",fnStart+1));
- if (fnEnd != std::string::npos) {
- std::string fn (sym,fnStart+1, fnEnd-fnStart-1);
- char * demangled ( ::cplus_demangle(fn.c_str(),
- DMGL_TYPES|DMGL_AUTO) );
- if (demangled) {
- ss << " " << demangled << "( ... )" << std::string(sym,fnEnd+1) << "\n";
- continue;
- }
- }
- }
- ss << " " << sym << "\n";
- }
+ formatBacktrace(ss, entries, nEntries);
ss << "-- \n" << message_;
message_ = ss.str();
- free(symbols);
}
#endif