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:
@@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user