3

我正在使用VS2012 Ultimate调试一个项目,但现在经常遇到这个问题。通常它发生在我想扩展集合类型值(例如,List<>、Dictionary<> 等)以查看其值时。它只是未能显示该值,然后永远挂起,错误消息就像“函数评估已禁用,因为先前的函数评估超时。您必须继续执行才能重新启用函数评估。” 我唯一能做的就是重新启动调试器。有人可以帮忙吗?

4

1 回答 1

4

当您在调试器中展开一个值以查看其成员时,调试器会在幕后执行称为“func-eval”的操作,这基本上意味着它“唤醒”被调试对象中的一个线程并在其中运行一些代码为了显示它的结果。这通常是执行属性的 getter 或对象的 .ToString() 方法。

有时,评估可能需要太长时间(通常是因为属性 getter 卡在等待另一个线程持有的某个锁上,在这种情况下,您可以一直等待并且它永远不会返回,因为除了线程之外的所有线程执行 func-eval 被调试器暂停)。在这些情况下,过一会儿调试器将决定“放弃”并显示您遇到的消息。您不必重新启动应用程序即可再次尝试评估属性 - 您只需执行另一个 Step Over (F10)。

作为更持久的解决方案,您可以执行以下两项操作之一:

  1. 进入工具->选项->调试->常规并禁用“启用属性评估和其他隐式函数调用”。这将使调试器的显示变得不那么有用,因为您只能查看字段,但它保证您永远不会卡住并收到超时消息。
  2. 尝试找出哪个对象中的哪个属性是保持超时的属性。这可能有点棘手,通过尝试在发生这种情况时注意您正在查看的对象 - 超时通常会在您向下滚动到有问题的属性后发生。一旦你知道哪个属性有问题,要么把它改成一个方法,要么放在[DebuggerBrowsable(DebuggerBrowsableState.Never)]它上面以防止调试器显示它。
于 2013-08-09T22:17:18.833 回答