eej*_*i42 2 .net c# frameworks windows-7
我的情况很奇怪。我们有一个相对较大的应用程序(约 50 万行代码),由超过 10 名不同的开发人员在过去 6 年中开发。在我们发布最新版本之前,它一直运行良好。在最新版本中,我们有多个客户抱怨它偶尔挂起,我们花了很长时间才弄清楚如何/为什么!以下是一些使调试变得困难的因素:
今天早上,我们终于弄清楚了如何通过以下方式在内部重现至少一个场景: - 在调试器之外运行该应用程序 - 更改屏幕分辨率。这会挂起应用程序。- 然后我们可以附加调试器。
但问题是(现在我们至少在一种情况下可以重现它)是我们的代码在挂起时没有运行!换句话说,挂起时只有一个线程在运行,它中断的行是 Application.Run(form); 来自program.cs。
最后一点是应用程序并未完全挂起。具体来说: - 它仍然进行屏幕绘制(例如刷新其他应用程序覆盖的屏幕部分) - 我无法单击显示的 UI 元素,但它也不会像我期望的那样对我“发出蜂鸣声”如果它完全没有响应 - 当我在附加调试器后“暂停”应用程序时,我可以在暂停时最小化/最大化它。否则,它不会响应最小化/最大化命令。- 除了不对我发出蜂鸣声外,它的行为就像屏幕外有一个我看不到的模态窗口。另外(如前所述),当我暂停应用程序时,它会在 Application.Run 行上暂停,并且线程列表中没有其他线程/代码正在运行(正如我希望查看是否有模式对话框阻塞)主窗口。
恕我直言,这种行为是最奇怪的——尤其是因为它最近才开始发生。我的下一步必须开始“减去”代码部分,直到找到罪魁祸首,但我想我应该先把问题扔在这里,看看其他人是否曾经经历过类似的事情。
预先感谢您的任何指导 - 我期待听到任何建议。
埃杰
编辑:陈述行为的另一种方式。当它“挂起”后,它的行为就好像没有问题一样,只是它没有收到来自我的鼠标和键盘的消息。换句话说,它仍然会重新绘制自身,并且可以被 VS2010 调试器暂停,但不会以任何方式响应鼠标/键盘事件。但在这里,它并没有像其他真正死掉的应用程序那样开始对我发出蜂鸣声。就像,它不会在任务管理器中显示为无响应。这只是一种奇怪的“我不再监听 I/O 了,抱歉!” 状态……奇怪!
编辑:
在我的上一次编辑中,我提到它不再接受 IO。这让我开始思考,我添加了一个 TcpListener 来看看它在“挂起”后是否仍然会响应 - 确实如此。此外,考虑到它仍然会更新屏幕这一事实,我在绘制事件中放置了一个断点,并得到了一些(更多)奇怪的行为。它命中了绘制事件中的断点,但此时不在调用堆栈的顶部。调用堆栈的顶部显示“处于睡眠状态,等待或加入”。接下来是 Paint 中的行,然后是外部代码,然后是 main。所以屏幕上突出显示的线是绿色的,而不是黄色的。此外,如果我 F10(跳过),它会确实向下移动 1 行,但 pain 方法仍然不在调用堆栈的顶部。此时,没有其他线程在运行,没有其他代码在执行,没有其他事情发生?!?!这里发生了什么?
最后一点 - 我在 TcpListener 的 Accept Socket 事件中设置了一个断点,当我连接到 TCP/IP 端口时,它会在该代码上中断,并且该代码位于调用堆栈的顶部。
抱歉 - 但我还是很困惑。
| 归档时间: |
|
| 查看次数: |
4550 次 |
| 最近记录: |