Changes in src/libcfa/interpose.c [a424315d:6bfe5cc]
- File:
-
- 1 edited
-
src/libcfa/interpose.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/interpose.c
ra424315d r6bfe5cc 10 10 // Created On : Wed Mar 29 16:10:31 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Feb 7 09:05:18201813 // Update Count : 5912 // Last Modified On : Mon Feb 5 23:40:04 2018 13 // Update Count : 17 14 14 // 15 15 … … 88 88 89 89 void sigHandler_segv ( __CFA_SIGPARMS__ ); 90 void sigHandler_ill ( __CFA_SIGPARMS__ );91 void sigHandler_fpe ( __CFA_SIGPARMS__ );92 90 void sigHandler_abort( __CFA_SIGPARMS__ ); 93 91 … … 100 98 INIT_REALRTN( exit, version ); 101 99 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 107 103 } 108 104 } … … 122 118 } 123 119 124 void abort( const char fmt[], ... ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) { 125 va_list argp; 126 va_start( argp, fmt ); 120 void abort( const char *fmt, va_list argp ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) { 127 121 abortf( fmt, argp ); 128 va_end( argp );129 122 } 130 123 131 124 void * kernel_abort ( void ) __attribute__ ((__nothrow__, __leaf__, __weak__)) { return NULL; } 132 125 void 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; }134 126 135 127 enum { abort_text_size = 1024 }; 136 128 static char abort_text[ abort_text_size ]; 137 static int abort_lastframe;138 129 139 130 extern "C" { 140 131 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 142 134 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 );147 135 148 136 if ( fmt ) { … … 151 139 152 140 len = vsnprintf( abort_text, abort_text_size, fmt, args ); 141 153 142 va_end( args ); 143 154 144 __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 160 151 161 152 kernel_abort_msg( kernel_data, abort_text, abort_text_size ); 153 162 154 libc_abort(); 163 155 } 164 156 } 165 157 166 static void __cfaabi_backtrace() { 167 enum{168 Frames = 50, // maximum number ofstack frames169 Start = 8, // skip first N stack frames170 }; 171 158 // skip first 6 stack frames by default 159 static void __kernel_backtrace() { 160 // skip first N stack frames 161 int start = 6; 162 163 enum { Frames = 50 }; 172 164 void * array[Frames]; 173 165 size_t size = backtrace( array, Frames ); … … 178 170 __cfaabi_dbg_bits_print_nolock( "Stack back trace for: %s\n", messages[0]); 179 171 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 ) { 184 179 //__cfaabi_dbg_bits_print_nolock( "X %s\n", p); 185 180 // find parantheses and +offset … … 197 192 198 193 // if line contains symbol print it 199 int frameNo = i - Start;194 int frameNo = i - start; 200 195 if ( name && offset_begin && offset_end && name < offset_begin ) { 201 196 // delimit strings … … 211 206 } 212 207 } 208 213 209 free( messages ); 214 210 } 215 211 216 212 void 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." ); 240 215 } 241 216 242 217 void sigHandler_abort( __CFA_SIGPARMS__ ) { 243 __ cfaabi_backtrace();218 __kernel_backtrace(); 244 219 245 220 // reset default signal handler 246 __ cfaabi_sigdefault( SIGABRT );221 __kernel_sigdefault( SIGABRT ); 247 222 248 223 raise( SIGABRT );
Note:
See TracChangeset
for help on using the changeset viewer.