#include "ATOOLS/Org/Stacktrace.H" #include "ATOOLS/Org/Message.H" #include "ATOOLS/Org/Shell_Tools.H" #include #define USING_Stack_Trace #ifndef __USE_GNU #ifdef __GNUC__ #define __USE_GNU #ifdef ARCH_DARWIN #undef USING_Stack_Trace #endif #else #undef USING_Stack_Trace #endif #endif #ifdef USING_Stack_Trace #include #include #define MAX_BACKTRACE_DEPTH 128 #endif void ATOOLS::GenerateStackTrace(std::ostream &ostr, const bool endline, const std::string &comment) { #ifdef USING_Stack_Trace ostr<LevelIsDebugging()) { // if (std::string(symname).find // ("Exception_Handler")!=std::string::npos || // std::string(symname).find // ("HandleSignal")!=std::string::npos) continue; // } std::string linfo; unsigned long libaddr=(unsigned long)info.dli_fbase; unsigned long offset=(addr>=libaddr)?addr-libaddr:libaddr-libaddr; char cmd[4096]; sprintf(cmd,"addr2line -se %s 0x%016lx 2>/dev/null", info.dli_fname,offset); if (FILE *pf=popen(cmd,"r")) { char buf[2048]; if (fgets(buf,2048,pf)) { linfo=buf; linfo=linfo.substr(0,linfo.length()-1); } if (linfo=="??:0") { pclose(pf); sprintf(cmd,"addr2line -se %s 0x%016lx 2>/dev/null", info.dli_fname,addr); pf=popen(cmd,"r"); if (fgets(buf,2048,pf)) { linfo=buf; linfo=linfo.substr(0,linfo.length()-1); } if (linfo=="??:0") linfo=""; } pclose(pf); } ostr<LevelIsDebugging()) ostr<<" from '"<< om::brown<"<