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.
This commit is contained in:
Harald Welte 2012-07-14 12:30:53 +02:00
parent 2fe684755a
commit 45ecd04e54
2 changed files with 38 additions and 9 deletions

View File

@ -2,5 +2,6 @@
#define _OSMO_BACKTRACE_H_ #define _OSMO_BACKTRACE_H_
void osmo_generate_backtrace(void); void osmo_generate_backtrace(void);
void osmo_log_backtrace(int subsys, int level);
#endif #endif

View File

@ -29,36 +29,64 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <osmocom/core/utils.h> #include <osmocom/core/utils.h>
#include <osmocom/core/logging.h>
#include "config.h" #include "config.h"
#ifdef HAVE_EXECINFO_H #ifdef HAVE_EXECINFO_H
#include <execinfo.h> #include <execinfo.h>
/*! \brief Generate and print a call back-trace static void _osmo_backtrace(int use_printf, int subsys, int level)
*
* This function will generate a function call back-trace of the
* current process and print it to stdout
*/
void osmo_generate_backtrace(void)
{ {
int i, nptrs; int i, nptrs;
void *buffer[100]; void *buffer[100];
char **strings; char **strings;
nptrs = backtrace(buffer, ARRAY_SIZE(buffer)); 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); strings = backtrace_symbols(buffer, nptrs);
if (!strings) if (!strings)
return; return;
for (i = 1; i < nptrs; i++) for (i = 1; i < nptrs; i++) {
printf("%s\n", strings[i]); if (use_printf)
printf("%s\n", strings[i]);
else
LOGP(subsys, level, "\t%s\n", strings[i]);
}
free(strings); 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 #else
void osmo_generate_backtrace(void) 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 #endif