历史调试器如何工作?

maf*_*afu 5 debugging

历史调试器能够将程序状态(包括当前指令)恢复到先前状态.在托管或非托管环境中,这怎么可能?我无法想象调试器会在每条指令上对整个系统进行状态拍摄.

Chr*_*ich 4

实现此目的的一种方法是记录系统中不确定性的来源(I/O、中断)并以不同的时间间隔拍摄状态快照。这样,您可以通过恢复到以前的快照来“倒带”,并使用记录的非确定性向前播放,直到达到过去所需的点。

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

1    2           3     4
|    |           |     |
Run Code Online (Sandbox Code Playgroud)
  1. 节目开始
  2. 历史调试器拍摄的状态快照
  3. 用户想要倒回的时间点
  4. 现在

假设用户想要倒带到点 3。您可以通过将系统状态(例如内存、寄存器)恢复到点 2 并让系统照常执行直到到达点 3 来做到这一点。当需要从磁盘获取数据时,网络或一些其他非确定性源,历史调试器可以使用其记录的信息来提供数据。对于用户来说,程序的状态似乎只是恢复到了第 3 点。

我相信这是VMWare 的重播调试器工作原理的简化视图(另请参阅技术演讲)。