我认为我理解了这是什么意思。然而,令我困惑的是,之后我点击步骤按钮后,代码就不再是“优化”的状态,我也可以查看我的变量。这是如何发生的?代码如何在“优化”和“非优化”之间切换?Cannot evaluate expression because the code of the current method is optimized.
我认为我理解了这是什么意思。然而,令我困惑的是,之后我点击步骤按钮后,代码就不再是“优化”的状态,我也可以查看我的变量。这是如何发生的?代码如何在“优化”和“非优化”之间切换?Cannot evaluate expression because the code of the current method is optimized.
当Debug.Break()代码行位于调用堆栈的顶部时,您无法进行表达式求值。这是因为该行已经被优化了。按F10键移动到下一行 - 一个有效的代码行 - 然后监视器就能起作用了。
调试器使用FuncEval来允许您“查看”变量。FuncEval要求在GarbageCollector安全点上停止托管代码的线程。在IDE中手动“暂停”运行会尽快停止所有线程。高度递归的代码往往会停留在不安全的点上。因此,调试器无法评估表达式。
按F10将移动到下一个Funceval Safe点,并启用函数评估。
有关更多信息,请查阅FuncEval规则。
这让我很疯狂。我尝试使用托管和本地代码进行附加 - 无法进行。
对我来说,这很有效,我终于能够评估所有表达式:
优化代码
属性来解决这个问题。
项目(右键单击)=> 属性 => 构建(选项卡) => 取消勾选优化代码
确保您没有这样的东西
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
AssemblyInfo
文件中。最有可能的问题是,由于你的方法签名太大,导致调用栈被优化。
我曾经遇到过同样的问题,但是通过关闭调试器中的异常捕获功能来解决了它。点击[调试][异常]并将异常设置为“用户未处理”。
通常情况下我会关闭这个功能,但有时候也很方便。只需要记得在完成后关闭即可。