代码之家  ›  专栏  ›  技术社区  ›  mafu

历史调试程序如何工作?

  •  5
  • mafu  · 技术社区  · 15 年前

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

    3 回复  |  直到 15 年前
        1
  •  4
  •   Chris Schmich    15 年前

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

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

    1    2           3     4
    |    |           |     |
    
    1. 程序启动
    2. 历史调试器拍摄的状态快照
    3. 用户想要倒带的时间点
    4. 现在

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

    我相信这是一个简单的观点 VMWare's Replay Debugger 工程(另见 tech talk )

        2
  •  2
  •   Dean Harding    15 年前

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

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

    我不知道其他历史调试程序,但无论如何,这就是IntelliTrace在VS2010中的工作方式。

        3
  •  0
  •   Jerry Coffin    15 年前

    它大概 每次都是状态快照,但仅限于 保留 州与州之间的三角洲(当然,不看它的代码就不可能确切地说出任何一个州是如何运作的)。