什么"无法评估表达式,因为当前方法的代码已经过优化." 意思?

Est*_*aya 46 .net c# compiler-construction debugging optimization

我写了一些带有大量递归的代码,需要花费很多时间才能完成.每当我"暂停"运行以查看我得到的结果:

无法计算表达式,因为当前方法的代码已经过优化.

我想我明白这意味着什么.然而,让我感到困惑的是,在我点击步骤之后,代码不再"优化"了,我可以查看我的变量.这是怎么发生的?代码如何在优化代码和非优化代码之间来回切换?

No *_*one 44

虽然Debug.Break()行位于callstack之上,但您无法eval表达式.那是因为该线路已经过优化.按F10移动到下一行 - 一行有效的代码 - 手表将起作用.

  • 我的前两句话也回答了这一部分. (7认同)
  • 这就是答案.希望它最终会被标记为这样. (2认同)
  • 问题是"这是什么意思"而不是我如何解决这个问题. (2认同)

Lam*_*mar 27

您可能尝试在发布模式而不是调试模式下调试应用程序,或者在编译设置中打开了优化.

当使用优化编译代码时,某些变量一旦在函数中不再使用就会被丢弃,这就是您获取该消息的原因.在禁用优化的调试模式下,您不应该收到该错误.

  • 正确,没有优化. (5认同)

Nes*_*cio 27

调试器使用FuncEval来"查看"变量.FuncEval要求在GarbageCollector安全点的托管代码中停止线程.手动"暂停"IDE中的运行会导致所有线程尽快停止.您的高递归代码将倾向于停在不安全的位置.因此,调试器无法计算表达式.

按F10将移至下一个Funceval Safe点并启用功能评估.

有关详细信息,请查看FuncEval规则.

  • 这不是答案.请不要只链接(特别是对于没有明确回答问题的大块信息). (11认同)
  • 我自己也想知道这个问题,总结一下你的答案中博客文章的重点是很好的. (6认同)
  • 这似乎仍然是公认的答案,所以我更新了我的答案. (4认同)

Ral*_*177 7

这让我发疯了.我尝试使用Managed和Native代码附加 - 没有去.

这对我有用,我终于能够评估所有表达式:

  • 进入项目/属性
  • 选择Build选项卡,然后单击Advanced ...
  • 确保Debug Info设置为"full"(不是pdb-only)
  • 调试你的项目 - 瞧!


小智 7

以下对我有用,谢谢@Vin.

我在使用VS 2015时遇到了这个问题.我的解决方案:配置已选中(Debug).我通过取消选中Optimize Code项目属性下的属性来解决这个问题.

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