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=577ab67f06c39f60f8fd606d157b6a8a564916bd;hb=bb940d21474958a1d8ee2abffdcb6bac27918398;hpb=750d21936d284127e265d050ccbce76fca1ece1a diff --git a/src/lib/debug.c b/src/lib/debug.c index 577ab67..1dc1bf8 100644 --- a/src/lib/debug.c +++ b/src/lib/debug.c @@ -1,19 +1,32 @@ -#include "debug.h" +#include #include -#include "interrupt.h" -#include "lib.h" +#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 -panic (const char *format, ...) +debug_backtrace (void) { - va_list args; + static bool explained; + void **frame; + + printf ("Call stack:"); + for (frame = __builtin_frame_address (0); + (uintptr_t) frame >= 0x1000 && frame[0] != NULL; + frame = frame[0]) + printf (" %p", frame[1]); + printf (".\n"); - intr_disable (); - - va_start (args, format); - vprintk (format, args); - printk ("\n"); - va_end (args); - - for (;;); + 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"); + } }