CMS 3D CMS Logo

IgTraceThrow.cc File Reference

#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


Function Documentation

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 ( ,
void  ,
dothrow  ,
_main  ,
(void *exception, std::type_info *tinfo, void(*dest)(void *))  ,
(exception, tinfo, dest)  ,
"__cxa_throw"   
)


Variable Documentation

bool autoboot = (IgTraceThrow::initialize (), true) [static]

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.


Generated on Tue Jun 9 17:53:54 2009 for CMSSW by  doxygen 1.5.4