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 <ostream>
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