Add a suggestion to use `backtrace' and a reference to the manual to
[pintos-anon] / src / lib / debug.c
index 2388a2daa3f23c7773c21094122b13c17c413610..4f0f5f303cf933dab61c1b1e6f723d7ed7b8bb6b 100644 (file)
@@ -5,6 +5,7 @@
 #include <stdio.h>
 #include <string.h>
 #ifdef KERNEL
+#include "threads/init.h"
 #include "threads/interrupt.h"
 #include "devices/serial.h"
 #else
@@ -61,8 +62,9 @@ debug_message (const char *file, int line, const char *function,
     }
 }
 
-/* Halts the OS, printing the source file name, line number, and
-   function name, plus a user-specific message. */
+/* Halts the OS or user program, printing the source file name,
+   line number, and function name, plus a user-specific
+   message. */
 void
 debug_panic (const char *file, int line, const char *function,
              const char *message, ...)
@@ -73,7 +75,12 @@ debug_panic (const char *file, int line, const char *function,
   intr_disable ();
 #endif
 
-  printf ("PANIC at %s:%d in %s(): ", file, line, function);
+#ifdef KERNEL
+  printf ("Kernel PANIC at %s:%d in %s(): ", file, line, function);
+#else
+  printf ("User process panic at %s:%d in %s(): ", file, line, function);
+#endif
+
   va_start (args, message);
   vprintf (message, args);
   printf ("\n");
@@ -81,8 +88,14 @@ debug_panic (const char *file, int line, const char *function,
 
   debug_backtrace ();
 
+  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");
+  
 #ifdef KERNEL
   serial_flush ();
+  if (power_off_when_done)
+    power_off ();
   for (;;);
 #else
   exit (1);