diff --git a/Makefile b/Makefile index ff3d2abccb4a28f8ddc4bddaa1ad7db26f047bce..16766d075563aa7f1d854025f9089b66ade46392 100644 --- a/Makefile +++ b/Makefile @@ -45,6 +45,11 @@ ifneq ($(findstring dont-optimize,$(MAKECMDGOALS)),dont-optimize) #Tell gcc to optimize the code OPTIMIZE+=-O6 +else + # Stack backtraces, while useful for debugging, are incompatible with optimizations + ifeq (${OSARCH},Linux) + CFLAGS+=-DSTACK_BACKTRACES + endif endif #Overwite config files on "make samples" @@ -332,7 +337,10 @@ ASTCFLAGS+= $(TRACE_FRAMES) ASTCFLAGS+= $(MALLOC_DEBUG) ASTCFLAGS+= $(BUSYDETECT) ASTCFLAGS+= $(OPTIONS) +ifneq ($(findstring dont-optimize,$(MAKECMDGOALS)),dont-optimize) ASTCFLAGS+= -fomit-frame-pointer +endif + SUBDIRS=res channels pbx apps codecs formats agi cdr funcs utils stdtime OBJS=io.o sched.o logger.o frame.o loader.o config.o channel.o \ diff --git a/include/asterisk/logger.h b/include/asterisk/logger.h index 863f2881e26ef6173810ea03fd0159cecb56142d..9acec5e75ec828a34ed5811ea9ac4f2e1ff3dac6 100644 --- a/include/asterisk/logger.h +++ b/include/asterisk/logger.h @@ -61,6 +61,8 @@ extern "C" { extern void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...) __attribute__ ((format (printf, 5, 6))); +extern void ast_backtrace(void); + extern void ast_queue_log(const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt, ...) __attribute__ ((format (printf, 5, 6))); diff --git a/logger.c b/logger.c index aae10c604a3b5469e83a2e860bac89dd7e9402b1..66977677da4193c016fc6184b49b1b434c702360 100644 --- a/logger.c +++ b/logger.c @@ -32,6 +32,9 @@ #include <stdlib.h> #include <errno.h> #include <sys/stat.h> +#ifdef STACK_BACKTRACES +#include <execinfo.h> +#endif #define SYSLOG_NAMES /* so we can map syslog facilities names to their numeric values, from <syslog.h> which is included by logger.h */ @@ -816,6 +819,39 @@ void ast_log(int level, const char *file, int line, const char *function, const } } +void ast_backtrace(void) +{ +#ifdef STACK_BACKTRACES + int count=0, i=0; + void **addresses; + char **strings; + + addresses = calloc(levels, sizeof(void *)); + if (addresses) { + count = backtrace(addresses, 20); + strings = backtrace_symbols(addresses, count); + if (strings) { + ast_log(LOG_WARNING, "Got %d backtrace record%c\n", count, count != 1 ? 's' : ' '); + for (i=0; i < count ; i++) { + ast_log(LOG_WARNING, "#%d: [%08X] %s\n", i, (unsigned int)addresses[i], strings[i]); + } + free(strings); + } else { + ast_log(LOG_WARNING, "Could not allocate memory for backtrace\n"); + } + free(addresses); + } else { + ast_log(LOG_WARNING, "Could not allocate memory for backtrace\n"); + } +#else +#ifdef Linux + ast_log(LOG_WARNING, "Must compile with 'make dont-optimize' for stack backtraces\n"); +#else + ast_log(LOG_WARNING, "Inline stack backtraces are only available on the Linux platform.\n"); +#endif +#endif +} + void ast_verbose(const char *fmt, ...) { static char stuff[4096];