From cdab512c9fceb7cc25c030dd96bbe111bcfe6449 Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Tue, 27 Dec 2005 06:24:28 +0000 Subject: [PATCH] Bug 5183 - Inline stack backtraces git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7646 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- Makefile | 8 ++++++++ include/asterisk/logger.h | 2 ++ logger.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/Makefile b/Makefile index ff3d2abccb..16766d0755 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 863f2881e2..9acec5e75e 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 aae10c604a..66977677da 100644 --- a/logger.c +++ b/logger.c @@ -32,6 +32,9 @@ #include #include #include +#ifdef STACK_BACKTRACES +#include +#endif #define SYSLOG_NAMES /* so we can map syslog facilities names to their numeric values, from 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];