Distributed under the LGPL
*/
#ifndef WIN32
+#include <dlfcn.h>
#include <execinfo.h>
#endif
#include "backtrace.h"
+#include "demangle.h"
using namespace std;
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
{
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;
}