Link Search Menu Expand Document

Debugging page faults

Below are some examples for debugging page faults using the Bochs emulator. We recommend using Bochs, rather than QEMU, to debug kernel crashes because QEMU exits when the kernel crashes, precluding after-the-fact debugging. In order to use the Bochs emulator for a specific test-run/debugging-session, use the FORCE_SIMULATOR environment variable. For example, to debug the do-nothing test using the Bochs emulator, you would run:

FORCE_SIMULATOR=--bochs PINTOS_DEBUG=1 pintos-test do-nothing

In the event that you encounter a bug that only shows up in QEMU, you can try setting a breakpoint in the page fault handler to allow for debugging before QEMU exits.

If you encounter a page fault during a test, you should use the method in Debugging Pintos tests to debug Pintos with GDB.

For example:

pintos-debug: a page fault occurred in kernel mode
#0 test_alarm_negative () at ../../tests/threads/alarm-negative.c:14
#1 0xc000ef4c in ?? ()
#2 0xc0020165 in start () at ../../threads/start.S:180

If you want to inspect the original environment where the page fault occurred, you can use this trick:

(gdb) debugpintos
(gdb) continue

Now, wait until the kernel encounters the page fault. Then run these commands:

(gdb) set $eip = ((void**) $esp)[1]
(gdb) up
(gdb) down

You should now be able to inspect the local variables and the stack trace when the page fault occurred.