我知道标题有点雄心勃勃,但我想知道是否有办法在调试 C# 程序时在调用堆栈窗口 (Visual Studio 2010) 中显示以前的状态后重新启动(比如点击“继续”/ F5) 从那里。
这对于调试生成异常的 lambda 表达式特别有用,因为无法移出。
对于真正的 OO 代码时间机器,所有对象的历史状态都需要存储在内存中,所以我怀疑现阶段是否可行。现在,如果所有对象的状态没有太大变化,那么我们可以保持当前状态并及时跳回(作为使用“编辑并继续”执行相同操作的快捷方式)。
我知道标题有点雄心勃勃,但我想知道是否有办法在调试 C# 程序时在调用堆栈窗口 (Visual Studio 2010) 中显示以前的状态后重新启动(比如点击“继续”/ F5) 从那里。
这对于调试生成异常的 lambda 表达式特别有用,因为无法移出。
对于真正的 OO 代码时间机器,所有对象的历史状态都需要存储在内存中,所以我怀疑现阶段是否可行。现在,如果所有对象的状态没有太大变化,那么我们可以保持当前状态并及时跳回(作为使用“编辑并继续”执行相同操作的快捷方式)。
有时,您可以右键单击堆栈帧并选择“展开到此处”(或非常相似的措辞)。这并不总是可能的,我不确定必要的条件是什么,但我会猜测什么可能会阻止它:
基本上,任何“不寻常”的东西。
除此之外,如果它有效,那么你去!
这有点笨拙,但是:
在调用堆栈窗口中查看之前的状态时,打开反汇编窗口(调试 | Windows | 反汇编或 CTRL+ALT+D)。现在您应该能够创建一个断点,当您返回该位置时将停止执行。
如果您不关心执行什么其他操作,请按 F5 并让代码运行回您的新断点。
现在右键单击要重新启动的语句,然后选择设置下一个语句。按 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 建议可能是更好的选择。