X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=doc%2Fdebug.texi;h=75d9b242a79b12dfbb0496d4d962e538a0259d98;hb=749088412dc35dfc51035c30b86dd0b86a6954f7;hp=a192a73a9885d4931dbdcee1150cad2fbcd1dc3d;hpb=9d6ad9a479ddae9628dc2d45862f9281986c430b;p=pintos-anon diff --git a/doc/debug.texi b/doc/debug.texi index a192a73..75d9b24 100644 --- a/doc/debug.texi +++ b/doc/debug.texi @@ -7,7 +7,6 @@ introduces you to a few of them. @menu * printf:: * ASSERT:: -* DEBUG:: * UNUSED NO_RETURN NO_INLINE PRINTF_FORMAT:: * Backtraces:: * i386-elf-gdb:: @@ -53,31 +52,6 @@ When an assertion proves untrue, the kernel panics. The panic message 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{}, 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 @@ -198,7 +172,7 @@ tree used for this example, line 405 of @file{filesys/file.c} is the assertion @example -ASSERT (file_ofs >= )0; +ASSERT (file_ofs >= 0); @end example @noindent @@ -221,9 +195,8 @@ panicked, you can re-run @command{backtrace} on the user program, like so: (typing the command on a single line, of course): @example -~/cs140/pintos/src/utils/backtrace grow-too-big 0xc0106eff 0xc01102fb -0xc010dc22 0xc010cf67 0xc0102319 0xc010325a 0x804812c 0x8048a96 -0x8048ac8 +backtrace grow-too-big 0xc0106eff 0xc01102fb 0xc010dc22 0xc010cf67 +0xc0102319 0xc010325a 0x804812c 0x8048a96 0x8048ac8 @end example The results look like this: @@ -240,13 +213,24 @@ The results look like this: 0x8048ac8: _start (../../src/lib/user/entry.c:9) @end example +Here's an extra tip for anyone who read this far: @command{backtrace} +is smart enough to strip the @code{Call stack:} header and @samp{.} +trailer from the command line if you include them. This can save you +a little bit of trouble in cutting and pasting. Thus, the following +command prints the same output as the first one we used: + +@example +backtrace kernel.o Call stack: 0xc0106eff 0xc01102fb 0xc010dc22 +0xc010cf67 0xc0102319 0xc010325a 0x804812c 0x8048a96 0x8048ac8. +@end example + @node i386-elf-gdb @section @command{i386-elf-gdb} You can run the Pintos kernel under the supervision of the @command{i386-elf-gdb} debugger.@footnote{If you're using an 80@var{x}86 system for development, it's probably just called -@command{addr2line}.} There are two steps in the process. First, +@command{gdb}.} There are two steps in the process. First, start Pintos with the @option{--gdb} option, e.g.@: @command{pintos --gdb run}. Second, in a second terminal, invoke @command{gdb} on @file{kernel.o}: @@ -374,17 +358,18 @@ above, a good place to start adding @func{printf}s is @node Debugging Tips @section Tips -The page allocator in @file{threads/palloc.c} clears all the bytes in -pages to @t{0xcc} when they are freed. Thus, if you see an attempt to +The page allocator in @file{threads/palloc.c} and the block allocator in +@file{threads/malloc.c} both clear all the bytes in pages and blocks to +@t{0xcc} when they are freed. Thus, if you see an attempt to dereference a pointer like @t{0xcccccccc}, or some other reference to @t{0xcc}, there's a good chance you're trying to reuse a page that's -already been freed. Also, byte @t{0xcc} is the CPU opcode for -``invoke interrupt 3,'' so if you see an error like @code{Interrupt -0x03 (#BP Breakpoint Exception)}, Pintos tried to execute code in a -freed page. - -Similarly, the block allocator in @file{threads/malloc.c} clears all -the bytes in freed blocks to @t{0xcd}. The two bytes @t{0xcdcd} are -a CPU opcode for ``invoke interrupt @t{0xcd},'' so @code{Interrupt -0xcd (unknown)} is a good sign that you tried to execute code in a -block freed with @func{free}. +already been freed. Also, byte @t{0xcc} is the CPU opcode for ``invoke +interrupt 3,'' so if you see an error like @code{Interrupt 0x03 (#BP +Breakpoint Exception)}, Pintos tried to execute code in a freed page or +block. + +An assertion failure on the expression @code{sec_no < d->capacity} +indicates that Pintos tried to access a file through an inode that has +been closed and freed. Freeing an inode clears its starting sector +number to @t{0xcccccccc}, which is not a valid sector number for disks +smaller than about 1.6 TB.