A reversible debugger offers both standard debugger operations (e.g. step and next) and reverse execution equivalents that rewind the program’s state. Even on simple programs, this is convenient: for instance, if you identify a bad memory write, it allows you to step backward and see the value that was in memory before it was overwritten. In more complex systems, reversible debugging allows you to examine the environment at and before an intermittent fault.