Debugging 历史调试器是如何工作的?

Debugging 历史调试器是如何工作的?,debugging,Debugging,历史调试器能够将程序状态(包括当前指令)还原为以前的状态。在托管或非托管环境中如何实现这一点?我无法想象调试器会在每条指令上拍摄整个系统的状态快照。它可能每次都拍摄状态快照,但只保留状态之间的增量(当然,如果不查看代码,就不可能准确地说出任何给定的状态是如何工作的)一种方法是记录系统中非确定性的来源(I/O、中断)并以不同的间隔拍摄状态快照。通过这种方式,您可以通过恢复到以前的快照并使用记录的非确定性向前播放“倒带”,直到您在过去达到所需的点 例如,想象一下这个时间线: 1 2

历史调试器能够将程序状态(包括当前指令)还原为以前的状态。在托管或非托管环境中如何实现这一点?我无法想象调试器会在每条指令上拍摄整个系统的状态快照。

它可能每次都拍摄状态快照,但只保留状态之间的增量(当然,如果不查看代码,就不可能准确地说出任何给定的状态是如何工作的)一种方法是记录系统中非确定性的来源(I/O、中断)并以不同的间隔拍摄状态快照。通过这种方式,您可以通过恢复到以前的快照并使用记录的非确定性向前播放“倒带”,直到您在过去达到所需的点

例如,想象一下这个时间线:

1    2           3     4
|    |           |     |
  • 程序启动
  • 历史调试器拍摄的状态快照
  • 用户希望倒带到的时间点
  • 现在
  • 假设用户想要倒带到第3点。您可以通过将系统状态(例如内存、寄存器)恢复到第2点,并让系统像往常一样执行,直到达到第3点。当需要从磁盘、网络或其他不确定源获取数据时,历史调试器可以使用其记录的信息来提供数据。对于用户来说,程序的状态似乎只是恢复到第3点


    我相信这是一个如何工作的简化视图(另请参见)。

    最重要的是,它们不会在每个指令上快照,而只是在不同的“关注点”(例如,当抛出异常时,当调用某些方法时,等等)。例如,Microsoft的IntelliTrace(在VS2010中)在访问文件系统和注册表、与WinForms UI交互等方面的快照

    其次,它不会快照整个程序状态。例如,当您访问一个文件时,IntelliTrace会记录该文件的名称、您请求的访问权限等等,但您不能返回到该点并查看每个全局变量的状态


    我不知道其他历史上的调试器,但无论如何,这就是IntelliTrace在VS2010中的工作原理。

    它有一个内置的计时器。大多数计时器只有一个吸气器,但这一个也有一个设定器。见第页。安装指南第15章-安装微型虫洞。有趣的想法,听起来很合理。你知道流行的历史调试器是否真的使用这种方法吗?你知道实现同样目标的其他方法吗?