Fennel: /home/pub/open/dev/fennel/common/Backtrace.h Source File (original) (raw)

00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023 00024 #ifndef Fennel_Backtrace_Included 00025 #define Fennel_Backtrace_Included 00026 00027 #include 00028 #include <stdlib.h> 00029 00030 #ifndef MSVC 00031 #include <signal.h> 00032 #include <execinfo.h> 00033 #include <link.h> 00034 #endif 00035 00036 00037 FENNEL_BEGIN_NAMESPACE 00038 00046 class FENNEL_COMMON_EXPORT Backtrace 00047 { 00048 size_t depth;
00049 const bool ownbuf;
00050 const size_t bufsize; 00051 void** addrbuf;
00052 00053 #ifndef MSVC 00054 struct LibraryInfo 00055 { 00056 ElfW(Addr) baseAddress; 00057 char const *pImageName; 00058 }; 00059 00060 static int lookupLibraryBase(struct dl_phdr_info , size_t, void ); 00061 #endif 00062 00063 public: 00069 Backtrace(size_t maxdepth = 32); 00070 00081 Backtrace(size_t bufsize, void buffer); 00082 00083 ~Backtrace(); 00084 00089 std::ostream& print(std::ostream&) const; 00090 00095 void print(int fd) const; 00096 00104 static void writeDemangled( 00105 std::ostream &out, char const pMangled); 00106 }; 00107 00108 inline std::ostream& operator << (std::ostream& os, const Backtrace& bt) 00109 { 00110 return bt.print(os); 00111 } 00112 00121 class FENNEL_COMMON_EXPORT AutoBacktrace 00122 { 00123 static std::ostream pstream; 00124 static SharedTraceTarget ptrace; 00125 static void signal_handler(int signum); 00126 #ifndef MSVC 00127 #define BACKTRACE_SIG_MAX 32 00128 static struct sigaction nextAction[BACKTRACE_SIG_MAX]; 00129 #endif 00130 00131
00132 AutoBacktrace() 00133 { 00134 } 00135 00136 static void installSignal(int signum); 00137 public: 00152 static void install(bool includeSegFault = true); 00153 00159 static void setOutputStream(std::ostream &outStream); 00160 00164 static void setOutputStream(); 00165 00173 static void setTraceTarget( 00174 SharedTraceTarget pTraceTarget = SharedTraceTarget()); 00175 }; 00176 00177 FENNEL_END_NAMESPACE 00178 00179 #endif 00180 00181