Make it possible to ignore page faults in GDB.
[pintos-anon] / doc / debug.texi
1 @node Debugging Tools
2 @appendix Debugging Tools
3
4 Many tools lie at your disposal for debugging Pintos.  This appendix
5 introduces you to a few of them.
6
7 @menu
8 * printf::                      
9 * ASSERT::                      
10 * Function and Parameter Attributes::  
11 * Backtraces::                  
12 * GDB::                         
13 * Triple Faults::               
14 * Modifying Bochs::             
15 * Debugging Tips::              
16 @end menu
17
18 @node printf
19 @section @code{printf()}
20
21 Don't underestimate the value of @func{printf}.  The way
22 @func{printf} is implemented in Pintos, you can call it from
23 practically anywhere in the kernel, whether it's in a kernel thread or
24 an interrupt handler, almost regardless of what locks are held (but see
25 @ref{printf Reboots} for a counterexample).
26
27 @func{printf} is useful for more than just examining data.
28 It can also help figure out when and where something goes wrong, even
29 when the kernel crashes or panics without a useful error message.  The
30 strategy is to sprinkle calls to @func{print} with different strings
31 (e.g.@: @code{"<1>"}, @code{"<2>"}, @dots{}) throughout the pieces of
32 code you suspect are failing.  If you don't even see @code{<1>} printed,
33 then something bad happened before that point, if you see @code{<1>}
34 but not @code{<2>}, then something bad happened between those two
35 points, and so on.  Based on what you learn, you can then insert more
36 @func{printf} calls in the new, smaller region of code you suspect.
37 Eventually you can narrow the problem down to a single statement.
38 @xref{Triple Faults}, for a related technique.
39
40 @node ASSERT
41 @section @code{ASSERT}
42
43 Assertions are useful because they can catch problems early, before
44 they'd otherwise be noticed.  Ideally, each function should begin with a
45 set of assertions that check its arguments for validity.  (Initializers
46 for functions' local variables are evaluated before assertions are
47 checked, so be careful not to assume that an argument is valid in an
48 initializer.)  You can also sprinkle assertions throughout the body of
49 functions in places where you suspect things are likely to go wrong.
50 They are especially useful for checking loop invariants.
51
52 Pintos provides the @code{ASSERT} macro, defined in @file{<debug.h>},
53 for checking assertions.
54
55 @defmac ASSERT (expression)
56 Tests the value of @var{expression}.  If it evaluates to zero (false),
57 the kernel panics.  The panic message includes the expression that
58 failed, its file and line number, and a backtrace, which should help you
59 to find the problem.  @xref{Backtraces}, for more information.
60 @end defmac
61
62 @node Function and Parameter Attributes
63 @section Function and Parameter Attributes
64
65 These macros defined in @file{<debug.h>} tell the compiler special
66 attributes of a function or function parameter.  Their expansions are
67 GCC-specific.
68
69 @defmac UNUSED
70 Appended to a function parameter to tell the compiler that the
71 parameter might not be used within the function.  It suppresses the
72 warning that would otherwise appear.
73 @end defmac
74
75 @defmac NO_RETURN
76 Appended to a function prototype to tell the compiler that the
77 function never returns.  It allows the compiler to fine-tune its
78 warnings and its code generation.
79 @end defmac
80
81 @defmac NO_INLINE
82 Appended to a function prototype to tell the compiler to never emit
83 the function in-line.  Occasionally useful to improve the quality of
84 backtraces (see below).
85 @end defmac
86
87 @defmac PRINTF_FORMAT (@var{format}, @var{first})
88 Appended to a function prototype to tell the compiler that the function
89 takes a @func{printf}-like format string as the argument numbered
90 @var{format} (starting from 1) and that the corresponding value
91 arguments start at the argument numbered @var{first}.  This lets the
92 compiler tell you if you pass the wrong argument types.
93 @end defmac
94
95 @node Backtraces
96 @section Backtraces
97
98 When the kernel panics, it prints a ``backtrace,'' that is, a summary
99 of how your program got where it is, as a list of addresses inside the
100 functions that were running at the time of the panic.  You can also
101 insert a call to @func{debug_backtrace}, prototyped in
102 @file{<debug.h>}, to print a backtrace at any point in your code.
103
104 The addresses in a backtrace are listed as raw hexadecimal numbers,
105 which are difficult to interpret.  We provide a tool called
106 @command{backtrace} to translate these into function names and source
107 file line numbers.
108 Give it the name of your @file{kernel.o} as the first argument and the
109 hexadecimal numbers composing the backtrace (including the @samp{0x}
110 prefixes) as the remaining arguments.  It outputs the function name
111 and source file line numbers that correspond to each address.  
112
113 If the translated form of a backtrace is garbled, or doesn't make
114 sense (e.g.@: function A is listed above function B, but B doesn't
115 call A), then it's a good sign that you're corrupting a kernel
116 thread's stack, because the backtrace is extracted from the stack.
117 Alternatively, it could be that the @file{kernel.o} you passed to
118 @command{backtrace} is not the same kernel that produced
119 the backtrace.
120
121 Sometimes backtraces can be confusing without any corruption.
122 Compiler optimizations can cause surprising behavior.  When a function
123 has called another function as its final action (a @dfn{tail call}), the
124 calling function may not appear in a backtrace at all.  Similarly, when
125 function A calls another function B that never returns, the compiler may
126 optimize such that an unrelated function C appears in the backtrace
127 instead of A.  Function C is simply the function that happens to be in
128 memory just after A.  In the threads project, this is commonly seen in
129 backtraces for test failures; see @ref{The pass function fails, ,
130 @func{pass} Fails}, for more information.
131
132 @menu
133 * Backtrace Example::           
134 @end menu
135
136 @node Backtrace Example
137 @subsection Example
138
139 Here's an example.  Suppose that Pintos printed out this following call
140 stack, which is taken from an actual Pintos submission for the file
141 system project:
142
143 @example
144 Call stack: 0xc0106eff 0xc01102fb 0xc010dc22 0xc010cf67 0xc0102319
145 0xc010325a 0x804812c 0x8048a96 0x8048ac8.
146 @end example
147
148 You would then invoke the @command{backtrace} utility like shown below,
149 cutting and pasting the backtrace information into the command line.
150 This assumes that @file{kernel.o} is in the current directory.  You
151 would of course enter all of the following on a single shell command
152 line, even though that would overflow our margins here:
153
154 @example
155 backtrace kernel.o 0xc0106eff 0xc01102fb 0xc010dc22 0xc010cf67 
156 0xc0102319 0xc010325a 0x804812c 0x8048a96 0x8048ac8
157 @end example
158
159 The backtrace output would then look something like this:
160
161 @example
162 0xc0106eff: debug_panic (lib/debug.c:86)
163 0xc01102fb: file_seek (filesys/file.c:405)
164 0xc010dc22: seek (userprog/syscall.c:744)
165 0xc010cf67: syscall_handler (userprog/syscall.c:444)
166 0xc0102319: intr_handler (threads/interrupt.c:334)
167 0xc010325a: intr_entry (threads/intr-stubs.S:38)
168 0x0804812c: (unknown)
169 0x08048a96: (unknown)
170 0x08048ac8: (unknown)
171 @end example
172
173 (You will probably not see exactly the same addresses if you run the
174 command above on your own kernel binary, because the source code you
175 compiled and the compiler you used are probably different.)
176
177 The first line in the backtrace refers to @func{debug_panic}, the
178 function that implements kernel panics.  Because backtraces commonly
179 result from kernel panics, @func{debug_panic} will often be the first
180 function shown in a backtrace.
181
182 The second line shows @func{file_seek} as the function that panicked,
183 in this case as the result of an assertion failure.  In the source code
184 tree used for this example, line 405 of @file{filesys/file.c} is the
185 assertion
186
187 @example
188 ASSERT (file_ofs >= 0);
189 @end example
190
191 @noindent
192 (This line was also cited in the assertion failure message.)
193 Thus, @func{file_seek} panicked because it passed a negative file offset
194 argument.
195
196 The third line indicates that @func{seek} called @func{file_seek},
197 presumably without validating the offset argument.  In this submission,
198 @func{seek} implements the @code{seek} system call.
199
200 The fourth line shows that @func{syscall_handler}, the system call
201 handler, invoked @func{seek}.
202
203 The fifth and sixth lines are the interrupt handler entry path.
204
205 The remaining lines are for addresses below @code{PHYS_BASE}.  This
206 means that they refer to addresses in the user program, not in the
207 kernel.  If you know what user program was running when the kernel
208 panicked, you can re-run @command{backtrace} on the user program, like
209 so: (typing the command on a single line, of course):
210
211 @example
212 backtrace tests/filesys/extended/grow-too-big 0xc0106eff 0xc01102fb
213 0xc010dc22 0xc010cf67 0xc0102319 0xc010325a 0x804812c 0x8048a96
214 0x8048ac8
215 @end example
216
217 The results look like this:
218
219 @example
220 0xc0106eff: (unknown)
221 0xc01102fb: (unknown)
222 0xc010dc22: (unknown)
223 0xc010cf67: (unknown)
224 0xc0102319: (unknown)
225 0xc010325a: (unknown)
226 0x0804812c: test_main (...xtended/grow-too-big.c:20)
227 0x08048a96: main (tests/main.c:10)
228 0x08048ac8: _start (lib/user/entry.c:9)
229 @end example
230
231 You can even specify both the kernel and the user program names on
232 the command line, like so:
233
234 @example
235 backtrace kernel.o tests/filesys/extended/grow-too-big 0xc0106eff
236 0xc01102fb 0xc010dc22 0xc010cf67 0xc0102319 0xc010325a 0x804812c
237 0x8048a96 0x8048ac8
238 @end example
239
240 The result is a combined backtrace:
241
242 @example
243 In kernel.o:
244 0xc0106eff: debug_panic (lib/debug.c:86)
245 0xc01102fb: file_seek (filesys/file.c:405)
246 0xc010dc22: seek (userprog/syscall.c:744)
247 0xc010cf67: syscall_handler (userprog/syscall.c:444)
248 0xc0102319: intr_handler (threads/interrupt.c:334)
249 0xc010325a: intr_entry (threads/intr-stubs.S:38)
250 In tests/filesys/extended/grow-too-big:
251 0x0804812c: test_main (...xtended/grow-too-big.c:20)
252 0x08048a96: main (tests/main.c:10)
253 0x08048ac8: _start (lib/user/entry.c:9)
254 @end example
255
256 Here's an extra tip for anyone who read this far: @command{backtrace}
257 is smart enough to strip the @code{Call stack:} header and @samp{.}
258 trailer from the command line if you include them.  This can save you
259 a little bit of trouble in cutting and pasting.  Thus, the following
260 command prints the same output as the first one we used:
261
262 @example
263 backtrace kernel.o Call stack: 0xc0106eff 0xc01102fb 0xc010dc22
264 0xc010cf67 0xc0102319 0xc010325a 0x804812c 0x8048a96 0x8048ac8.
265 @end example
266
267 @node GDB
268 @section GDB
269
270 You can run Pintos under the supervision of the GDB debugger.
271 First, start Pintos with the @option{--gdb} option, e.g.@:
272 @command{pintos --gdb -- run mytest}.  Second, open a second terminal on
273 the same machine and
274 use @command{pintos-gdb} to invoke GDB on
275 @file{kernel.o}:@footnote{@command{pintos-gdb} is a wrapper around
276 @command{gdb} (80@var{x}86) or @command{i386-elf-gdb} (SPARC) that loads
277 the Pintos macros at startup.}
278 @example
279 pintos-gdb kernel.o
280 @end example
281 @noindent and issue the following GDB command:
282 @example
283 target remote localhost:1234
284 @end example
285
286 Now GDB is connected to the simulator over a local
287 network connection.  You can now issue any normal GDB
288 commands.  If you issue the @samp{c} command, the simulated BIOS will take
289 control, load Pintos, and then Pintos will run in the usual way.  You
290 can pause the process at any point with @key{Ctrl+C}.
291
292 @menu
293 * Using GDB::                   
294 * Example GDB Session::         
295 * Debugging User Programs::     
296 * GDB FAQ::                     
297 @end menu
298
299 @node Using GDB
300 @subsection Using GDB
301
302 You can read the GDB manual by typing @code{info gdb} at a
303 terminal command prompt.  Here's a few commonly useful GDB commands:
304
305 @deffn {GDB Command} c
306 Continues execution until @key{Ctrl+C} or the next breakpoint.
307 @end deffn
308
309 @deffn {GDB Command} break function
310 @deffnx {GDB Command} break file:line
311 @deffnx {GDB Command} break *address
312 Sets a breakpoint at @var{function}, at @var{line} within @var{file}, or
313 @var{address}.
314 (Use a @samp{0x} prefix to specify an address in hex.)
315
316 Use @code{break main} to make GDB stop when Pintos starts running.
317 @end deffn
318
319 @deffn {GDB Command} p expression
320 Evaluates the given @var{expression} and prints its value.
321 If the expression contains a function call, that function will actually
322 be executed.
323 @end deffn
324
325 @deffn {GDB Command} l *address
326 Lists a few lines of code around @var{address}.
327 (Use a @samp{0x} prefix to specify an address in hex.)
328 @end deffn
329
330 @deffn {GDB Command} bt
331 Prints a stack backtrace similar to that output by the
332 @command{backtrace} program described above.
333 @end deffn
334
335 @deffn {GDB Command} p/a address
336 Prints the name of the function or variable that occupies @var{address}.
337 (Use a @samp{0x} prefix to specify an address in hex.)
338 @end deffn
339
340 @deffn {GDB Command} diassemble function
341 Disassembles @var{function}.
342 @end deffn
343
344 We also provide a set of macros specialized for debugging Pintos,
345 written by Godmar Back @email{gback@@cs.vt.edu}.  You can type
346 @code{help user-defined} for basic help with the macros.  Here is an
347 overview of their functionality, based on Godmar's documentation:
348
349 @deffn {GDB Macro} debugpintos
350 Attach debugger to a waiting pintos process on the same machine.
351 Shorthand for @code{target remote localhost:1234}.
352 @end deffn
353
354 @deffn {GDB Macro} dumplist list type element
355 Prints the elements of @var{list}, which should be a @code{struct} list
356 that contains elements of the given @var{type} (without the word
357 @code{struct}) in which @var{element} is the @struct{list_elem} member
358 that links the elements.
359
360 Example: @code{dumplist all_list thread all_elem} prints all elements of
361 @struct{thread} that are linked in @code{struct list all_list} using the
362 @code{struct list_elem all_elem} which is part of @struct{thread}.
363 (This assumes that you have added @code{all_list} and @code{all_elem}
364 yourself.)
365 @end deffn
366
367 @deffn {GDB Macro} btthread thread
368 Shows the backtrace of @var{thread}, which is a pointer to the
369 @struct{thread} of the thread whose backtrace it should show.  For the
370 current thread, this is identical to the @code{bt} (backtrace) command.
371 It also works for any thread suspended in @func{schedule},
372 provided you know where its kernel stack page is located.
373 @end deffn
374
375 @deffn {GDB Macro} btthreadlist list element
376 Shows the backtraces of all threads in @var{list}, the @struct{list} in
377 which the threads are kept.  Specify @var{element} as the
378 @struct{list_elem} field used inside @struct{thread} to link the threads
379 together.
380
381 Example: @code{btthreadlist all_list all_elem} shows the backtraces of
382 all threads contained in @code{struct list all_list}, linked together by
383 @code{all_elem}.  This command is useful to determine where your threads
384 are stuck when a deadlock occurs.  Please see the example scenario below.
385 (This assumes that you have added @code{all_list} and @code{all_elem}
386 yourself.)
387 @end deffn
388
389 @deffn {GDB Macro} btpagefault
390 Print a backtrace of the current thread after a page fault exception.
391 Normally, when a page fault exception occurs, GDB will stop
392 with a message that might say:
393
394 @example
395 Program received signal 0, Signal 0.
396 0xc0102320 in intr0e_stub ()
397 @end example
398
399 In that case, the @code{bt} command might not give a useful
400 backtrace.  Use @code{btpagefault} instead.
401
402 You may also use @code{btpagefault} for page faults that occur in a user
403 process.  In this case, you may also wish to load the user program's
404 symbol table (@pxref{Debugging User Programs}).
405 @end deffn
406
407 @deffn {GDB Macro} hook-stop
408 GDB invokes this macro every time the simulation stops, which Bochs will
409 do for every processor exception, among other reasons.  If the
410 simulation stops due to a page fault, @code{hook-stop} will print a
411 message that says and explains further whether the page fault occurred
412 in the kernel or in user code.
413
414 If the exception occurred from user code, @code{hook-stop} will say:
415 @example
416 pintos-debug: a page fault exception occurred in user mode
417 pintos-debug: hit 'c' to continue, or 's' to step to intr_handler
418 @end example
419
420 In Project 2, a page fault in a user process leads to the termination of
421 the process.  You should expect those page faults to occur in the
422 robustness tests where we test that your kernel properly terminates
423 processes that try to access invalid addresses.  To debug those, set a
424 break point in @func{page_fault} in @file{exception.c}, which you will
425 need to modify accordingly.
426
427 In Project 3, a page fault in a user process no longer automatically
428 leads to the termination of a process.  Instead, it may require reading in
429 data for the page the process was trying to access, either
430 because it was swapped out or because this is the first time it's
431 accessed.  In either case, you will reach @func{page_fault} and need to
432 take the appropriate action there.
433
434 If the page fault did not occur in user mode while executing a user
435 process, then it occurred in kernel mode while executing kernel code.
436 In this case, @code{hook-stop} will print this message:
437 @example
438 pintos-debug: a page fault occurred in kernel mode
439 @end example
440 followed by the output of the @code{btpagefault} command.
441
442 Before Project 3, a page fault exception in kernel code is always a bug
443 in your kernel, because your kernel should never crash.  Starting with
444 Project 3, the situation will change if you use @func{get_user} and
445 @func{put_user} strategy to verify user memory accesses
446 (@pxref{Accessing User Memory}).
447
448 If you don't want GDB to stop for page faults, then issue the command
449 @code{handle SIGSEGV nostop}.  GDB will still print a message for
450 every page fault, but it will not come back to a command prompt.
451 @end deffn
452
453 @node Example GDB Session
454 @subsection Example GDB Session
455
456 This section narrates a sample GDB session, provided by Godmar Back.
457 This example illustrates how one might debug a Project 1 solution in
458 which occasionally a thread that calls @func{timer_sleep} is not woken
459 up.  With this bug, tests such as @code{mlfqs_load_1} get stuck.
460
461 This session was captured with a slightly older version of Bochs and the
462 GDB macros for Pintos, so it looks slightly different than it would now.
463 Program output is shown in normal type, user input in @strong{strong}
464 type.
465
466 First, I start Pintos:
467
468 @smallexample
469 $ @strong{pintos -v --gdb -- -q -mlfqs run mlfqs-load-1}
470 Writing command line to /tmp/gDAlqTB5Uf.dsk...
471 bochs -q
472 ========================================================================
473                        Bochs x86 Emulator 2.2.5
474              Build from CVS snapshot on December 30, 2005
475 ========================================================================
476 00000000000i[     ] reading configuration from bochsrc.txt
477 00000000000i[     ] Enabled gdbstub
478 00000000000i[     ] installing nogui module as the Bochs GUI
479 00000000000i[     ] using log file bochsout.txt
480 Waiting for gdb connection on localhost:1234
481 @end smallexample
482
483 @noindent Then, I open a second window on the same machine and start GDB:
484
485 @smallexample
486 $ @strong{pintos-gdb kernel.o}
487 GNU gdb Red Hat Linux (6.3.0.0-1.84rh)
488 Copyright 2004 Free Software Foundation, Inc.
489 GDB is free software, covered by the GNU General Public License, and you are
490 welcome to change it and/or distribute copies of it under certain conditions.
491 Type "show copying" to see the conditions.
492 There is absolutely no warranty for GDB.  Type "show warranty" for details.
493 This GDB was configured as "i386-redhat-linux-gnu"...
494 Using host libthread_db library "/lib/libthread_db.so.1".
495 @end smallexample
496
497 @noindent Then, I tell GDB to attach to the waiting Pintos emulator:
498
499 @smallexample
500 (gdb) @strong{debugpintos}
501 Remote debugging using localhost:1234
502 0x0000fff0 in ?? ()
503 Reply contains invalid hex digit 78
504 @end smallexample
505
506 @noindent Now I tell Pintos to run by executing @code{c} (short for
507 @code{continue}) twice:
508
509 @smallexample
510 (gdb) @strong{c}
511 Continuing.
512 Reply contains invalid hex digit 78
513 (gdb) @strong{c}
514 Continuing.
515 @end smallexample
516
517 @noindent Now Pintos will continue and output:
518
519 @smallexample
520 Pintos booting with 4,096 kB RAM...
521 Kernel command line: -q -mlfqs run mlfqs-load-1
522 374 pages available in kernel pool.
523 373 pages available in user pool.
524 Calibrating timer...  102,400 loops/s.
525 Boot complete.
526 Executing 'mlfqs-load-1':
527 (mlfqs-load-1) begin
528 (mlfqs-load-1) spinning for up to 45 seconds, please wait...
529 (mlfqs-load-1) load average rose to 0.5 after 42 seconds
530 (mlfqs-load-1) sleeping for another 10 seconds, please wait...
531 @end smallexample
532
533 @noindent 
534 @dots{}until it gets stuck because of the bug I had introduced.  I hit
535 @key{Ctrl+C} in the debugger window:
536
537 @smallexample
538 Program received signal 0, Signal 0.
539 0xc010168c in next_thread_to_run () at ../../threads/thread.c:649
540 649       while (i <= PRI_MAX && list_empty (&ready_list[i]))
541 (gdb) 
542 @end smallexample
543
544 @noindent 
545 The thread that was running when I interrupted Pintos was the idle
546 thread.  If I run @code{backtrace}, it shows this backtrace:
547
548 @smallexample
549 (gdb) @strong{bt}
550 #0  0xc010168c in next_thread_to_run () at ../../threads/thread.c:649
551 #1  0xc0101778 in schedule () at ../../threads/thread.c:714
552 #2  0xc0100f8f in thread_block () at ../../threads/thread.c:324
553 #3  0xc0101419 in idle (aux=0x0) at ../../threads/thread.c:551
554 #4  0xc010145a in kernel_thread (function=0xc01013ff , aux=0x0)
555     at ../../threads/thread.c:575
556 #5  0x00000000 in ?? ()
557 @end smallexample
558
559 @noindent 
560 Not terribly useful.  What I really like to know is what's up with the
561 other thread (or threads).  Since I keep all threads in a linked list
562 called @code{all_list}, linked together by a @struct{list_elem} member
563 named @code{all_elem}, I can use the @code{btthreadlist} macro from the
564 macro library I wrote.  @code{btthreadlist} iterates through the list of
565 threads and prints the backtrace for each thread:
566
567 @smallexample
568 (gdb) @strong{btthreadlist all_list all_elem}
569 pintos-debug: dumping backtrace of thread 'main' @@0xc002f000
570 #0  0xc0101820 in schedule () at ../../threads/thread.c:722
571 #1  0xc0100f8f in thread_block () at ../../threads/thread.c:324
572 #2  0xc0104755 in timer_sleep (ticks=1000) at ../../devices/timer.c:141
573 #3  0xc010bf7c in test_mlfqs_load_1 () at ../../tests/threads/mlfqs-load-1.c:49
574 #4  0xc010aabb in run_test (name=0xc0007d8c "mlfqs-load-1")
575     at ../../tests/threads/tests.c:50
576 #5  0xc0100647 in run_task (argv=0xc0110d28) at ../../threads/init.c:281
577 #6  0xc0100721 in run_actions (argv=0xc0110d28) at ../../threads/init.c:331
578 #7  0xc01000c7 in main () at ../../threads/init.c:140
579
580 pintos-debug: dumping backtrace of thread 'idle' @@0xc0116000
581 #0  0xc010168c in next_thread_to_run () at ../../threads/thread.c:649
582 #1  0xc0101778 in schedule () at ../../threads/thread.c:714
583 #2  0xc0100f8f in thread_block () at ../../threads/thread.c:324
584 #3  0xc0101419 in idle (aux=0x0) at ../../threads/thread.c:551
585 #4  0xc010145a in kernel_thread (function=0xc01013ff , aux=0x0)
586     at ../../threads/thread.c:575
587 #5  0x00000000 in ?? ()
588 @end smallexample
589
590 @noindent 
591 In this case, there are only two threads, the idle thread and the main
592 thread.  The kernel stack pages (to which the @struct{thread} points)
593 are at @t{0xc0116000} and @t{0xc002f000}, respectively.  The main thread
594 is stuck in @func{timer_sleep}, called from @code{test_mlfqs_load_1}.
595
596 Knowing where threads are stuck can be tremendously useful, for instance
597 when diagnosing deadlocks or unexplained hangs.
598
599 @node Debugging User Programs
600 @subsection Debugging User Programs
601
602 You can also use GDB to debug a user program running under
603 Pintos.  Start by issuing this GDB command to load the
604 program's symbol table:
605 @example
606 add-symbol-file @var{program}
607 @end example
608 @noindent
609 where @var{program} is the name of the program's executable (in the host
610 file system, not in the Pintos file system).  After this, you should be
611 able to debug the user program the same way you would the kernel, by
612 placing breakpoints, inspecting data, etc.  Your actions apply to every
613 user program running in Pintos, not just to the one you want to debug,
614 so be careful in interpreting the results.  Also, a name that appears in
615 both the kernel and the user program will actually refer to the kernel
616 name.  (The latter problem can be avoided by giving the user executable
617 name on the GDB command line, instead of @file{kernel.o}, and then using
618 @code{add-symbol-file} to load @file{kernel.o}.)
619
620 @node GDB FAQ
621 @subsection FAQ
622
623 @table @asis
624 @item GDB can't connect to Bochs.
625
626 If the @command{target remote} command fails, then make sure that both
627 GDB and @command{pintos} are running on the same machine by
628 running @command{hostname} in each terminal.  If the names printed
629 differ, then you need to open a new terminal for GDB on the
630 machine running @command{pintos}.
631
632 @item GDB doesn't recognize any of the macros.
633
634 If you start GDB with @command{pintos-gdb}, it should load the Pintos
635 macros automatically.  If you start GDB some other way, then you must
636 issue the command @code{source @var{pintosdir}/src/misc/gdb-macros},
637 where @var{pintosdir} is the root of your Pintos directory, before you
638 can use them.
639
640 @item Can I debug Pintos with DDD?
641
642 Yes, you can.  DDD invokes GDB as a subprocess, so you'll need to tell
643 it to invokes @command{pintos-gdb} instead:
644 @example
645 ddd --gdb --debugger pintos-gdb
646 @end example
647
648 @item Can I use GDB inside Emacs?
649
650 Yes, you can.  Emacs has special support for running GDB as a
651 subprocess.  Type @kbd{M-x gdb} and enter your @command{pintos-gdb}
652 command at the prompt.  The Emacs manual has information on how to use
653 its debugging features in a section titled ``Debuggers.''
654
655 @item GDB is doing something weird.
656
657 If you notice strange behavior while using GDB, there
658 are three possibilities: a bug in your
659 modified Pintos, a bug in Bochs's
660 interface to GDB or in GDB itself, or
661 a bug in the original Pintos code.  The first and second
662 are quite likely, and you should seriously consider both.  We hope
663 that the third is less likely, but it is also possible.
664 @end table
665
666 @node Triple Faults
667 @section Triple Faults
668
669 When a CPU exception handler, such as a page fault handler, cannot be
670 invoked because it is missing or defective, the CPU will try to invoke
671 the ``double fault'' handler.  If the double fault handler is itself
672 missing or defective, that's called a ``triple fault.''  A triple fault
673 causes an immediate CPU reset.
674
675 Thus, if you get yourself into a situation where the machine reboots in
676 a loop, that's probably a ``triple fault.''  In a triple fault
677 situation, you might not be able to use @func{printf} for debugging,
678 because the reboots might be happening even before everything needed for
679 @func{printf} is initialized.
680
681 There are at least two ways to debug triple faults.  First, you can run
682 Pintos in Bochs under GDB (@pxref{GDB}).  If Bochs has been built
683 properly for Pintos, a triple fault under GDB will cause it to print the
684 message ``Triple fault: stopping for gdb'' on the console and break into
685 the debugger.  (If Bochs is not running under GDB, a triple fault will
686 still cause it to reboot.)  You can then inspect where Pintos stopped,
687 which is where the triple fault occurred.
688
689 Another option is what I call ``debugging by infinite loop.''
690 Pick a place in the Pintos code, insert the infinite loop
691 @code{for (;;);} there, and recompile and run.  There are two likely
692 possibilities:
693
694 @itemize @bullet
695 @item
696 The machine hangs without rebooting.  If this happens, you know that
697 the infinite loop is running.  That means that whatever caused the
698 reboot must be @emph{after} the place you inserted the infinite loop.
699 Now move the infinite loop later in the code sequence.
700
701 @item
702 The machine reboots in a loop.  If this happens, you know that the
703 machine didn't make it to the infinite loop.  Thus, whatever caused the
704 reboot must be @emph{before} the place you inserted the infinite loop.
705 Now move the infinite loop earlier in the code sequence.
706 @end itemize
707
708 If you move around the infinite loop in a ``binary search'' fashion, you
709 can use this technique to pin down the exact spot that everything goes
710 wrong.  It should only take a few minutes at most.
711
712 @node Modifying Bochs
713 @section Modifying Bochs
714
715 An advanced debugging technique is to modify and recompile the
716 simulator.  This proves useful when the simulated hardware has more
717 information than it makes available to the OS.  For example, page
718 faults have a long list of potential causes, but the hardware does not
719 report to the OS exactly which one is the particular cause.
720 Furthermore, a bug in the kernel's handling of page faults can easily
721 lead to recursive faults, but a ``triple fault'' will cause the CPU to
722 reset itself, which is hardly conducive to debugging.
723
724 In a case like this, you might appreciate being able to make Bochs
725 print out more debug information, such as the exact type of fault that
726 occurred.  It's not very hard.  You start by retrieving the source
727 code for Bochs 2.2.6 from @uref{http://bochs.sourceforge.net} and
728 extracting it into a directory.  Then read
729 @file{pintos/src/misc/bochs-2.2.6.README} and apply the patches needed.
730 Then run @file{./configure}, supplying the options you want (some
731 suggestions are in the patch file).  Finally, run @command{make}.
732 This will compile Bochs and eventually produce a new binary
733 @file{bochs}.  To use your @file{bochs} binary with @command{pintos},
734 put it in your @env{PATH}, and make sure that it is earlier than
735 @file{/usr/class/cs140/`uname -m`/bochs}.
736
737 Of course, to get any good out of this you'll have to actually modify
738 Bochs.  Instructions for doing this are firmly out of the scope of
739 this document.  However, if you want to debug page faults as suggested
740 above, a good place to start adding @func{printf}s is
741 @func{BX_CPU_C::dtranslate_linear} in @file{cpu/paging.cc}.
742
743 @node Debugging Tips
744 @section Tips
745
746 The page allocator in @file{threads/palloc.c} and the block allocator in
747 @file{threads/malloc.c} clear all the bytes in memory to
748 @t{0xcc} at time of free.  Thus, if you see an attempt to
749 dereference a pointer like @t{0xcccccccc}, or some other reference to
750 @t{0xcc}, there's a good chance you're trying to reuse a page that's
751 already been freed.  Also, byte @t{0xcc} is the CPU opcode for ``invoke
752 interrupt 3,'' so if you see an error like @code{Interrupt 0x03 (#BP
753 Breakpoint Exception)}, then Pintos tried to execute code in a freed page or
754 block.
755
756 An assertion failure on the expression @code{sec_no < d->capacity}
757 indicates that Pintos tried to access a file through an inode that has
758 been closed and freed.  Freeing an inode clears its starting sector
759 number to @t{0xcccccccc}, which is not a valid sector number for disks
760 smaller than about 1.6 TB.