Applied James Peach's stack backtrace patch for IRIX.
authorTim Potter <tpot@samba.org>
Wed, 11 Feb 2004 10:30:46 +0000 (10:30 +0000)
committerTim Potter <tpot@samba.org>
Wed, 11 Feb 2004 10:30:46 +0000 (10:30 +0000)
source/configure.in
source/lib/util.c

index 38f908007c4a0f825cbd78229e9a339d54d64249..7cc42fe5bdcb2fdc7fc45536759e1b09b213ea0d 100644 (file)
@@ -921,6 +921,10 @@ AC_CHECK_FUNCS(setlocale nl_langinfo)
 # setbuffer, shmget, shm_open are needed for smbtorture
 AC_CHECK_FUNCS(setbuffer shmget shm_open backtrace_symbols)
 
+# IRIX stack backtrace
+AC_CHECK_HEADERS(libexc.h)
+AC_CHECK_LIB(exc, trace_back_stack)
+
 # syscall() is needed for smbwrapper.
 AC_CHECK_FUNCS(syscall)
 
index 3da4e536e02fb0fb38458129b7f0b451dd8d5003..e9ab72b2bfe589bd8d9c69774d5444b45d41f638 100644 (file)
@@ -1344,6 +1344,10 @@ gid_t nametogid(const char *name)
  Something really nasty happened - panic !
 ********************************************************************/
 
+#ifdef HAVE_LIBEXC_H
+#include <libexc.h>
+#endif
+
 void smb_panic(const char *why)
 {
        char *cmd;
@@ -1398,6 +1402,42 @@ void smb_panic(const char *why)
                SAFE_FREE(backtrace_strings);
        }
 
+#elif HAVE_LIBEXC
+
+#define NAMESIZE 32 /* Arbitrary */
+
+       /* The IRIX libexc library provides an API for unwinding the stack. See
+        * libexc(3) for details. Apparantly trace_back_stack leaks memory, but
+        * since we are about to abort anyway, it hardly matters.
+        *
+        * Note that if we paniced due to a SIGSEGV or SIGBUS (or similar) this
+        * will fail with a nasty message upon failing to open the /proc entry.
+        */
+       {
+               __uint64_t      addrs[BACKTRACE_STACK_SIZE];
+               char *          names[BACKTRACE_STACK_SIZE];
+               char            namebuf[BACKTRACE_STACK_SIZE * NAMESIZE];
+
+               int             i;
+               int             levels;
+
+               ZERO_ARRAY(addrs);
+               ZERO_ARRAY(names);
+               ZERO_ARRAY(namebuf);
+
+               for (i = 0; i < BACKTRACE_STACK_SIZE; i++) {
+                       names[i] = namebuf + (i * NAMESIZE);
+               }
+
+               levels = trace_back_stack(0, addrs, names,
+                               BACKTRACE_STACK_SIZE, NAMESIZE);
+
+               DEBUG(0, ("BACKTRACE: %d stack frames:\n", levels));
+               for (i = 0; i < levels; i++) {
+                       DEBUGADD(0, (" #%d 0x%llx %s\n", i, addrs[i], names[i]));
+               }
+     }
+#undef NAMESIZE
 #endif
 
        dbgflush();