Make debug.h non-idempotent, like <assert.h>.
authorBen Pfaff <blp@cs.stanford.edu>
Wed, 18 Aug 2004 00:10:57 +0000 (00:10 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Wed, 18 Aug 2004 00:10:57 +0000 (00:10 +0000)
Add backtrace() function.

src/lib/debug.c
src/lib/debug.h

index 577ab67f06c39f60f8fd606d157b6a8a564916bd..fafbc8c1acc69de41a5dfb4104f910c2365f4c84 100644 (file)
@@ -15,5 +15,20 @@ panic (const char *format, ...)
   printk ("\n");
   va_end (args);
 
+  backtrace ();
+
   for (;;);
 }
+
+void
+backtrace (void) 
+{
+  void **frame;
+  
+  printk ("Call stack:");
+  for (frame = __builtin_frame_address (0);
+       frame != NULL && frame[0] != NULL;
+       frame = frame[0]) 
+    printk (" %p", frame[1]);
+  printk (".\n");
+}
index 138247339fcb72357b2ccf69bf88873ccb7b0e79..4f3cb5b662dd07d54adcba4debccc7017e70e897 100644 (file)
@@ -1,6 +1,28 @@
 #ifndef HEADER_DEBUG_H
 #define HEADER_DEBUG_H 1
 
+#if __GNUC__ > 1
+#define ATTRIBUTE(X) __attribute__ (X)
+#else
+#define ATTRIBUTE(X)
+#endif
+
+#define UNUSED ATTRIBUTE ((unused))
+#define NO_RETURN ATTRIBUTE ((noreturn))
+#define PRINTF_FORMAT(FMT, FIRST) ATTRIBUTE ((format (printf, FMT, FIRST)))
+#define SCANF_FORMAT(FMT, FIRST) ATTRIBUTE ((format (scanf, FMT, FIRST)))
+
+void panic (const char *, ...)
+     __attribute__ ((format (printf, 1, 2), noreturn));
+void backtrace (void);
+
+#endif /* debug.h */
+
+/* This is outside the header guard so that debug.h may be
+   included multiple times with different settings of NDEBUG. */
+#undef ASSERT
+#undef NOT_REACHED
+
 #ifndef NDEBUG
 #define ASSERT(CONDITION)                                               \
         if (CONDITION) {                                                \
 #define ASSERT(CONDITION) ((void) 0)
 #define NOT_REACHED() for (;;)
 #endif
-
-void panic (const char *, ...)
-     __attribute__ ((format (printf, 1, 2), noreturn));
-
-#if __GNUC__ > 1
-#define ATTRIBUTE(X) __attribute__ (X)
-#else
-#define ATTRIBUTE(X)
-#endif
-
-#define UNUSED ATTRIBUTE ((unused))
-#define NO_RETURN ATTRIBUTE ((noreturn))
-#define PRINTF_FORMAT(FMT, FIRST) ATTRIBUTE ((format (printf, FMT, FIRST)))
-#define SCANF_FORMAT(FMT, FIRST) ATTRIBUTE ((format (scanf, FMT, FIRST)))
-
-#endif /* debug.h */