【问题标题】:Call stack time machine in Visual Studio 2010Visual Studio 2010 中的调用堆栈时间机器
【发布时间】:2011-09-16 20:08:54
【问题描述】:

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

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

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

【问题讨论】:

标签: c# visual-studio-2010 stack timemachine


【解决方案1】:

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

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

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

除此之外,如果它有效,那就去吧!

【讨论】:

  • 确实,我可以看到“展开到这个框架”,但它是灰色的。很高兴知道,对于没有什么“不寻常”的罕见情况(不幸的是,lambda 表达式确实很可能为此目的不寻常)。
【解决方案2】:

这有点笨拙,但是:

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

如果您不关心执行什么其他操作,请按 F5 并让代码运行回您的新断点。

现在右键单击要从其重新启动的语句,然后选择设置下一个语句。按 F5 从那里重新启动。

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

注意various dire warnings about using Set Next Statement

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

【讨论】:

  • 有趣,但我找不到反汇编窗口(并且 CTRL+ALT+D 什么也不做)。我用的是VS2010。我错过了什么吗?
  • 您必须在调试器中运行一个程序,然后反汇编项才会出现在 Debug |窗口菜单。
猜你喜欢
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2010-11-09
  • 2010-12-16
  • 2015-10-03
相关资源
最近更新 更多