because no one ever used it.
@menu
* printf::
* ASSERT::
-* DEBUG::
* UNUSED NO_RETURN NO_INLINE PRINTF_FORMAT::
* Backtraces::
* i386-elf-gdb::
should help you to find the problem. See the description of
backtraces below for more information.
-@node DEBUG
-@section @code{DEBUG}
-
-The @code{DEBUG} macro, also defined in @file{<debug.h>}, is a sort of
-conditional @func{printf}. It takes as its arguments the name of a
-``message class'' and a @func{printf}-like format string and
-arguments. The message class is used to filter the messages that are
-actually displayed. You select the messages to display on the Pintos
-command line using the @option{-d} option. This allows you to easily
-turn different types of messages on and off while you debug, without
-the need to recompile.
-
-For example, suppose you want to output thread debugging messages. To
-use a class named @code{thread}, you could invoke @code{DEBUG} like
-this:
-@example
-DEBUG(thread, "thread id: %d\n", id);
-@end example
-@noindent
-and then to start Pintos with @code{thread} messages enable you'd use
-a command line like this:
-@example
-pintos run -d thread
-@end example
-
@node UNUSED NO_RETURN NO_INLINE PRINTF_FORMAT
@section UNUSED, NO_RETURN, NO_INLINE, and PRINTF_FORMAT
#include <syscall.h>
#endif
-#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;
-
-#ifdef KERNEL
- enum intr_level old_level = intr_disable ();
-#endif
- printf ("%s:%d: %s(): ", file, line, function);
- va_start (args, message);
- vprintf (message, args);
- printf ("\n");
- va_end (args);
-#ifdef KERNEL
- intr_set_level (old_level);
-#endif
- }
-}
-
/* Halts the OS or user program, printing the source file name,
line number, and function name, plus a user-specific
message. */
printf (" %p", frame[1]);
printf (".\n");
}
-\f
-
-/* 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;
-
- return false;
-}
#define NO_INLINE __attribute__ ((noinline))
#define PRINTF_FORMAT(FMT, FIRST) __attribute__ ((format (printf, FMT, FIRST)))
-/* 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. */
-#define DEBUG(CLASS, ...) \
- debug_message (__FILE__, __LINE__, __func__, #CLASS, __VA_ARGS__)
-
/* Halts the OS, printing the source file name, line number, and
function name, plus a user-specific message. */
#define PANIC(...) debug_panic (__FILE__, __LINE__, __func__, __VA_ARGS__)
void debug_enable (char *classes);
-void debug_message (const char *file, int line, const char *function,
- const char *class, const char *message, ...)
- PRINTF_FORMAT (5, 6);
void debug_panic (const char *file, int line, const char *function,
const char *message, ...) PRINTF_FORMAT (4, 5) NO_RETURN;
void debug_backtrace (void);
for (i = 0; i < argc; i++)
if (!strcmp (argv[i], "-rs"))
random_init (atoi (argv[++i]));
- else if (!strcmp (argv[i], "-d"))
- debug_enable (argv[++i]);
else if (!strcmp (argv[i], "-q"))
power_off_when_done = true;
#ifdef USERPROG
{
printf (
"Kernel options:\n"
- " -rs SEED Seed random seed to SEED.\n"
- " -d CLASS[,...] Enable the given classes of debug messages.\n"
+ " -rs SEED Set random seed to SEED.\n"
#ifdef USERPROG
" -ex 'PROG [ARG...]' Run PROG, passing the optional arguments.\n"
" -ul USER_MAX Limit user memory to USER_MAX pages.\n"