Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/main.cc

    rb542bfb r46f6134  
    1010// Created On       : Fri May 15 23:12:02 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Aug 29 17:34:39 2016
    13 // Update Count     : 426
     12// Last Modified On : Sat Aug 20 12:52:22 2016
     13// Update Count     : 403
    1414//
    1515
     
    7575static void dump( list< Declaration * > & translationUnit, ostream & out = cout );
    7676
    77 void backtrace( int start ) {                                                   // skip first N stack frames
     77void sigSegvBusHandler( int sig_num ) {
    7878        enum { Frames = 50 };
    7979        void * array[Frames];
    8080        int size = backtrace( array, Frames );
     81
     82        cerr << "*CFA runtime error* program cfa-cpp terminated with "
     83                 <<     (sig_num == SIGSEGV ? "segment fault" : "bus error")
     84                 << " backtrace:" << endl;
     85
    8186        char ** messages = backtrace_symbols( array, size );
    8287
    83         // skip last 2 stack frames after main
    84         for ( int i = start; i < size - 2 && messages != nullptr; i += 1 ) {
     88        // skip first stack frame (points here)
     89        for ( int i = 2; i < size - 2 && messages != nullptr; i += 1 ) {
    8590                char * mangled_name = nullptr, * offset_begin = nullptr, * offset_end = nullptr;
    8691                for ( char *p = messages[i]; *p; ++p ) {        // find parantheses and +offset
     
    96101
    97102                // if line contains symbol, attempt to demangle
    98                 int frameNo = i - start;
    99103                if ( mangled_name && offset_begin && offset_end && mangled_name < offset_begin ) {
    100104                        *mangled_name++ = '\0';
     
    102106                        *offset_end++ = '\0';
    103107
    104                         int status, frameNo = i - start;
     108                        int status;
    105109                        char * real_name = __cxxabiv1::__cxa_demangle( mangled_name, 0, 0, &status );
    106110                        if ( status == 0 ) {                                            // demangling successful ?
    107                                 cerr << "(" << frameNo << ") " << messages[i] << " : "
     111                                cerr << "(" << i - 2 << ") " << messages[i] << " : "
    108112                                         << real_name << "+" << offset_begin << offset_end << endl;
    109113
    110114                        } else {                                                                        // otherwise, output mangled name
    111                                 cerr << "(" << frameNo << ") " << messages[i] << " : "
     115                                cerr << "(" << i - 2 << ") " << messages[i] << " : "
    112116                                         << mangled_name << "+" << offset_begin << offset_end << endl;
    113117                        } // if
    114118                        free( real_name );
    115119                } else {                                                                                // otherwise, print the whole line
    116                         cerr << "(" << frameNo << ") " << messages[i] << endl;
     120                        cerr << "(" << i - 2 << ") " << messages[i] << endl;
    117121                } // if
    118122        } // for
    119 
    120123        free( messages );
    121 } // backtrace
    122 
    123 void sigSegvBusHandler( int sig_num ) {
    124         cerr << "*CFA runtime error* program cfa-cpp terminated with "
    125                  <<     (sig_num == SIGSEGV ? "segment fault" : "bus error")
    126                  << " backtrace:" << endl;
    127         backtrace( 2 );                                                                         // skip first 2 stack frames
    128124        exit( EXIT_FAILURE );
    129125} // sigSegvBusHandler
    130 
    131 void sigAbortHandler( int sig_num ) {
    132         backtrace( 6 );                                                                         // skip first 6 stack frames
    133         signal( SIGABRT, SIG_DFL);                                                      // reset default signal handler
    134     raise( SIGABRT );                                                                   // reraise SIGABRT
    135 } // sigAbortHandler
    136 
    137126
    138127int main( int argc, char * argv[] ) {
     
    144133        signal( SIGSEGV, sigSegvBusHandler );
    145134        signal( SIGBUS, sigSegvBusHandler );
    146         signal( SIGABRT, sigAbortHandler );
    147135
    148136        parse_cmdline( argc, argv, filename );                          // process command-line arguments
Note: See TracChangeset for help on using the changeset viewer.