[lib] Add support for Sun libc printstack to zlog_backtrace_sigsafe

2006-05-28 Paul Jakma <paul.jakma@sun.com>

	* 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.
This commit is contained in:
Paul Jakma 2006-05-28 08:26:15 +00:00
parent a4b3030383
commit fb66b29c67
4 changed files with 38 additions and 16 deletions

View File

@ -4,6 +4,9 @@
enable debug options. enable debug options.
Add a check for GNU Make and warn the user if it does not appear Add a check for GNU Make and warn the user if it does not appear
to be the make used. 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 <paul.jakma@sun.com> 2006-05-10 Paul Jakma <paul.jakma@sun.com>

View File

@ -392,11 +392,15 @@ case "$host" in
| [*-solaris2.1[0-9]] \ | [*-solaris2.1[0-9]] \
| [*-solaris2.1[0-9].[0-9]]) | [*-solaris2.1[0-9].[0-9]])
opsys=sol8 opsys=sol8
AC_DEFINE(SUNOS_59,,SunOS 5.8 up) AC_DEFINE(SUNOS_59, 1, [SunOS 5.8 up])
AC_DEFINE(SUNOS_5, 1, SunOS 5) AC_DEFINE(SUNOS_5, 1, [SunOS 5])
AC_CHECK_LIB(socket, main) AC_CHECK_LIB(socket, main)
AC_CHECK_LIB(nsl, main) AC_CHECK_LIB(nsl, main)
AC_CHECK_LIB(umem, 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 CURSES=-lcurses
;; ;;
*-sunos5* | *-solaris2*) *-sunos5* | *-solaris2*)
@ -1244,12 +1248,12 @@ dnl ---------------------------
dnl check for glibc 'backtrace' dnl check for glibc 'backtrace'
dnl --------------------------- dnl ---------------------------
if test "${glibc}" = "yes"; then if test "${glibc}" = "yes"; then
AC_CHECK_HEADER(execinfo.h) AC_CHECK_HEADER([execinfo.h],
fi [AC_CHECK_FUNC([backtrace],
if test x"${ac_cv_header_execinfo_h}" = x"yes"; then [AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
AC_CHECK_FUNC(backtrace, AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
[AC_DEFINE(HAVE_GLIBC_BACKTRACE,,Glibc backtrace)] ])
) ])
fi fi
dnl ----------------------------------------- dnl -----------------------------------------

View File

@ -7,6 +7,11 @@
we still need it on GNU Libc for mallinfo(). we still need it on GNU Libc for mallinfo().
* vty.c: (vty_log/vty_log_fixed) dont crash if called when vty * vty.c: (vty_log/vty_log_fixed) dont crash if called when vty
hasn't been initiliased. 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 <ajschorr@alumni.princeton.edu> 2006-05-21 Andrew J. Schorr <ajschorr@alumni.princeton.edu>

View File

@ -1,5 +1,5 @@
/* /*
* $Id: log.c,v 1.27 2006/05/15 16:56:51 paul Exp $ * $Id$
* *
* Logging of zebra * Logging of zebra
* Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro * 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); return str_append(s,len,t);
} }
#if defined(SA_SIGINFO) || defined(HAVE_GLIBC_BACKTRACE) #if defined(SA_SIGINFO) || defined(HAVE_STACK_TRACE)
static char * static char *
hex_append(char *s, int len, u_long x) hex_append(char *s, int len, u_long x)
{ {
@ -371,7 +371,7 @@ zlog_signal(int signo, const char *action
void void
zlog_backtrace_sigsafe(int priority, void *program_counter) zlog_backtrace_sigsafe(int priority, void *program_counter)
{ {
#ifdef HAVE_GLIBC_BACKTRACE #ifdef HAVE_STACK_TRACE
static const char pclabel[] = "Program counter: "; static const char pclabel[] = "Program counter: ";
void *array[20]; void *array[20];
int size; int size;
@ -379,13 +379,10 @@ zlog_backtrace_sigsafe(int priority, void *program_counter)
char *s; char *s;
#define LOC s,buf+sizeof(buf)-s #define LOC s,buf+sizeof(buf)-s
#ifdef HAVE_GLIBC_BACKTRACE
if (((size = backtrace(array,sizeof(array)/sizeof(array[0]))) <= 0) || if (((size = backtrace(array,sizeof(array)/sizeof(array[0]))) <= 0) ||
((size_t)size > sizeof(array)/sizeof(array[0]))) ((size_t)size > sizeof(array)/sizeof(array[0])))
return; return;
s = buf;
s = str_append(LOC,"Backtrace for ");
s = num_append(LOC,size);
s = str_append(LOC," stack frames:\n");
#define DUMP(FD) { \ #define DUMP(FD) { \
if (program_counter) \ if (program_counter) \
@ -396,6 +393,19 @@ zlog_backtrace_sigsafe(int priority, void *program_counter)
write(FD, buf, s-buf); \ write(FD, buf, s-buf); \
backtrace_symbols_fd(array, size, FD); \ 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)) if ((logfile_fd >= 0) || ((logfile_fd = open_crashlog()) >= 0))
DUMP(logfile_fd) DUMP(logfile_fd)
@ -431,7 +441,7 @@ zlog_backtrace_sigsafe(int priority, void *program_counter)
} }
#undef DUMP #undef DUMP
#undef LOC #undef LOC
#endif /* HAVE_GLIBC_BACKTRACE */ #endif /* HAVE_STRACK_TRACE */
} }
void void