我有一个非常奇怪的情况。我们有一个相对较大的应用程序(约500K行代码),在过去的6年中由超过10个不同的开发人员开发。它一直工作正常,直到我们最近发布。随着最新的构建,我们有多个客户抱怨它偶尔挂起,我们有一点时间弄清楚如何/为什么!以下是一些使调试具有挑战性的事情:
今天早上我们终于找到了如何通过以下方式重现至少一个场景: - 在调试器外运行该应用程序 - 更改屏幕分辨率。这会挂起应用程序。 - 然后我们可以附加调试器。
问题虽然(现在我们可以,至少在一种情况下,重现它)是我们的代码挂起时没有运行!换句话说,它挂起时只有一个线程在运行,而它所依赖的线是Application.Run(form);来自program.cs。
最后一点是应用程序不是完全挂起。特别: - 它仍然可以进行屏幕绘画(例如刷新其他应用程序覆盖的部分屏幕) - 我无法点击显示的UI元素,但它也不会像我预期的那样“哔”一声,如果它完全没有响应 - 当我在连接调试器后“暂停”应用程序时,我可以在暂停时最小化/最大化它。否则,它将不响应最小化/最大化命令。 - 除了不向我发出哔哔声之外,它表现得好像屏幕上有一个我看不到的模态窗口。附加(如前所述),当我暂停应用程序时,它暂停在Application.Run行,并且在线程列表中没有其他线程/代码运行(正如我希望看到是否阻止主窗口的模式对话框。
行为最奇怪恕我直言 - 特别是因为它最近才开始发生。我接下来的步骤必须是开始“减去”代码的各个部分,直到我找到罪魁祸首,但我想我先把问题放在这里,然后看看是否有其他人曾经遇到过这样的事情。< / p>
提前感谢任何指导 - 我期待听到任何建议。
EJ
编辑: 陈述行为的另一种方式。在它“挂起”后,它表现得好像没有问题,除了它没有从我的鼠标和键盘接收消息。换句话说,它仍然重新绘制,并且可以通过VS2010调试器暂停,但不会以任何形式或形式响应鼠标/键盘事件。尽管如此,它并没有开始向我发出哔哔声,因为它与真正死亡的其他应用程序一样。比如,不表示在任务管理器中没有响应。这只是一种奇怪的“我不再听I / O了,对不起!”国家......奇怪!
编辑:
在我上一次编辑中,我提到它不再接受IO了。这让我想到了这一点,我添加了一个TcpListener,看看它是否会在“挂起”后仍然响应 - 而且确实如此。另外,在考虑它仍然更新屏幕的事实时,我在paint事件中放置了一个断点并得到了一些(更多)奇怪的行为。它在paint事件中遇到断点,但此时不在调用堆栈的顶部。 callstack的顶部显示“In sleep,wait or join”。接下来是paint中的行,然后是外部代码,然后是main。因此,屏幕上突出显示的行是绿色 - 而不是黄色。另外,如果我F10(要跳过),它确实向下移动了1行,但仍然,pain方法不在调用堆栈的顶部。此时,没有其他线程在运行,没有其他代码在执行,没有其他事情发生?!?!这是怎么回事?
最后一点 - 我在TcpListener的Accept Socket事件中设置了一个断点,当我连接到TCP / IP端口时,它会中断该代码,并且代码IS位于调用堆栈的顶部。
抱歉 - 但我仍然很困惑。