2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 22:35:15 +00:00

backtrace: Add log_backtrace()

log_backtrace() and log_backtrace_msg() logs the back trace into
the log file. It may be most useful when debugging unit tests.
"backtrace.h" documents the usage. It is not being called directly
in the code, but rather as a handy tool available when needed.

Signed-off-by: Andy Zhou <azhou@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
Andy Zhou
2014-03-13 15:28:54 -07:00
parent 4c9dbc0b14
commit d0b99d38ed
2 changed files with 81 additions and 0 deletions

View File

@@ -15,8 +15,12 @@
*/
#include <config.h>
#include <inttypes.h>
#include "backtrace.h"
#include "vlog.h"
VLOG_DEFINE_THIS_MODULE(backtrace);
#ifdef HAVE_BACKTRACE
#include <execinfo.h>
@@ -31,6 +35,7 @@ backtrace_capture(struct backtrace *b)
b->frames[i] = (uintptr_t) frames[i];
}
}
#else
void
backtrace_capture(struct backtrace *backtrace)
@@ -38,3 +43,36 @@ backtrace_capture(struct backtrace *backtrace)
backtrace->n_frames = 0;
}
#endif
static char *
backtrace_format(const struct backtrace *b, struct ds *ds)
{
if (b->n_frames) {
int i;
ds_put_cstr(ds, " (backtrace:");
for (i = 0; i < b->n_frames; i++) {
ds_put_format(ds, " 0x%08"PRIxPTR, b->frames[i]);
}
ds_put_cstr(ds, ")");
}
return ds_cstr(ds);
}
void
log_backtrace_at(const char *msg, const char *where)
{
struct backtrace b;
struct ds ds = DS_EMPTY_INITIALIZER;
backtrace_capture(&b);
if (msg) {
ds_put_format(&ds, "%s ", msg);
}
ds_put_cstr(&ds, where);
VLOG_ERR("%s", backtrace_format(&b, &ds));
ds_destroy(&ds);
}