Running programs backwards
There's lots of research on this subject.  I've sometimes seen it called "time-travel debugging" in the literature, sometimes "reverse debugging".  A few minutes on Google Scholar should turn up a bunch of research publications on the subject.

See also https://softwareengineering.stackexchange.com/q/181527/34181 and https://stackoverflow.com/q/1470434/781723.