From fb66b29c6701129f0222275eaa206f7ac8ab30cc Mon Sep 17 00:00:00 2001 From: Paul Jakma Date: Sun, 28 May 2006 08:26:15 +0000 Subject: [lib] Add support for Sun libc printstack to zlog_backtrace_sigsafe 2006-05-28 Paul Jakma * configure.ac: Check for Sun libc printstack(), add a general HAVE_STACK_TRACE define for lib/log.c, if any supported stack symbol dumping function is found (glibc backtrace/sun libc printstack). * log.c: (general) Add support for Sun libc printstack(). (hex_append) make the cpp conditional on general HAVE_STACK_TRACE define. (zlog_backtrace_sigsafe) Ditto. Add printstack() version of the the DUMP macro in this function. --- ChangeLog | 3 +++ configure.ac | 20 ++++++++++++-------- lib/ChangeLog | 5 +++++ lib/log.c | 26 ++++++++++++++++++-------- 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index f36e31e2..efe392d1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,9 @@ enable debug options. Add a check for GNU Make and warn the user if it does not appear to be the make used. + Check for Sun libc printstack(), add a general HAVE_STACK_TRACE + define for lib/log.c, if any supported stack symbol dumping + function is found (glibc backtrace/sun libc printstack). 2006-05-10 Paul Jakma diff --git a/configure.ac b/configure.ac index e173fcae..37df36e5 100755 --- a/configure.ac +++ b/configure.ac @@ -392,11 +392,15 @@ case "$host" in | [*-solaris2.1[0-9]] \ | [*-solaris2.1[0-9].[0-9]]) opsys=sol8 - AC_DEFINE(SUNOS_59,,SunOS 5.8 up) - AC_DEFINE(SUNOS_5, 1, SunOS 5) + AC_DEFINE(SUNOS_59, 1, [SunOS 5.8 up]) + AC_DEFINE(SUNOS_5, 1, [SunOS 5]) AC_CHECK_LIB(socket, main) AC_CHECK_LIB(nsl, main) AC_CHECK_LIB(umem, main) + AC_CHECK_FUNCS([printstack], + [AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack]) + AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality]) + ]) CURSES=-lcurses ;; *-sunos5* | *-solaris2*) @@ -1244,12 +1248,12 @@ dnl --------------------------- dnl check for glibc 'backtrace' dnl --------------------------- if test "${glibc}" = "yes"; then - AC_CHECK_HEADER(execinfo.h) -fi -if test x"${ac_cv_header_execinfo_h}" = x"yes"; then - AC_CHECK_FUNC(backtrace, - [AC_DEFINE(HAVE_GLIBC_BACKTRACE,,Glibc backtrace)] - ) + AC_CHECK_HEADER([execinfo.h], + [AC_CHECK_FUNC([backtrace], + [AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace]) + AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding]) + ]) + ]) fi dnl ----------------------------------------- diff --git a/lib/ChangeLog b/lib/ChangeLog index 90ddd07e..5d096364 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -7,6 +7,11 @@ we still need it on GNU Libc for mallinfo(). * vty.c: (vty_log/vty_log_fixed) dont crash if called when vty hasn't been initiliased. + * log.c: (general) Add support for Sun libc printstack(). + (hex_append) make the cpp conditional on general HAVE_STACK_TRACE + define. + (zlog_backtrace_sigsafe) Ditto. Add printstack() version of the + the DUMP macro in this function. 2006-05-21 Andrew J. Schorr diff --git a/lib/log.c b/lib/log.c index d55ffb7f..3eb0bd52 100644 --- a/lib/log.c +++ b/lib/log.c @@ -1,5 +1,5 @@ /* - * $Id: log.c,v 1.27 2006/05/15 16:56:51 paul Exp $ + * $Id$ * * Logging of zebra * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro @@ -179,7 +179,7 @@ num_append(char *s, int len, u_long x) return str_append(s,len,t); } -#if defined(SA_SIGINFO) || defined(HAVE_GLIBC_BACKTRACE) +#if defined(SA_SIGINFO) || defined(HAVE_STACK_TRACE) static char * hex_append(char *s, int len, u_long x) { @@ -371,7 +371,7 @@ zlog_signal(int signo, const char *action void zlog_backtrace_sigsafe(int priority, void *program_counter) { -#ifdef HAVE_GLIBC_BACKTRACE +#ifdef HAVE_STACK_TRACE static const char pclabel[] = "Program counter: "; void *array[20]; int size; @@ -379,13 +379,10 @@ zlog_backtrace_sigsafe(int priority, void *program_counter) char *s; #define LOC s,buf+sizeof(buf)-s +#ifdef HAVE_GLIBC_BACKTRACE if (((size = backtrace(array,sizeof(array)/sizeof(array[0]))) <= 0) || ((size_t)size > sizeof(array)/sizeof(array[0]))) return; - s = buf; - s = str_append(LOC,"Backtrace for "); - s = num_append(LOC,size); - s = str_append(LOC," stack frames:\n"); #define DUMP(FD) { \ if (program_counter) \ @@ -396,6 +393,19 @@ zlog_backtrace_sigsafe(int priority, void *program_counter) write(FD, buf, s-buf); \ backtrace_symbols_fd(array, size, FD); \ } +#elif defined(HAVE_PRINTSTACK) +#define DUMP(FD) { \ + if (program_counter) \ + write((FD), pclabel, sizeof(pclabel)-1); \ + write((FD), buf, s-buf); \ + printstack((FD)); \ +} +#endif /* HAVE_GLIBC_BACKTRACE, HAVE_PRINTSTACK */ + + s = buf; + s = str_append(LOC,"Backtrace for "); + s = num_append(LOC,size); + s = str_append(LOC," stack frames:\n"); if ((logfile_fd >= 0) || ((logfile_fd = open_crashlog()) >= 0)) DUMP(logfile_fd) @@ -431,7 +441,7 @@ zlog_backtrace_sigsafe(int priority, void *program_counter) } #undef DUMP #undef LOC -#endif /* HAVE_GLIBC_BACKTRACE */ +#endif /* HAVE_STRACK_TRACE */ } void -- cgit v1.2.1