mirror of https://gerrit.osmocom.org/libosmocore
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:
parent
2fe684755a
commit
45ecd04e54
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue