6ae1c8c4d1aa4ddb5063e76b1055259d572367a1
tdreszer
  Wed Jul 7 13:08:23 2010 -0700
Added warnWithBackTrace() to aid simple detective work.
diff --git src/lib/errabort.c src/lib/errabort.c
index f40aba5..849902b 100644
--- src/lib/errabort.c
+++ src/lib/errabort.c
@@ -12,7 +12,9 @@
  * This file is copyright 2002 Jim Kent, but license is hereby
  * granted for all use - public, private or commercial. */
 
+#include <execinfo.h>
 #include "common.h"
+#include "dystring.h"
 #include "errabort.h"
 
 static char const rcsid[] = "$Id: errabort.c,v 1.16 2010/01/12 18:16:27 markd Exp $";
@@ -51,6 +53,35 @@
 va_end(args);
 }
 
+void warnWithBackTrace(char *format, ...)
+/* Issue a warning message and append backtrace. */
+{
+va_list args;
+va_start(args, format);
+struct dyString *dy = newDyString(255);
+dyStringAppend(dy, format);
+
+#define STACK_LIMIT 20
+void *buffer[STACK_LIMIT];
+char **strings;
+int count = backtrace(buffer, STACK_LIMIT);
+strings = backtrace_symbols(buffer, count);
+if (strings == NULL)
+    dyStringAppend(dy,"\nno backtrace_symbols.");
+else
+    {
+    dyStringAppend(dy,"\nBACKTRACE [can use 'addr2line -Cfise {exe} addr addr ...']:");
+    int ix;
+    for (ix = 1; ix < count && strings[ix] != NULL; ix++)
+        dyStringPrintf(dy,"\n%s", strings[ix]);
+
+    free(strings);
+    }
+vaWarn(dyStringCannibalize(&dy), args);
+va_end(args);
+}
+
+
 void errnoWarn(char *format, ...)
 /* Prints error message from UNIX errno first, then does rest of warning. */
 {
@@ -197,3 +228,4 @@
 {
 debugPushPopErr = TRUE;
 }
+