diff --git a/src/nm-logging.c b/src/nm-logging.c index a380620399..2fbef76268 100644 --- a/src/nm-logging.c +++ b/src/nm-logging.c @@ -19,6 +19,8 @@ * Copyright (C) 2006 - 2008 Novell, Inc. */ +#define _GNU_SOURCE +#include #include #include #include @@ -27,6 +29,7 @@ #include #include #include +#include #include "nm-logging.h" #include "nm-utils.h" @@ -34,25 +37,33 @@ static void fallback_get_backtrace (void) { - void * frames[64]; - size_t size; - char ** strings; - size_t i; + void *frames[64]; + Dl_info info; + size_t size; + guint32 i; + const char *name; size = backtrace (frames, G_N_ELEMENTS (frames)); - if ((strings = backtrace_symbols (frames, size))) - { - syslog (LOG_CRIT, "******************* START **********************************"); - for (i = 0; i < size; i++) - syslog (LOG_CRIT, "Frame %zd: %s", i, strings[i]); - free (strings); - syslog (LOG_CRIT, "******************* END **********************************"); - } - else - { - nm_warning ("NetworkManager crashed, but symbols " - "couldn't be retrieved."); + + syslog (LOG_CRIT, "******************* START **********************************"); + for (i = 0; i < size; i++) { + dladdr (frames[i], &info); + name = (info.dli_fname && *info.dli_fname) ? info.dli_fname : "(vdso)"; + if (info.dli_saddr) { + syslog (LOG_CRIT, "Frame %d: %s (%s+0x%lx) [%p]", + i, name, + info.dli_sname, + frames[i] - info.dli_saddr, + frames[i]); + } else { + syslog (LOG_CRIT, "Frame %d: %s (%p+0x%lx) [%p]", + i, name, + info.dli_fbase, + frames[i] - info.dli_saddr, + frames[i]); + } } + syslog (LOG_CRIT, "******************* END **********************************"); }