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),
152 {
return m_counter; }
168 { ++m_count;
return ++m_value; }
172 { --m_count;
return --m_value; }
176 { ++m_count;
return m_value += value; }
180 { --m_count;
return m_value -= value; }
184 { ++m_count;
if (m_value < value) m_value = value;
return m_value; }
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]