【发布时间】:2009-12-25 12:50:40
【问题描述】:
在 Visual Studio 2010 beta 2 中调试应用程序时突然出现以下错误。
"无法计算表达式,因为 线程在某个点停止 垃圾收集是不可能的, 可能是因为代码是 优化”
监视窗口中的几乎每个属性或字段都会显示此消息。有谁知道发生了什么?以及如何摆脱它?
项目属性构建选项卡上的“优化代码”复选框已关闭。
【问题讨论】:
-
我也遇到了同样的问题
在 Visual Studio 2010 beta 2 中调试应用程序时突然出现以下错误。
"无法计算表达式,因为 线程在某个点停止 垃圾收集是不可能的, 可能是因为代码是 优化”
监视窗口中的几乎每个属性或字段都会显示此消息。有谁知道发生了什么?以及如何摆脱它?
项目属性构建选项卡上的“优化代码”复选框已关闭。
【问题讨论】:
这里有一个link 来讨论这个问题。显然,当函数参数是结构时,堆栈上调用函数所需的总内存超过了一些神奇的数字,Visual Studio 调试器呕吐。
引用
我认为“引用”中所有对象的总大小 struct 和方法上的附加参数大于 256 字节。
我收到了 MS 关于这个问题的回复:
"...一般来说,当参数的总大小传递给 被调用函数大于 256 字节,JIT 将使调用函数 部分可中断。在部分可中断的代码中,不是每个 代码中的位置是 GC 安全点。因此,可能不安全 评估特定位置的表达式。发生这种情况时,您会得到 [the 错误信息]。”
所以看起来即使这些字段是引用,所有它们的总和 超出了调试器的 256 字节限制。
我也有这个来自 OpenTK 框架讨论的link。
引用
我做了一些挖掘,似乎问题出在这样一个事实,即矩阵或向量等数学数据结构属于“结构”类型。 C# 对值类型有一个限制,即当作为参数传递给函数时,它们不应超过 256 字节的数据, 除非它们通过引用传递。不遵守该规定会在调试模式下产生不间断的代码。 如果将上述数据结构从结构转换为类,应该可以解决问题。
【讨论】:
ByVal 更改为 ByRef 解决了该问题。
几天后我发现错误消失了……不知道是什么原因导致或解决了它……
【讨论】:
当我从 3rd 方控件中遇到 NullReferenceException 时,我也遇到了这个问题。
在这种情况下,我发现如果我在遇到异常之前设置断点,然后我可以单步执行其余代码而不会发现问题。
不知道为什么,但这对我有用 - 至少在这种情况下。
另外,正如@ja72 所提到的,我没有对结构做任何事情。所以看起来这个错误也可能在其他情况下发生。
【讨论】: