【问题标题】:"Cannot evaluate expression..." error“无法评估表达式...”错误
【发布时间】:2009-12-25 12:50:40
【问题描述】:

在 Visual Studio 2010 beta 2 中调试应用程序时突然出现以下错误。

"无法计算表达式,因为 线程在某个点停止 垃圾收集是不可能的, 可能是因为代码是 优化”

监视窗口中的几乎每个属性或字段都会显示此消息。有谁知道发生了什么?以及如何摆脱它?

项目属性构建选项卡上的“优化代码”复选框已关闭。

【问题讨论】:

  • 我也遇到了同样的问题

标签: visual-studio-2010


【解决方案1】:

这里有一个link 来讨论这个问题。显然,当函数参数是结构时,堆栈上调用函数所需的总内存超过了一些神奇的数字,Visual Studio 调试器呕吐。

引用

我认为“引用”中所有对象的总大小 struct 和方法上的附加参数大于 256 字节。

我收到了 MS 关于这个问题的回复:

"...一般来说,当参数的总大小传递给 被调用函数大于 256 字节,JIT 将使调用函数 部分可中断。在部分可中断的代码中,不是每个 代码中的位置是 GC 安全点。因此,可能不安全 评估特定位置的表达式。发生这种情况时,您会得到 [the 错误信息]。”

所以看起来即使这些字段是引用,所有它们的总和 超出了调试器的 256 字节限制

我也有这个来自 OpenTK 框架讨论的link

引用

我做了一些挖掘,似乎问题出在这样一个事实,即矩阵或向量等数学数据结构属于“结构”类型。 C# 对值类型有一个限制,即当作为参数传递给函数时,它们不应超过 256 字节的数据, 除非它们通过引用传递。不遵守该规定会在调试模式下产生不间断的代码。 如果将上述数据结构从结构转换为类,应该可以解决问题。

【讨论】:

  • +1 这是正确的答案。将 ByVal 更改为 ByRef 解决了该问题。
  • 答案是正确的。计算结构体的大小。很可能超过 256 个字节。在我遇到的情况下,我在结构中使用了很多十进制属性,它们的总和超过了 256 字节的限制。从 decimal 到 int 的重构就是使事情正常运行所需要的全部内容。
【解决方案2】:

几天后我发现错误消失了……不知道是什么原因导致或解决了它……

【讨论】:

    【解决方案3】:

    当我从 3rd 方控件中遇到 NullReferenceException 时,我也遇到了这个问题。

    在这种情况下,我发现如果我在遇到异常之前设置断点,然后我可以单步执行其余代码而不会发现问题。

    不知道为什么,但这对我有用 - 至少在这种情况下。

    另外,正如@ja72 所提到的,我没有对结构做任何事情。所以看起来这个错误也可能在其他情况下发生。

    【讨论】:

      猜你喜欢
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多