X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flib%2Fdebug.c;h=66e911926a4cced405ac13b13d79a4a24dd40f14;hb=399807640fe989ca9fc4d18343600cecefb76f50;hp=fafbc8c1acc69de41a5dfb4104f910c2365f4c84;hpb=c956c0c2175fc09a8e8d6d3f8effd49abcf7aae1;p=pintos-anon diff --git a/src/lib/debug.c b/src/lib/debug.c index fafbc8c..66e9119 100644 --- a/src/lib/debug.c +++ b/src/lib/debug.c @@ -1,34 +1,70 @@ -#include "debug.h" +#include #include -#include "interrupt.h" -#include "lib.h" +#include +#include +#include +#include +#ifdef KERNEL +#include "threads/init.h" +#include "threads/interrupt.h" +#include "devices/serial.h" +#else +#include +#endif +/* Halts the OS or user program, printing the source file name, + line number, and function name, plus a user-specific + message. */ void -panic (const char *format, ...) +debug_panic (const char *file, int line, const char *function, + const char *message, ...) { va_list args; +#ifdef KERNEL intr_disable (); +#endif - va_start (args, format); - vprintk (format, args); - printk ("\n"); +#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"); va_end (args); - backtrace (); + 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); +#endif } +/* 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 -backtrace (void) +debug_backtrace (void) { void **frame; - printk ("Call stack:"); + printf ("Call stack:"); for (frame = __builtin_frame_address (0); frame != NULL && frame[0] != NULL; frame = frame[0]) - printk (" %p", frame[1]); - printk (".\n"); + printf (" %p", frame[1]); + printf (".\n"); }