From 45ecd04e541e47f51bc4cfc239c1c59e8d59155e Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sat, 14 Jul 2012 12:30:53 +0200 Subject: backtrace: Add a variant that uses the libosmocore logging framework I recently discovered that we can only print backtraces to stdout, which is of course useless in a daemon environment. We'd rather want to use the libosmocore logging framework instead. --- src/backtrace.c | 46 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) (limited to 'src/backtrace.c') diff --git a/src/backtrace.c b/src/backtrace.c index 023671c2..f0c3489a 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -29,36 +29,64 @@ #include #include #include +#include #include "config.h" #ifdef HAVE_EXECINFO_H #include -/*! \brief Generate and print a call back-trace - * - * This function will generate a function call back-trace of the - * current process and print it to stdout - */ -void osmo_generate_backtrace(void) +static void _osmo_backtrace(int use_printf, int subsys, int level) { int i, nptrs; void *buffer[100]; char **strings; nptrs = backtrace(buffer, ARRAY_SIZE(buffer)); - printf("backtrace() returned %d addresses\n", nptrs); + if (use_printf) + printf("backtrace() returned %d addresses\n", nptrs); + else + LOGP(subsys, level, "backtrace() returned %d addresses\n", + nptrs); strings = backtrace_symbols(buffer, nptrs); if (!strings) return; - for (i = 1; i < nptrs; i++) - printf("%s\n", strings[i]); + for (i = 1; i < nptrs; i++) { + if (use_printf) + printf("%s\n", strings[i]); + else + LOGP(subsys, level, "\t%s\n", strings[i]); + } free(strings); } + +/*! \brief Generate and print a call back-trace + * + * This function will generate a function call back-trace of the + * current process and print it to stdout. */ +void osmo_generate_backtrace(void) +{ + _osmo_backtrace(1, 0, 0); +} + +/*! \brief Generate and log a call back-trace + * + * This function will generate a function call back-trace of the + * current process and log it to the specified subsystem and + * level using the libosmocore logging subsystem */ +void osmo_log_backtrace(int subsys, int level) +{ + _osmo_backtrace(0, subsys, level); +} #else void osmo_generate_backtrace(void) { + fprintf(stderr, "This platform has no backtrace function\n"); +} +void osmo_log_backtrace(int subsys, int level) +{ + LOGP(subsys, level, "This platform has no backtrace function\n"); } #endif -- cgit v1.2.3