X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fbacktrace.c;h=9b7c52b9a5f708f6e64818bc9b59c68d145f01cc;hb=28c5588e8e1a8d091c5d2275232c35f2968a97fa;hp=861a109d24c4f100082ed492f0c00d8c3a120f28;hpb=482557e5b54bb6bb35c71560a57aa6deb4a87f35;p=sliver-openvswitch.git diff --git a/lib/backtrace.c b/lib/backtrace.c index 861a109d2..9b7c52b9a 100644 --- a/lib/backtrace.c +++ b/lib/backtrace.c @@ -15,8 +15,12 @@ */ #include +#include #include "backtrace.h" +#include "vlog.h" + +VLOG_DEFINE_THIS_MODULE(backtrace); #ifdef HAVE_BACKTRACE #include @@ -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); +}