Visual Studio 2010卡在跟踪点上。

9
问题:
每当我尝试在调试器中设置一个断点或跟踪点时,我们的应用程序和 Visual Studio 完全冻结。在分离调试器后,应用程序会继续运行。
这个问题可能与 WPF 相关。我们已经将我们的 WinForm 应用程序迁移到了 WPF。自那时以来,就出现了这个问题。但是我找不到导致问题的具体代码部分。我已经回退了数百个提交,但没有成功。
它可能也与 UI 线程有关。如果断点设置在远离 UI 逻辑的某个地方,应用程序将不会冻结,或者它在 UI 线程的某个地方冻结的频率不如其他地方那么高。
[编辑:]
我使用 Windows 7. 64位,安装了 Visual Studio 2010。
[更新:]
当 Visual Studio 挂起并且在显示断点之前尝试分离时,会显示消息 "无法从一个或多个进程分离。所有未完成的 func-evals 都尚未完成"。但是我已在调试选项中禁用了所有 func evaluation。 我认为我的问题是由于一个无法完成或超时的 func_evaluation 导致的。
有没有办法看到 Visual Studio 停在哪个 func_evaluation 上? 示例:
class SomeUiViewPresenterExample
{
   private Timer m_Timer;

public void Init()
{
    m_Timer = new Timer();
    m_Timer.Elapsed += ElapsedFoo();
    m_Timer.AutoReset = false;
    m_Timer.Interval = 200;
}

private void ElapsedFoo(object sender, ElapsedEventArgs elapsedEventArgs)
{
    // there is no code inside this method
    // On the next line a trace point with "---> ElapsedFoo called" will freeze the debugger
}

我已经尝试过的方法(失败了):

  • 启用/禁用主机进程
  • 尝试调试 x86 和 x64 进程
  • 使用 /SafeMode 启动 Visual Studio
  • NGEN 更新
  • 在调试选项中禁用“属性评估和其他隐式函数调用”
  • 禁用符号服务器
  • 禁用符号加载
  • 删除 WPF 字体缓存
  • 使用 'DebuggerDisplay("some text without expression")' 标记多个 UI 元素

(Microsoft Connect 票务记录)

可能存在的相关问题:

因为我们的应用程序使用 .NET Remoting 与另一个进程通信,我的问题可能类似于这里。我已经将所有注册到远程事件的操作放入了一个单独的任务中,但是没有成功。

来自被调试 Visual Studio 的调试器输出:

我已经附加了一个调试器到 Visual Studio,并观察到了一些异常,(80010005)

但我不知道它们是否与我的问题相关:

(18d8.1708): C++ EH exception - code e06d7363 (first chance)
(18d8.1708): C++ EH exception - code e06d7363 (first chance)
..... // snip
(18d8.18dc): **Unknown exception - code 80010005 (first chance)
..... // 20 seconds freeze until breakpoint hit in IDE

(18d8.18dc): Unknown exception - code 80010005 (first chance)
(18d8.18dc): C++ EH exception - code e06d7363 (first chance)
ModLoad: 365f0000 36665000 C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Packages\Debugger\mcee.dll

// after continue execution debugger and debugged process freezes forever

(18d8.18dc): Unknown exception - code 80010005 (first chance)
ModLoad: 00000000`02b90000 00000000`02c1c000 C:\Windows\SysWOW64\UIAutomationCore.dll
(18d8.1a8c): CLR exception - code e0434352 (first chance)
(18d8.1a8c): CLR exception - code e0434352 (first chance)
(18d8.1a8c): CLR exception - code e0434352 (first chance)
(18d8.1a8c): CLR exception - code e0434352 (first chance)
(18d8.1a8c): CLR exception - code e0434352 (first chance)
(18d8.1a8c): CLR exception - code e0434352 (first chance)
(18d8.1a8c): CLR exception - code e0434352 (first chance)
(18d8.1a8c): CLR exception - code e0434352 (first chance)

只是一个小建议。如果你正在使用WPF,请使用System.Windows.Threading.DispatcherTimer(WPF计时器),而不是一般的C#计时器。虽然我不知道这是否能解决你的问题。 - sircodesalot
谢谢您的提示。但在这种情况下,操作不应该在UI线程上执行。这个操作应该在一个单独的线程上运行,因为它只更新数据上下文(需要一段时间)并触发属性更改事件。 - Manuel Amstutz
哪个版本的Visual Studio? - ΩmegaMan
VisualStudio 2010 Win7 64位 - Manuel Amstutz
3个回答

1
感谢您的提示。最终我安装了VS 2012,现在调试器的表现正常了。看起来在Visual Studio 2010调试器中确实存在一个bug/性能问题。

1
越看越觉得问题可能是因为你没有使用WPF计时器。如果你尝试使用常规的Timer类而不是WPF Dispatcher计时器,则有可能在非UI线程上尝试更新UI,这可能是你的问题的原因(因为DataContext在技术上是UI的一部分)。更多信息请参见:WPF应用程序中的DispatcherTimer与常规计时器进行任务调度

不,我认为在非 UI 线程更新数据上下文是正确的。 - Manuel Amstutz
没错,但是当你写 if (null != DataContext) 时,看起来你实际上是在访问 view.DataContext 属性,而不仅仅是 datacontext 本身。尝试将该行代码删除并查看结果。 - sircodesalot
或者尝试仅使用DispatcherTimer,看看是否可以解决问题。您的代码几乎可以保持不变,只需将计时器的名称更改为System.Windows.Threading.DispatcherTimer。如果这最终成为情况,那么您仍然可以在另一个线程上执行代码,只需在想要对UI对象进行最终更改时使用“Invoke”(即将执行移回到主线程)。 - sircodesalot
我已经尝试使用调度计时器,但不幸的是没有成功。调试器仍然会冻结。我还注释掉了定时器处理程序中的所有代码。只有一个跟踪点,它只打印一些文本,但 Visual Studio 仍然会冻结。 - Manuel Amstutz

1

谢谢,但上面的输出已经被Windbg捕获了。但是我看不到任何对我有意义的东西。 - Manuel Amstutz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接