Changeset b542bfb


Ignore:
Timestamp:
Aug 29, 2016, 5:38:09 PM (8 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
8f6f47d7
Parents:
46f6134
Message:

print stack trace for assertion failure

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/main.cc

    r46f6134 rb542bfb  
    1010// Created On       : Fri May 15 23:12:02 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Aug 20 12:52:22 2016
    13 // Update Count     : 403
     12// Last Modified On : Mon Aug 29 17:34:39 2016
     13// Update Count     : 426
    1414//
    1515
     
    7575static void dump( list< Declaration * > & translationUnit, ostream & out = cout );
    7676
    77 void sigSegvBusHandler( int sig_num ) {
     77void backtrace( int start ) {                                                   // skip first N stack frames
    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 
    8681        char ** messages = backtrace_symbols( array, size );
    8782
    88         // skip first stack frame (points here)
    89         for ( int i = 2; i < size - 2 && messages != nullptr; i += 1 ) {
     83        // skip last 2 stack frames after main
     84        for ( int i = start; i < size - 2 && messages != nullptr; i += 1 ) {
    9085                char * mangled_name = nullptr, * offset_begin = nullptr, * offset_end = nullptr;
    9186                for ( char *p = messages[i]; *p; ++p ) {        // find parantheses and +offset
     
    10196
    10297                // if line contains symbol, attempt to demangle
     98                int frameNo = i - start;
    10399                if ( mangled_name && offset_begin && offset_end && mangled_name < offset_begin ) {
    104100                        *mangled_name++ = '\0';
     
    106102                        *offset_end++ = '\0';
    107103
    108                         int status;
     104                        int status, frameNo = i - start;
    109105                        char * real_name = __cxxabiv1::__cxa_demangle( mangled_name, 0, 0, &status );
    110106                        if ( status == 0 ) {                                            // demangling successful ?
    111                                 cerr << "(" << i - 2 << ") " << messages[i] << " : "
     107                                cerr << "(" << frameNo << ") " << messages[i] << " : "
    112108                                         << real_name << "+" << offset_begin << offset_end << endl;
    113109
    114110                        } else {                                                                        // otherwise, output mangled name
    115                                 cerr << "(" << i - 2 << ") " << messages[i] << " : "
     111                                cerr << "(" << frameNo << ") " << messages[i] << " : "
    116112                                         << mangled_name << "+" << offset_begin << offset_end << endl;
    117113                        } // if
    118114                        free( real_name );
    119115                } else {                                                                                // otherwise, print the whole line
    120                         cerr << "(" << i - 2 << ") " << messages[i] << endl;
     116                        cerr << "(" << frameNo << ") " << messages[i] << endl;
    121117                } // if
    122118        } // for
     119
    123120        free( messages );
     121} // backtrace
     122
     123void 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
    124128        exit( EXIT_FAILURE );
    125129} // sigSegvBusHandler
     130
     131void 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
    126137
    127138int main( int argc, char * argv[] ) {
     
    133144        signal( SIGSEGV, sigSegvBusHandler );
    134145        signal( SIGBUS, sigSegvBusHandler );
     146        signal( SIGABRT, sigAbortHandler );
    135147
    136148        parse_cmdline( argc, argv, filename );                          // process command-line arguments
Note: See TracChangeset for help on using the changeset viewer.