Index: src/main.cc
===================================================================
--- src/main.cc	(revision 4b1afb612226e0433d5fc67b4d46e47789cfa3df)
+++ src/main.cc	(revision 955d9e436566fa359c379c3c89bde7042f54f089)
@@ -10,6 +10,6 @@
 // Created On       : Fri May 15 23:12:02 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Aug 29 17:34:39 2016
-// Update Count     : 426
+// Last Modified On : Sun Oct 30 10:11:38 2016
+// Update Count     : 435
 //
 
@@ -18,6 +18,7 @@
 #include <signal.h>										// signal
 #include <getopt.h>										// getopt
-#include <execinfo.h>									// backtrace, backtrace_symbols_fd
+#include <execinfo.h>									// backtrace, backtrace_symbols
 #include <cxxabi.h>										// __cxa_demangle
+#include <cstring>										// index
 
 using namespace std;
@@ -75,9 +76,12 @@
 static void dump( list< Declaration * > & translationUnit, ostream & out = cout );
 
-void backtrace( int start ) {							// skip first N stack frames
+static void backtrace( int start ) {					// skip first N stack frames
 	enum { Frames = 50 };
 	void * array[Frames];
-	int size = backtrace( array, Frames );
-	char ** messages = backtrace_symbols( array, size );
+	int size = ::backtrace( array, Frames );
+	char ** messages = ::backtrace_symbols( array, size ); // does not demangle names
+
+	*index( messages[0], '(' ) = '\0';					// find executable name
+	cerr << "Stack back trace for: " << messages[0] << endl;
 
 	// skip last 2 stack frames after main
@@ -85,9 +89,9 @@
 		char * mangled_name = nullptr, * offset_begin = nullptr, * offset_end = nullptr;
 		for ( char *p = messages[i]; *p; ++p ) {        // find parantheses and +offset
-			if (*p == '(') {
+			if ( *p == '(' ) {
 				mangled_name = p;
-			} else if (*p == '+') {
+			} else if ( *p == '+' ) {
 				offset_begin = p;
-			} else if (*p == ')') {
+			} else if ( *p == ')' ) {
 				offset_end = p;
 				break;
@@ -98,18 +102,19 @@
 		int frameNo = i - start;
 		if ( mangled_name && offset_begin && offset_end && mangled_name < offset_begin ) {
-			*mangled_name++ = '\0';
+			*mangled_name++ = '\0';						// delimit strings
 			*offset_begin++ = '\0';
 			*offset_end++ = '\0';
 
-			int status, frameNo = i - start;
+			int status;
 			char * real_name = __cxxabiv1::__cxa_demangle( mangled_name, 0, 0, &status );
+			// bug in __cxa_demangle for single-character lower-case non-mangled names
 			if ( status == 0 ) {						// demangling successful ?
 				cerr << "(" << frameNo << ") " << messages[i] << " : "
 					 << real_name << "+" << offset_begin << offset_end << endl;
-
 			} else {									// otherwise, output mangled name
 				cerr << "(" << frameNo << ") " << messages[i] << " : "
-					 << mangled_name << "+" << offset_begin << offset_end << endl;
+					 << mangled_name << "(/*unknown*/)+" << offset_begin << offset_end << endl;
 			} // if
+
 			free( real_name );
 		} else {										// otherwise, print the whole line
@@ -124,5 +129,5 @@
 	cerr << "*CFA runtime error* program cfa-cpp terminated with "
 		 <<	(sig_num == SIGSEGV ? "segment fault" : "bus error")
-		 << " backtrace:" << endl;
+		 << "." << endl;
 	backtrace( 2 );										// skip first 2 stack frames
 	exit( EXIT_FAILURE );
