![]() |
![]() |
#include "IgTools/IgTrace/src/IgTrace.h"
#include "IgTools/IgHook/interface/IgHook.h"
#include "IgTools/IgHook/interface/IgHookTrace.h"
#include <typeinfo>
#include <cxxabi.h>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <pthread.h>
#include <unistd.h>
Go to the source code of this file.
Classes | |
class | IgTraceThrow |
Functions | |
static void | dothrow (IgHook::SafeData< igtrace_dothrow_t > &hook, void *exception, std::type_info *tinfo, void(*dest)(void *)) |
IGTRACE_HOOK (3, void, dothrow, _main,(void *exception, std::type_info *tinfo, void(*dest)(void *)),(exception, tinfo, dest),"__cxa_throw") static bool s_initialized | |
Variables | |
static bool | autoboot = (IgTraceThrow::initialize (), true) |
static bool | s_demangle = false |
static char * | s_demanglehere = 0 |
static size_t | s_demanglelen = 0 |
static pthread_mutex_t | s_demanglelock = PTHREAD_MUTEX_INITIALIZER |
static void dothrow | ( | IgHook::SafeData< igtrace_dothrow_t > & | hook, | |
void * | exception, | |||
std::type_info * | tinfo, | |||
void(*)(void *) | dest | |||
) | [static] |
Definition at line 97 of file IgTraceThrow.cc.
References IgHook::SafeData< Func >::chain, cmsTiming_parser::dest, IgTrace::filter(), i, IgTrace::program(), s_demangle, s_demanglehere, s_demanglelen, s_demanglelock, IgHookTrace::stacktrace(), StDecayID::status, and IgHookTrace::symbol().
00100 { 00101 void *stack [800]; 00102 int depth = IgHookTrace::stacktrace (stack, sizeof (stack)/sizeof(stack[0])); 00103 00104 // If it passes filters, walk the stack to print out information. 00105 if (IgTrace::filter (tinfo->name (), stack, depth)) 00106 { 00107 char buf [2048]; 00108 const char *sym = 0; 00109 const char *lib = 0; 00110 int symoff = 0; 00111 int liboff = 0; 00112 00113 pthread_mutex_lock(&s_demanglelock); 00114 const char *tname = (tinfo ? tinfo->name() : 0); 00115 if (tname && *tname && s_demangle) 00116 { 00117 int status = 0; 00118 char *demangled = abi::__cxa_demangle (tname, s_demanglehere, 00119 &s_demanglelen, &status); 00120 if (status == 0 && demangled && *demangled) 00121 tname = demangled; 00122 if (demangled && demangled != s_demanglehere) 00123 s_demanglehere = demangled; 00124 } 00125 00126 write (2, buf, sprintf (buf, 00127 "*** THROW by %.500s [thread %lu pid %ld]:\n" 00128 " Exception of type %.500s (address %p)\n", 00129 IgTrace::program(), 00130 (unsigned long) pthread_self (), (long) getpid (), 00131 tname, exception)); 00132 00133 IgHookTrace::symbol ((void *) dest, sym, lib, symoff, liboff); 00134 if (sym && *sym && s_demangle) 00135 { 00136 int status = 0; 00137 char *demangled = abi::__cxa_demangle (sym, s_demanglehere, &s_demanglelen, &status); 00138 if (status == 0 && demangled && *demangled) 00139 sym = demangled; 00140 if (demangled && demangled != s_demanglehere) 00141 s_demanglehere = demangled; 00142 } 00143 write (2, buf, sprintf (buf, " Destructor %.500s (%p)\n Stack:\n", 00144 (sym ? sym : "unknown function"), (void *) dest)); 00145 00146 00147 for (int i = 2; i < depth; ++i) 00148 { 00149 void *symaddr = stack[i]; 00150 if (IgHookTrace::symbol (symaddr, sym, lib, symoff, liboff)) 00151 symaddr = (void *) ((intptr_t) symaddr - symoff); 00152 00153 char hexsym [32]; 00154 if (! sym || ! *sym) 00155 { 00156 sprintf(hexsym, "@?%p", symaddr); 00157 sym = hexsym; 00158 } 00159 else if (s_demangle) 00160 { 00161 int status = 0; 00162 char *demangled = abi::__cxa_demangle (sym, s_demanglehere, &s_demanglelen, &status); 00163 if (status == 0 && demangled && *demangled) 00164 sym = demangled; 00165 if (demangled && demangled != s_demanglehere) 00166 s_demanglehere = demangled; 00167 } 00168 if (! lib) 00169 lib = "<unknown library>"; 00170 00171 write (2, buf, sprintf (buf, 00172 " %3d: %-10p %.500s + %d [%.500s + %d]\n", 00173 i-1, stack [i], sym, symoff, lib, liboff)); 00174 } 00175 pthread_mutex_unlock(&s_demanglelock); 00176 } 00177 00178 // Call the actual throw. 00179 (*hook.chain) (exception, tinfo, dest); 00180 }
IGTRACE_HOOK | ( | 3 | , | |
void | , | |||
dothrow | , | |||
_main | , | |||
(void *exception, std::type_info *tinfo, void(*dest)(void *)) | , | |||
(exception, tinfo, dest) | , | |||
"__cxa_throw" | ||||
) |
Definition at line 183 of file IgTraceThrow.cc.
bool s_demangle = false [static] |
Definition at line 37 of file IgTraceThrow.cc.
char* s_demanglehere = 0 [static] |
Definition at line 38 of file IgTraceThrow.cc.
size_t s_demanglelen = 0 [static] |
Definition at line 39 of file IgTraceThrow.cc.
pthread_mutex_t s_demanglelock = PTHREAD_MUTEX_INITIALIZER [static] |
Definition at line 40 of file IgTraceThrow.cc.