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; } +