我在Visual Studio 2010 beta 2中调试应用程序时突然出现以下错误。
“无法评估表达式,因为a 线程停在哪里 垃圾收集是不可能的, 可能是因为代码是 优化的“
观察窗口中的几乎每个属性或字段都显示此消息。有谁知道发生了什么?以及如何摆脱它?
项目属性构建选项卡上的“优化代码”复选框已关闭。
答案 0 :(得分:6)
以下是关于此问题的讨论的link。显然,当函数参数是结构体时,堆栈上调用函数所需的总内存超过了一些神奇的数字视觉工作室调试器。
<强>引用强>
我认为所有对象中“引用”的总和大小 struct和方法上的附加参数大于256 字节。
我在这个问题上得到了MS的回复:
“......一般来说,当参数的总大小传递给一个 被调用函数大于256字节,JIT将使调用函数成为可能 部分可中断。在部分可中断的代码中,并非每一个 代码中的位置是GC安全点。因此,它可能是不安全的 评估某些地点的表达。当发生这种情况时,你会得到[ 错误信息]。“
所以看起来即使是字段都是引用,所有它们的总和 超出了调试器的256字节限制。
我也有来自OpenTK框架讨论的link。
<强>引用强>
我做了一些挖掘,看起来问题源于数学数据结构(如Matrix或Vector)类型为“struct”的事实。 C#对值类型有一个限制,即当作为参数传递给函数时,它们不应超过256字节的数据, 除非通过引用传递。不符合要求会在调试模式下产生不间断的代码。 如果将上述数据结构从结构转换为类,则应解决该问题。
答案 1 :(得分:0)
几天后,我发现错误消失了......不知道是什么导致或解决了它......
答案 2 :(得分:0)
当我从第三方控件中点击NullReferenceException时,我也得到了这个。
在这种情况下,我发现如果我在之前设置了一个断点,我就会遇到异常,然后我就可以单步执行剩下的代码而不会看到问题。
不知道为什么,但这对我有用 - 至少在这种情况下。
另外,正如@ ja72所提到的那样,我没有对结构做任何事情。因此,似乎在其他情况下也会出现此错误。