traditional interactive debuggers are frustrating to use. When a
programmer is trying to track down a problem they have to set
breakpoints in the code, run the program until it reaches a breakpoint
and then single-step through the code until they realize what is going
wrong. They often have to single-step through hundreds of lines of
code, or they have to re-run the program many times because the
breakpoint is reached several times before the bug is seen.
A more natural way of working would be to single-step
backwards through the code, tracing back from a point where
the program has clearly gone wrong, towards the point at which it
initially failed. One good approach could work by, rather than
directly supporting reverse execution of every instruction,
periodically checkpoint the user-space process state and roll forwards
from one of these checkpoints.