Index: src/main.cc
===================================================================
--- src/main.cc	(revision 46f61345ffd40c8a09b489da6e3b288fbf479cdf)
+++ src/main.cc	(revision b542bfb3722bdbb64bd16d352ff9d563d92afb57)
@@ -10,6 +10,6 @@
 // Created On       : Fri May 15 23:12:02 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Aug 20 12:52:22 2016
-// Update Count     : 403
+// Last Modified On : Mon Aug 29 17:34:39 2016
+// Update Count     : 426
 //
 
@@ -75,17 +75,12 @@
 static void dump( list< Declaration * > & translationUnit, ostream & out = cout );
 
-void sigSegvBusHandler( int sig_num ) {
+void backtrace( int start ) {							// skip first N stack frames
 	enum { Frames = 50 };
 	void * array[Frames];
 	int size = backtrace( array, Frames );
-
-	cerr << "*CFA runtime error* program cfa-cpp terminated with "
-		 <<	(sig_num == SIGSEGV ? "segment fault" : "bus error")
-		 << " backtrace:" << endl;
-
 	char ** messages = backtrace_symbols( array, size );
 
-	// skip first stack frame (points here)
-	for ( int i = 2; i < size - 2 && messages != nullptr; i += 1 ) {
+	// skip last 2 stack frames after main
+	for ( int i = start; i < size - 2 && messages != nullptr; i += 1 ) {
 		char * mangled_name = nullptr, * offset_begin = nullptr, * offset_end = nullptr;
 		for ( char *p = messages[i]; *p; ++p ) {        // find parantheses and +offset
@@ -101,4 +96,5 @@
 
 		// if line contains symbol, attempt to demangle
+		int frameNo = i - start;
 		if ( mangled_name && offset_begin && offset_end && mangled_name < offset_begin ) {
 			*mangled_name++ = '\0';
@@ -106,22 +102,37 @@
 			*offset_end++ = '\0';
 
-			int status;
+			int status, frameNo = i - start;
 			char * real_name = __cxxabiv1::__cxa_demangle( mangled_name, 0, 0, &status );
 			if ( status == 0 ) {						// demangling successful ?
-				cerr << "(" << i - 2 << ") " << messages[i] << " : "
+				cerr << "(" << frameNo << ") " << messages[i] << " : "
 					 << real_name << "+" << offset_begin << offset_end << endl;
 
 			} else {									// otherwise, output mangled name
-				cerr << "(" << i - 2 << ") " << messages[i] << " : "
+				cerr << "(" << frameNo << ") " << messages[i] << " : "
 					 << mangled_name << "+" << offset_begin << offset_end << endl;
 			} // if
 			free( real_name );
 		} else {										// otherwise, print the whole line
-			cerr << "(" << i - 2 << ") " << messages[i] << endl;
+			cerr << "(" << frameNo << ") " << messages[i] << endl;
 		} // if
 	} // for
+
 	free( messages );
+} // backtrace
+
+void sigSegvBusHandler( int sig_num ) {
+	cerr << "*CFA runtime error* program cfa-cpp terminated with "
+		 <<	(sig_num == SIGSEGV ? "segment fault" : "bus error")
+		 << " backtrace:" << endl;
+	backtrace( 2 );										// skip first 2 stack frames
 	exit( EXIT_FAILURE );
 } // sigSegvBusHandler
+
+void sigAbortHandler( int sig_num ) {
+	backtrace( 6 );										// skip first 6 stack frames
+	signal( SIGABRT, SIG_DFL);							// reset default signal handler
+    raise( SIGABRT );									// reraise SIGABRT
+} // sigAbortHandler
+
 
 int main( int argc, char * argv[] ) {
@@ -133,4 +144,5 @@
 	signal( SIGSEGV, sigSegvBusHandler );
 	signal( SIGBUS, sigSegvBusHandler );
+	signal( SIGABRT, sigAbortHandler );
 
 	parse_cmdline( argc, argv, filename );				// process command-line arguments
