【问题标题】:C# Visual Studio Debugger UI behavior with lock带锁的 C# Visual Studio 调试器 UI 行为
【发布时间】:2011-12-06 22:19:59
【问题描述】:

我在锁里有一段代码:

lock (obj)
{
  //...
}

我还有一个属性可以锁定同一个对象。很简单的场景。我的问题是,如果我在锁定的代码块中放置一个断点,然后在 Visual Studio 调试器中检查该属性,会发生什么情况?调试器是否会死锁,直到我在断点后继续执行(或终止 Visual Studio/调试)?还是调试器根本不会显示该属性的任何数据(从 UI 获取后台线程中的数据?)

我问的原因是我有一个专门(且仅)用于调试目的的属性;当这种情况发生时,我可以偶尔不显示数据,但是调试器(和 Visual Studio)多次因错误的调试器属性而崩溃,我宁愿避免在某些时候妨碍我的调试工作的代码我想要帮助的开始!

我计划在我有更多时间的时候进行测试,但希望能从可能更了解的人那里得到更快的答案。

【问题讨论】:

  • 我发誓你可以用你写问题的一小部分时间来测试这个。
  • 我不会担心调试器崩溃——这是 Visual Studio 团队需要担心的。我会更担心我的多线程同步点是否有效。您应该花时间编写多线程单元测试。
  • @Charles 我承认,在输入问题后,问题变得比我最初在脑海中想象的要简单得多,但在那时,设置测试比扔掉投入的工作更重要发布并希望快速回答​​:P
  • 答案是否定的,它不会死锁。我不知道调试器是如何工作的,但我猜调试器被运行时(或操作系统)视为一种特殊情况,并且不受这些锁的影响。也许调试器被看作是它正在调试的同一个线程(线程不能阻塞自己)。

标签: c# visual-studio-2010 debugging


【解决方案1】:

是的,调试器在进程内运行的单独工作线程上执行监视表达式。这将在您的属性 getter 中击中 lock 并阻止。调试器忍受了 5 秒,然后声明 watch 表达式不可用并显示“函数评估超时”。

然后调试器变得脾气暴躁,它对阻塞的线程无能为力,您通常会看到“函数评估被禁用,因为之前的函数评估超时。您必须继续执行才能重新启用函数评估。”这是个好建议。

【讨论】:

  • 谢谢,这听起来正是我所希望的。
【解决方案2】:

即使在lock() 块内,调试器也不会显示对象的属性。

Lock() 对象实际上并不会阻止对该对象的任何访问——它只是创建一个信号量,该信号量将阻止任何其他 代码尝试锁定同一对象,直到锁定被释放。

【讨论】:

  • 我认为 OP 的意思是该属性的 get{} 方法也锁定了该对象,问题是如果设计者使用属性 getter 向您显示属性值,将尝试获取值时被阻止。
【解决方案3】:

我的经验是 VS.NET 调试器时不时会死机,但它必须有一些死锁检测和调试优化以避免这些类型的问题。

【讨论】:

    猜你喜欢
    • 2019-10-31
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多