在Visual Studio 2010中调用堆栈时间机器

我知道标题有点雄心勃勃,但我想知道是否有办法,在调试C#程序时在调用堆栈窗口(Visual Studio 2010)中显示以前的状态,重新启动(就像点击“继续”/ F5)从那里开始。

这对于调试生成exception的lambda表达式特别有用,因为无法向外移动。

对于真正的OO代码时间机器,所有对象的历史状态都需要存储在内存中,所以我怀疑它在这个阶段是否可行。 现在,如果所有对象的状态没有太大变化,那么我们可以保持当前状态并及时跳回(作为使用“编辑并继续”执行相同操作的快捷方式)。

有时,您可以右键单击堆栈框架并选择“展开到此处”(或非常相似的措辞)。 这并不总是可能,而且我不确定必要的条件是什么,但我会猜测是什么可能会阻止它:

  • 中间调用堆栈上的本机代码帧
  • 在StackOverflowException停止(显然,在任何情况下死亡到一个进程)
  • 也许lambda表达式或其他阻止编辑和继续工作的东西(?)

基本上,任何“不寻常”。

除此之外,如果它有效,那么你去!

这有点kludgy但是:

在调用堆栈窗口中查看先前状态时,打开反汇编窗口(Debug | Windows | Disassembly或CTRL + ALT + D)。 现在,您应该能够创建一个断点,当您返回该位置时,该断点将停止执行。

如果您不关心执行其他操作,请按F5并允许代码重新运行到新断点。

现在右键单击要重新启动的语句,然后选择Set Next Statement。 按F5从那里重新启动。

如果您确实关心在返回新断点的路上还有什么执行,可以使用Set Next Statement将程序计数器设置为您所在函数的结尾,并使用Shift + F11退出该函数(因此不会执行该函数中任何剩余的逻辑)。 根据需要重复,直到您回到新的断点。

请注意有关使用Set Next Statement的各种可怕警告

编辑6/18当我测试上面的内容时,我运行的是Visual Studio 2010 Ultimate。 我刚检查了Visual Studio Express C#,它不支持反汇编调试窗口。 我什么时候可以检查Visual Studio 2010 Professional并再次更新此答案。 如果您有Visual Studio Ultimate,那么@Hans的Intellitrace建议可能是更好的选择。