1

我有一个非常奇怪的情况。我们有一个相对较大的应用程序(约 50 万行代码),由超过 10 位不同的开发人员在过去 6 年中开发。在我们最近发布之前,它一直运行良好。使用最新版本,我们有多个客户抱怨它偶尔会挂起,我们正在花时间弄清楚如何/为什么!以下是一些使调试变得困难的事情:

  • 直到今天早上,我们完全无法在内部重现这个问题。
  • 当附加调试器时,我们从未见过这种情况发生!这显然使得解决起来具有挑战性。
  • 这往往不会在人们使用该应用程序时发生,而是在他们停止使用一段时间后发生。
  • 这(也许)与屏幕保护程序有关吗?
  • 更改屏幕分辨率时似乎有些一致

今天早上,我们终于弄清楚了如何在内部重现至少一个场景: - 在调试器之外运行该应用程序 - 更改屏幕分辨率。这会挂起应用程序。- 然后我们可以附加调试器。

但问题是(现在我们至少可以在一种情况下重现它)是我们的代码在挂起时没有运行!换句话说,挂起的时候只有一个线程在运行,它中断的那一行是Application.Run(form); 来自program.cs。

最后一点是应用程序没有完全挂起。具体来说: - 它仍然会进行屏幕绘制(例如刷新被其他应用程序覆盖的部分屏幕) - 我无法点击显示的 UI 元素,但它也不会像我期望的那样对我“哔哔”如果它完全没有响应 - 当我在附加调试器后“暂停”应用程序时,我可以在暂停时最小化/最大化它。否则,它不会响应最小化/最大化命令。- 除了没有对我发出哔哔声之外,它的行为就像我无法看到的屏幕外模式窗口一样。另外(如前所述),当我暂停应用程序时,它会在 Application.Run 行上暂停,一个模态对话框阻塞主窗口。

这种行为是最奇怪的恕我直言 - 特别是因为它最近才开始发生。我的下一步必须是开始“减去”代码部分,直到找到罪魁祸首,但我想我会先把问题抛到这里,看看有没有其他人曾经经历过这样的事情。

提前感谢您的任何指导 - 我期待听到任何建议。

ej

编辑:另一种表述行为的方式。在它“挂起”之后,它的行为就好像没有问题一样,除了它没有从我的鼠标和键盘接收到任何消息。换句话说,它仍然会重新绘制自己,并且可以由 VS2010 调试器暂停,但不会以任何方式响应鼠标/键盘事件。不过,在这里,它并没有像其他真正死掉的应用程序那样开始向我发出哔哔声。就像,它不会任务管理器中显示为无响应。这只是一种奇怪的“我不再听 I/O,对不起!” 状态...奇怪!

编辑:

在我上次的编辑中,我提到它不再接受 IO。这让我这么想,我添加了一个 TcpListener 来查看它在“挂起”后是否仍会响应 - 它确实如此。此外,考虑到它仍然会更新屏幕这一事实,我在绘制事件中放置了一个断点并得到了一些(更多)奇怪的行为。它在绘制事件中命中断点,但此时不在调用堆栈的顶部。调用堆栈的顶部显示“处于睡眠状态,等待或加入”。接下来是paint中的行,然后是外部代码,然后是main。所以屏幕上突出显示的行是绿色的 - 不是黄色的。此外,如果我按 F10(跳过),它确实会向下移动 1 行,但疼痛方法仍然不在调用堆栈的顶部。此时,没有其他线程在运行,没有其他代码在执行,没有其他事情发生?!?!这里发生了什么?

最后一点 - 我在 TcpListener 的 Accept Socket 事件中设置了一个断点,当我连接到 TCP/IP 端口时,它会中断该代码,并且该代码位于调用堆栈的顶部。

对不起 - 但我还是很困惑。

4

1 回答 1

4

您可能对在非 UI 线程上创建的控件(或其句柄)有问题,请查看此问题

于 2012-07-24T16:19:34.970 回答