X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pintos-anon;a=blobdiff_plain;f=src%2Flib%2Fdebug.c;h=1dc1bf8fd69db3c5651654620dcf79200cbf6844;hp=babf2298320bf0c9061487fc601d9f4f1d4820ef;hb=bb940d21474958a1d8ee2abffdcb6bac27918398;hpb=f6580e9ad405b519dbe85027691bf3c66074b0a4 diff --git a/src/lib/debug.c b/src/lib/debug.c index babf229..1dc1bf8 100644 --- a/src/lib/debug.c +++ b/src/lib/debug.c @@ -1,105 +1,32 @@ -#include "debug.h" +#include #include -#include "lib.h" -#include "threads/interrupt.h" - -#define MAX_CLASSES 16 -static bool all_enabled; -static const char *enabled_classes[MAX_CLASSES]; -static size_t enabled_cnt; - -static bool class_is_enabled (const char *class); - -/* Enables the debug message classes specified in CLASSES. The - string CLASSES is modified by and becomes owned by this - function. */ -void -debug_enable (char *classes) -{ - char *class, *save; - - for (class = strtok_r (classes, ",", &save); class != NULL; - class = strtok_r (NULL, ",", &save)) - { - if (strcmp (class, "all") && enabled_cnt < MAX_CLASSES) - enabled_classes[enabled_cnt++] = class; - else - all_enabled = true; - } -} - -/* Prints a debug message along with the source file name, line - number, and function name of where it was emitted. CLASS is - used to filter out unwanted messages. */ -void -debug_message (const char *file, int line, const char *function, - const char *class, const char *message, ...) -{ - if (class_is_enabled (class)) - { - va_list args; - - enum intr_level old_level = intr_disable (); - printk ("%s:%d: %s(): ", file, line, function); - va_start (args, message); - vprintk (message, args); - printk ("\n"); - va_end (args); - intr_set_level (old_level); - } -} - -/* Halts the OS, 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, ...) -{ - va_list args; - - intr_disable (); - - printk ("PANIC at %s:%d in %s(): ", file, line, function); - va_start (args, message); - vprintk (message, args); - printk ("\n"); - va_end (args); - - debug_backtrace (); - - for (;;); -} - -/* Prints the call stack, that is, a list of addresses 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. */ +#include +#include +#include +#include + +/* 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 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"); -} - - -/* Returns true if CLASS is enabled, false otherwise. */ -static bool -class_is_enabled (const char *class) -{ - size_t i; - - if (all_enabled) - return true; - - for (i = 0; i < enabled_cnt; i++) - if (!strcmp (enabled_classes[i], class)) - return true; + printf (" %p", frame[1]); + printf (".\n"); - return false; + 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"); + } }