summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2009-03-09 16:09:50 -0700
committerPaul Jakma <paul@quagga.net>2009-06-18 20:18:27 +0100
commit94fc1dd41cd0267acb9c67dd3dcf1e64ef8713af (patch)
tree95ade8cc41fe0d758b22d01d50b02b7b88499f38
parente5862a2df2b5f65b0c050987c5f145836e0b75b3 (diff)
[lib] Put symbolic backtrace on system log
When BGP crashes, sometimes all we get to see is syslog.
-rw-r--r--lib/log.c21
1 files changed, 15 insertions, 6 deletions
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