Changes in src/main.cc [b542bfb:46f6134]
- File:
-
- 1 edited
-
src/main.cc (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/main.cc
rb542bfb r46f6134 10 10 // Created On : Fri May 15 23:12:02 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Aug 29 17:34:39201613 // Update Count : 4 2612 // Last Modified On : Sat Aug 20 12:52:22 2016 13 // Update Count : 403 14 14 // 15 15 … … 75 75 static void dump( list< Declaration * > & translationUnit, ostream & out = cout ); 76 76 77 void backtrace( int start ) { // skip first N stack frames77 void sigSegvBusHandler( int sig_num ) { 78 78 enum { Frames = 50 }; 79 79 void * array[Frames]; 80 80 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 81 86 char ** messages = backtrace_symbols( array, size ); 82 87 83 // skip last 2 stack frames after main84 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 ) { 85 90 char * mangled_name = nullptr, * offset_begin = nullptr, * offset_end = nullptr; 86 91 for ( char *p = messages[i]; *p; ++p ) { // find parantheses and +offset … … 96 101 97 102 // if line contains symbol, attempt to demangle 98 int frameNo = i - start;99 103 if ( mangled_name && offset_begin && offset_end && mangled_name < offset_begin ) { 100 104 *mangled_name++ = '\0'; … … 102 106 *offset_end++ = '\0'; 103 107 104 int status , frameNo = i - start;108 int status; 105 109 char * real_name = __cxxabiv1::__cxa_demangle( mangled_name, 0, 0, &status ); 106 110 if ( status == 0 ) { // demangling successful ? 107 cerr << "(" << frameNo<< ") " << messages[i] << " : "111 cerr << "(" << i - 2 << ") " << messages[i] << " : " 108 112 << real_name << "+" << offset_begin << offset_end << endl; 109 113 110 114 } else { // otherwise, output mangled name 111 cerr << "(" << frameNo<< ") " << messages[i] << " : "115 cerr << "(" << i - 2 << ") " << messages[i] << " : " 112 116 << mangled_name << "+" << offset_begin << offset_end << endl; 113 117 } // if 114 118 free( real_name ); 115 119 } else { // otherwise, print the whole line 116 cerr << "(" << frameNo<< ") " << messages[i] << endl;120 cerr << "(" << i - 2 << ") " << messages[i] << endl; 117 121 } // if 118 122 } // for 119 120 123 free( messages ); 121 } // backtrace122 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 frames128 124 exit( EXIT_FAILURE ); 129 125 } // sigSegvBusHandler 130 131 void sigAbortHandler( int sig_num ) {132 backtrace( 6 ); // skip first 6 stack frames133 signal( SIGABRT, SIG_DFL); // reset default signal handler134 raise( SIGABRT ); // reraise SIGABRT135 } // sigAbortHandler136 137 126 138 127 int main( int argc, char * argv[] ) { … … 144 133 signal( SIGSEGV, sigSegvBusHandler ); 145 134 signal( SIGBUS, sigSegvBusHandler ); 146 signal( SIGABRT, sigAbortHandler );147 135 148 136 parse_cmdline( argc, argv, filename ); // process command-line arguments
Note:
See TracChangeset
for help on using the changeset viewer.