Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/libcfa/interpose.c

    ra424315d r6bfe5cc  
    1010// Created On       : Wed Mar 29 16:10:31 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb  7 09:05:18 2018
    13 // Update Count     : 59
     12// Last Modified On : Mon Feb  5 23:40:04 2018
     13// Update Count     : 17
    1414//
    1515
     
    8888
    8989void sigHandler_segv ( __CFA_SIGPARMS__ );
    90 void sigHandler_ill  ( __CFA_SIGPARMS__ );
    91 void sigHandler_fpe  ( __CFA_SIGPARMS__ );
    9290void sigHandler_abort( __CFA_SIGPARMS__ );
    9391
     
    10098                INIT_REALRTN( exit, version );
    10199
    102                 __cfaabi_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); // Failure handler
    103                 __cfaabi_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO ); // Failure handler
    104                 __cfaabi_sigaction( SIGILL , sigHandler_ill  , SA_SIGINFO ); // Failure handler
    105                 __cfaabi_sigaction( SIGFPE , sigHandler_fpe  , SA_SIGINFO ); // Failure handler
    106                 __cfaabi_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler
     100                __kernel_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); // Failure handler
     101                __kernel_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO ); // Failure handler
     102                __kernel_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler
    107103        }
    108104}
     
    122118}
    123119
    124 void abort( const char fmt[], ... ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) {
    125         va_list argp;
    126         va_start( argp, fmt );
     120void abort( const char *fmt, va_list argp ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) {
    127121        abortf( fmt, argp );
    128         va_end( argp );
    129122}
    130123
    131124void * kernel_abort    ( void ) __attribute__ ((__nothrow__, __leaf__, __weak__)) { return NULL; }
    132125void   kernel_abort_msg( void * data, char * buffer, int size ) __attribute__ ((__nothrow__, __leaf__, __weak__)) {}
    133 int kernel_abort_lastframe( void ) __attribute__ ((__nothrow__, __leaf__, __weak__)) { return 4; }
    134126
    135127enum { abort_text_size = 1024 };
    136128static char abort_text[ abort_text_size ];
    137 static int abort_lastframe;
    138129
    139130extern "C" {
    140131        void abortf( const char fmt[], ... ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) {
    141                 void * kernel_data = kernel_abort();                    // must be done here to lock down kernel
     132                void * kernel_data = kernel_abort();
     133
    142134                int len;
    143 
    144                 abort_lastframe = kernel_abort_lastframe();
    145                 len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid)
    146                 __cfaabi_dbg_bits_write( abort_text, len );
    147135
    148136                if ( fmt ) {
     
    151139
    152140                        len = vsnprintf( abort_text, abort_text_size, fmt, args );
     141
    153142                        va_end( args );
     143
    154144                        __cfaabi_dbg_bits_write( abort_text, len );
    155 
    156                         if ( fmt[strlen( fmt ) - 1] != '\n' ) {         // add optional newline if missing at the end of the format text
    157                                 __cfaabi_dbg_bits_write( "\n", 1 );
    158                         }
    159                 }
     145                        //__cfaabi_dbg_bits_write( "\n", 1 );
     146                }
     147
     148                len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld)\n", (long int)getpid() ); // use UNIX pid (versus getPid)
     149                __cfaabi_dbg_bits_write( abort_text, len );
     150
    160151
    161152                kernel_abort_msg( kernel_data, abort_text, abort_text_size );
     153
    162154                libc_abort();
    163155        }
    164156}
    165157
    166 static void __cfaabi_backtrace() {
    167         enum {
    168                 Frames = 50,                                                                    // maximum number of stack frames
    169                 Start = 8,                                                                              // skip first N stack frames
    170         };
    171 
     158// skip first 6 stack frames by default
     159static void __kernel_backtrace() {
     160        // skip first N stack frames
     161        int start = 6;
     162
     163        enum { Frames = 50 };
    172164        void * array[Frames];
    173165        size_t size = backtrace( array, Frames );
     
    178170        __cfaabi_dbg_bits_print_nolock( "Stack back trace for: %s\n", messages[0]);
    179171
    180         for ( int i = Start; i < size - abort_lastframe && messages != NULL; i += 1 ) {
    181                 char * name = NULL, * offset_begin = NULL, * offset_end = NULL;
    182 
    183                 for ( char * p = messages[i]; *p; ++p ) {
     172        // skip last 2 stack frames after main
     173        for ( int i = start; i < size && messages != NULL; i += 1 ) {
     174                char * name = NULL;
     175                char * offset_begin = NULL;
     176                char * offset_end = NULL;
     177
     178                for ( char *p = messages[i]; *p; ++p ) {
    184179                        //__cfaabi_dbg_bits_print_nolock( "X %s\n", p);
    185180                        // find parantheses and +offset
     
    197192
    198193                // if line contains symbol print it
    199                 int frameNo = i - Start;
     194                int frameNo = i - start;
    200195                if ( name && offset_begin && offset_end && name < offset_begin ) {
    201196                        // delimit strings
     
    211206                }
    212207        }
     208
    213209        free( messages );
    214210}
    215211
    216212void sigHandler_segv( __CFA_SIGPARMS__ ) {
    217         abortf( "Addressing invalid memory at location %p\n"
    218                         "Possible cause is reading outside the address space or writing to a protected area within the address space with an invalid pointer or subscript.\n",
    219                         sfp->si_addr );
    220 }
    221 
    222 void sigHandler_ill( __CFA_SIGPARMS__ ) {
    223         abortf( "Executing illegal instruction at location %p.\n"
    224                         "Possible cause is stack corruption.\n",
    225                         sfp->si_addr );
    226 }
    227 
    228 void sigHandler_fpe( __CFA_SIGPARMS__ ) {
    229         const char * msg;
    230 
    231         choose( sfp->si_code ) {
    232           case FPE_INTDIV, FPE_FLTDIV: msg = "divide by zero";
    233           case FPE_FLTOVF: msg = "overflow";
    234           case FPE_FLTUND: msg = "underflow";
    235           case FPE_FLTRES: msg = "inexact result";
    236           case FPE_FLTINV: msg = "invalid operation";
    237           default: msg = "unknown";
    238         } // choose
    239         abortf( "Computation error %s at location %p.\n", msg, sfp->si_addr );
     213        // skip first only 1 stack frames in case of segfault.
     214        abortf( "*CFA runtime error* program cfa-cpp terminated with %s\n", sig == SIGSEGV ? "segment fault." : "bus error." );
    240215}
    241216
    242217void sigHandler_abort( __CFA_SIGPARMS__ ) {
    243         __cfaabi_backtrace();
     218        __kernel_backtrace();
    244219
    245220        // reset default signal handler
    246         __cfaabi_sigdefault( SIGABRT );
     221        __kernel_sigdefault( SIGABRT );
    247222
    248223        raise( SIGABRT );
Note: See TracChangeset for help on using the changeset viewer.