我写了一些带有大量递归的代码,需要花费很多时间才能完成.每当我"暂停"运行以查看我得到的结果:
无法计算表达式,因为当前方法的代码已经过优化.
我想我明白这意味着什么.然而,让我感到困惑的是,在我点击步骤之后,代码不再"优化"了,我可以查看我的变量.这是怎么发生的?代码如何在优化代码和非优化代码之间来回切换?
虽然Debug.Break()行位于callstack之上,但您无法eval表达式.那是因为该线路已经过优化.按F10移动到下一行 - 一行有效的代码 - 手表将起作用.
您可能尝试在发布模式而不是调试模式下调试应用程序,或者在编译设置中打开了优化.
当使用优化编译代码时,某些变量一旦在函数中不再使用就会被丢弃,这就是您获取该消息的原因.在禁用优化的调试模式下,您不应该收到该错误.
调试器使用FuncEval来"查看"变量.FuncEval要求在GarbageCollector安全点的托管代码中停止线程.手动"暂停"IDE中的运行会导致所有线程尽快停止.您的高递归代码将倾向于停在不安全的位置.因此,调试器无法计算表达式.
按F10将移至下一个Funceval Safe点并启用功能评估.
有关详细信息,请查看FuncEval的规则.
这让我发疯了.我尝试使用Managed和Native代码附加 - 没有去.
这对我有用,我终于能够评估所有表达式:
进入项目/属性
选择Build选项卡,然后单击Advanced ...
确保Debug Info设置为"full"(不是pdb-only)
调试你的项目 - 瞧!
以下对我有用,谢谢@Vin.
我在使用VS 2015时遇到了这个问题.我的解决方案:配置已选中(Debug).我通过取消选中Optimize Code
项目属性下的属性来解决这个问题.
项目(右键单击)=>属性=>构建(选项卡)=>取消选中优化代码