1

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

这对于调试生成异常的 lambda 表达式特别有用,因为无法移出。

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

4

2 回答 2

3

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

  • 中间调用栈上的原生代码帧
  • 在 StackOverflowException 处停止(显然,无论如何都会导致进程死亡)
  • 也许是 lambda 表达式或其他阻止 Edit-and-Continue 工作的东西(?)

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

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

于 2011-06-17T01:01:45.467 回答
0

这有点笨拙,但是:

在调用堆栈窗口中查看之前的状态时,打开反汇编窗口(调试 | 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 建议可能是更好的选择。

于 2011-06-17T01:22:34.333 回答