From 94fc1dd41cd0267acb9c67dd3dcf1e64ef8713af Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Mon, 9 Mar 2009 16:09:50 -0700 Subject: [lib] Put symbolic backtrace on system log When BGP crashes, sometimes all we get to see is syslog. --- lib/log.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/log.c b/lib/log.c index 407904d5..f7a36851 100644 --- a/lib/log.c +++ b/lib/log.c @@ -435,10 +435,10 @@ zlog_backtrace_sigsafe(int priority, void *program_counter) { #ifdef HAVE_STACK_TRACE static const char pclabel[] = "Program counter: "; - void *array[20]; + void *array[64]; int size; char buf[100]; - char *s; + char *s, **bt = NULL; #define LOC s,buf+sizeof(buf)-s #ifdef HAVE_GLIBC_BACKTRACE @@ -485,20 +485,29 @@ zlog_backtrace_sigsafe(int priority, void *program_counter) syslog_sigsafe(priority|zlog_default->facility,buf,s-buf); { int i; +#ifdef HAVE_GLIBC_BACKTRACE + bt = backtrace_symbols(array, size); +#endif /* Just print the function addresses. */ for (i = 0; i < size; i++) { s = buf; - s = str_append(LOC,"[bt "); - s = num_append(LOC,i); - s = str_append(LOC,"] 0x"); - s = hex_append(LOC,(u_long)(array[i])); + if (bt) + s = str_append(LOC, bt[i]); + else { + s = str_append(LOC,"[bt "); + s = num_append(LOC,i); + s = str_append(LOC,"] 0x"); + s = hex_append(LOC,(u_long)(array[i])); + } *s = '\0'; if (priority <= zlog_default->maxlvl[ZLOG_DEST_MONITOR]) vty_log_fixed(buf,s-buf); if (priority <= zlog_default->maxlvl[ZLOG_DEST_SYSLOG]) syslog_sigsafe(priority|zlog_default->facility,buf,s-buf); } + if (bt) + free(bt); } } #undef DUMP -- cgit v1.2.1