历史调试器能够将程序状态(包括当前指令)恢复到以前的状态。在托管或非托管环境中,这怎么可能?我无法想象调试器会在每条指令上对整个系统进行状态拍摄。
答案 0 :(得分:4)
执行此操作的一种方法是在系统中记录非确定性的来源(I / O,中断),并以不同的间隔记录状态快照。这样,您可以通过恢复到之前的快照并使用录制的非确定性向前播放来“倒回”,直到您在过去达到所需的点为止。
例如,想象一下这个时间表:
1 2 3 4
| | | |
假设用户想要回退到第3点。您可以通过将系统状态(例如内存,寄存器)恢复到第2点并让系统像往常一样执行直到它到达第3点来实现。当需要从磁盘获取数据时,网络或其他一些非确定性源,历史调试器可以使用其记录的信息来提供数据。对于用户来说,程序的状态似乎只是恢复到第3点。
我认为这是VMWare's Replay Debugger工作原理的简化视图(另请参阅tech talk)。
答案 1 :(得分:2)
嗯,最重要的是,他们不会在每个指令上仅在各种“兴趣点”进行快照(例如,当抛出异常时,调用某些方法时等)。例如,Microsoft的IntelliTrace(在VS2010中)快照访问文件系统和注册表,与WinForms UI的交互等。
其次,它不会快照整个程序状态。例如,当您访问文件时,IntelliTrace会记录文件的名称,您要求的访问权限等等 - 但您不能只回到那一点并查看每个全局变量的状态。 / p>
我不知道其他历史调试器,但无论如何,这就是IntelliTrace在VS2010中的工作方式。
答案 2 :(得分:0)
每次可能获取状态的快照,但只有保留状态之间的增量(当然,不可能确切地说出任何给定的一个在不查看代码的情况下工作。)