diff options
author | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2009-03-09 16:09:50 -0700 |
---|---|---|
committer | Paul Jakma <paul@quagga.net> | 2009-06-18 20:18:27 +0100 |
commit | 94fc1dd41cd0267acb9c67dd3dcf1e64ef8713af (patch) | |
tree | 95ade8cc41fe0d758b22d01d50b02b7b88499f38 /lib | |
parent | e5862a2df2b5f65b0c050987c5f145836e0b75b3 (diff) |
[lib] Put symbolic backtrace on system log
When BGP crashes, sometimes all we get to see is syslog.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/log.c | 21 |
1 files changed, 15 insertions, 6 deletions
@@ -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 |