Although the idea of reverse debugging sounds simple, actually some very complex tasks have to be accomplished behind the scenes in order to make it happen. The reverse debugger first records critical aspects of program execution that determine the “trajectory” of the program. This includes any time that the program reads data or makes a system call that returns data (such as a call to get a pseudo-random number). The information captured during the recording process amounts to a database of known states of the program so that backward-stepping operations or many much larger backward moves can be made with little or no delay.

The reverse debugger provides users with the ability to instruct the process to “go to” any previous point in the execution history. Behind the scenes, the engine uses the recorded information about the processes and the fact that many operations in a computer are deterministic to “run” the process to the desired point. At that point the debugger presents a view of the process as it would normally do, allowing the user to examine the stack backtrace, global, heap and automatic variables, set breakpoints and perform other typical debugging operations.


Josh Carlson