10 # include <execinfo.h> 11 # include <ucontext.h> 12 # include <sys/syscall.h> 14 # define UNW_LOCAL_ONLY 15 # include <libunwind.h> 19 extern "C" void _sigtramp (
void);
24 #if !defined MAP_ANONYMOUS && defined MAP_ANON 25 # define MAP_ANONYMOUS MAP_ANON 35 #if 0 && __x86_64__ && __linux 64 struct IgHookTraceArgs
80 static _Unwind_Reason_Code
81 GCCBackTrace (_Unwind_Context *context,
void *arg)
83 IgHookTraceArgs *
args = (IgHookTraceArgs *) arg;
84 if (args->stack.top < 0 || args->stack.top >= args->stack.size)
85 return _URC_END_OF_STACK;
87 args->stack.addresses [args->stack.top++] = (
void *) _Unwind_GetIP (context);
88 args->prevframe = (
void **) _Unwind_GetCFA (context);
89 return _URC_NO_REASON;
116 size_t psize = getpagesize ();
117 size_t hunk = psize * 20;
118 if (hunk < bytes) hunk = (hunk + psize - 1) & ~(psize-1);
119 void *addr = mmap (0, hunk, PROT_READ | PROT_WRITE,
120 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
121 if (addr == MAP_FAILED)
139 {
return alloc ? alloc->allocate (n) : ::operator
new (
n); }
143 unsigned long long value )
144 : m_counter (counter),
203 {
return alloc ? alloc->allocate (n) : ::operator
new (
n); }
235 liboffset = (
unsigned long) address;
238 if (dladdr (address, &info))
240 if (info.dli_fname && info.dli_fname [0])
241 lib = info.dli_fname;
244 liboffset = (
unsigned long) address - (
unsigned long) info.dli_fbase;
247 offset = (
unsigned long) address - (
unsigned long) info.dli_saddr;
249 if (info.dli_sname && info.dli_sname [0])
250 sym = info.dli_sname;
266 return (dladdr (address, &info)
268 && info.dli_fname [0]
CounterValue * next(void)
static void * tosymbol(void *address)
IgHookTrace * parent(void)
unsigned long long untick(void)
unsigned long long add(unsigned long long value)
unsigned long long tick(void)
Value for a counter chained from a trace.
static bool symbol(void *address, const char *&sym, const char *&lib, int &offset, int &liboffset)
unsigned long long max(unsigned long long value)
unsigned long long value(void)
unsigned long long m_value
unsigned long long sub(unsigned long long value)
Nearly dummy object type to identify a counter.
CounterValue(Counter *counter, CounterValue *next=0, unsigned long long value=0)
unsigned long long m_count
CounterValue * m_counters
IgHookTraceAlloc * m_alloc
unsigned long long count(void)
IgHookTrace(IgHookTrace *parent=0, void *address=0)
void * allocate(size_t bytes)