]> git.tdb.fi Git - libs/core.git/blobdiff - source/debug/backtrace.cpp
Use dladdr instead of backtrace_symbols in Backtrace::create (both are GNU-specific...
[libs/core.git] / source / debug / backtrace.cpp
index c0bfd9d9ca16158e898b7ecd2625eb9375d3bc6d..643fdf2bb03288dd16cdd3605e473d675541a479 100644 (file)
@@ -5,9 +5,11 @@ Copyright © 2007 Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 #ifndef WIN32
+#include <dlfcn.h>
 #include <execinfo.h>
 #endif
 #include "backtrace.h"
+#include "demangle.h"
 
 using namespace std;
 
@@ -20,13 +22,26 @@ Backtrace Backtrace::create()
        void *addresses[50];
        int count=::backtrace(addresses, 50);
 
-       char **symbols=backtrace_symbols(addresses, count);
+       //char **symbols=backtrace_symbols(addresses, count);
 
        Backtrace bt;
+       Dl_info dli;
        for(int i=0; i<count; ++i)
-               bt.frames.push_back(StackFrame(addresses[i], symbols[i]));
-
-       free(symbols);
+       {
+               StackFrame frame;
+               frame.address=addresses[i];
+               if(dladdr(addresses[i], &dli))
+               {
+                       frame.file=dli.dli_fname;
+                       if(dli.dli_sname)
+                               frame.symbol=demangle(dli.dli_sname);
+               }
+               else
+                       frame.file="<unknown>";
+               bt.frames.push_back(frame);
+       }
+
+       //free(symbols);
 
        return bt;
 #else
@@ -38,7 +53,7 @@ ostream &operator<<(ostream &out, const Backtrace &bt)
 {
        const Backtrace::FrameSeq &frames=bt.get_frames();
        for(Backtrace::FrameSeq::const_iterator i=frames.begin(); i!=frames.end(); ++i)
-               out<<i->address<<" in "<<i->symbol<<'\n';
+               out<<i->address<<" in "<<i->symbol<<" from "<<i->file<<'\n';
 
        return out;
 }