“Cannot evaluate expression because the code of the current method is optimized.”的意思是什么?

51
我写了一些递归代码,执行时间相当长。每当我“暂停”运行以查看发生了什么时,会出现以下提示:

Cannot evaluate expression because the code of the current method is optimized.

我认为我理解了这是什么意思。然而,令我困惑的是,之后我点击步骤按钮后,代码就不再是“优化”的状态,我也可以查看我的变量。这是如何发生的?代码如何在“优化”和“非优化”之间切换?

你找到解决这个问题的方法了吗? - Jader Dias
2
我不认为所选答案有帮助。如果有机会,请查看“无人”几个月后留下的答案。这样做将有助于那些试图解决您最初问题的人。 - Catskul
3
我在发布模式下进行调试(害羞)。Lamar的回答让我检查了一下。 - tymtam
15个回答

46

当Debug.Break()代码行位于调用堆栈的顶部时,您无法进行表达式求值。这是因为该行已经被优化了。按F10键移动到下一行 - 一个有效的代码行 - 然后监视器就能起作用了。


2
这就是答案。希望它最终会被标记为正确答案。 - Catskul
2
问题是“这是什么意思”,而不是我该如何修复它。 - David Silva Smith
7
我的前两句话已经回答了这部分。 - No one

31

调试器使用FuncEval来允许您“查看”变量。FuncEval要求在GarbageCollector安全点上停止托管代码的线程。在IDE中手动“暂停”运行会尽快停止所有线程。高度递归的代码往往会停留在不安全的点上。因此,调试器无法评估表达式。

按F10将移动到下一个Funceval Safe点,并启用函数评估。

有关更多信息,请查阅FuncEval规则


6
我会尽力做到最好。以下是需要翻译的内容:我自己也曾经想过这个问题,如果你在回答中总结博客文章的要点那就太好了。 - Joe
这个链接非常有趣。 - Lamar
这篇博客是指出了解决方案还是只是解释了问题? - Jader Dias
11
这不是一个答案,请不要仅仅提供链接(尤其是那些不能清晰回答问题的大段信息)。 - Catskul
4
似乎这仍然是被接受的答案,所以我已经更新了我的回答。 - Nescio

28
你可能正在尝试在发布模式下调试应用程序,而不是调试模式,或者你已经在编译设置中打开了优化功能。当使用优化编译代码时,某些变量在函数中不再被使用后将被抛弃,这就是你收到该错误消息的原因。在禁用优化的调试模式下,你不应该会遇到这个错误。

1
不,我不是在尝试调试以发布模式构建的应用程序。 - Esteban Araya
或者您在编译设置中开启了优化?<- 但这不是情况吗? - Biri
5
可以,不做任何优化。 - Esteban Araya
除了你的回答之外,其他人的回答都没什么帮助! - Saveen

8

这让我很疯狂。我尝试使用托管和本地代码进行附加 - 无法进行。

对我来说,这很有效,我终于能够评估所有表达式:

  • 进入项目 / 属性
  • 选择生成选项卡并单击高级...
  • 确保调试信息设置为“完整”(而不是仅限pdb)
  • 调试您的项目 - voila!

7
以下内容对我有用,感谢@Vin。
当我使用VS 2015时,遇到了这个问题。我的解决方案是:配置中选择了(Debug)。我通过在项目属性下取消勾选优化代码属性来解决这个问题。

项目(右键单击)=> 属性 => 构建(选项卡) => 取消勾选优化代码


3

确保您没有这样的东西

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

在你的AssemblyInfo文件中。

2
寻找一个参数较多的函数调用,尝试减少参数数量直到调试返回。

1
我在使用VS 2010时遇到了这个问题。我的解决方案配置已选择(Debug)。我通过在项目属性下取消选中优化代码属性来解决了这个问题。 项目(右键单击)=> 属性 => 构建(选项卡)=> 取消选中优化代码。

1

1

我曾经遇到过同样的问题,但是通过关闭调试器中的异常捕获功能来解决了它。点击[调试][异常]并将异常设置为“用户未处理”。

通常情况下我会关闭这个功能,但有时候也很方便。只需要记得在完成后关闭即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接