Packets: Fix VariantParser invalid parser access bug
[senf.git] / Utils / Exception.cc
index c86dade..b2c750f 100644 (file)
@@ -30,7 +30,7 @@
 #include <execinfo.h>
 #include <sstream>
 #include "../config.hh"
-#include "impl/demangle.h"
+#include "Backtrace.hh"
 
 #define prefix_
 ///////////////////////////////cc.p////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////
 // senf::Exception
 
-prefix_ senf::Exception::~Exception()
-    throw()
-{}
-
-prefix_ char const * senf::Exception::what()
-    const throw()
-{
-    return message_.c_str();
-}
-
 #ifdef SENF_DEBUG
-prefix_ void senf::Exception::addBacktrace()
+prefix_ void senf::ExceptionMixin::addBacktrace()
 {
     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
 
+/////////////////////////////////////////////////////////////////////////// 
+// senf::Exception
+
+prefix_ senf::Exception::~Exception()
+    throw()
+{}
+
+prefix_ char const * senf::Exception::what()
+    const throw()
+{
+    return message().c_str();
+}
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::SystemException