Make backtraces slightly more reliable.
[pintos-anon] / src / lib / debug.c
index fafbc8c1acc69de41a5dfb4104f910c2365f4c84..1dc1bf8fd69db3c5651654620dcf79200cbf6844 100644 (file)
@@ -1,34 +1,32 @@
-#include "debug.h"
+#include <debug.h>
 #include <stdarg.h>
-#include "interrupt.h"
-#include "lib.h"
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
 
+/* Prints the call stack, that is, a list of addresses, one in
+   each of the functions we are nested within.  gdb or addr2line
+   may be applied to kernel.o to translate these into file names,
+   line numbers, and function names.  */
 void
-panic (const char *format, ...)
-{
-  va_list args;
-
-  intr_disable ();
-
-  va_start (args, format);
-  vprintk (format, args);
-  printk ("\n");
-  va_end (args);
-
-  backtrace ();
-
-  for (;;);
-}
-
-void
-backtrace (void) 
+debug_backtrace (void) 
 {
+  static bool explained;
   void **frame;
   
-  printk ("Call stack:");
+  printf ("Call stack:");
   for (frame = __builtin_frame_address (0);
-       frame != NULL && frame[0] != NULL;
+       (uintptr_t) frame >= 0x1000 && frame[0] != NULL;
        frame = frame[0]) 
-    printk (" %p", frame[1]);
-  printk (".\n");
+    printf (" %p", frame[1]);
+  printf (".\n");
+
+  if (!explained) 
+    {
+      explained = true;
+      printf ("The `backtrace' program can make call stacks useful.\n"
+              "Read \"Backtraces\" in the \"Debugging Tools\" chapter\n"
+              "of the Pintos documentation for more information.\n");
+    }
 }