【发布时间】:2013-01-29 06:59:33
【问题描述】:
我有一个 .NET 2.0 控制台应用程序,在 Visual Studio 2010 IDE 的 Windows Server GoDaddy VPS 上以调试模式 (F5) 运行。
应用程序会定期冻结(就像垃圾收集器暂时暂停执行一样),但在极少数情况下它永远不会恢复执行!
我已经对此进行了几个月的诊断,但我的想法已经不多了。
- 应用程序以正常的优先级运行(它使用 100% 的 CPU 使用率)。它也是多线程的。
- 当应用程序冻结时,我可以使用 VS2010 IDE 通过暂停/取消暂停进程来解冻它(因为它正在调试器中运行)。
- 上次执行的位置,当我暂停冻结的进程时,似乎无关紧要。
- 冻结时,CPU 使用率仍为 100%。
- 解冻后,它运行良好,直到下一次冻结。
- 服务器可能会在两次冻结之间运行 70 天,也可能只运行 24 小时。
- 内存使用保持相对恒定;没有任何内存泄漏的证据。
任何人有任何提示来诊断到底发生了什么?
【问题讨论】:
-
没有真正的帮助,但它让我感到困惑:你为什么要在 VS 的调试器中运行应用程序 70 天?将它作为发布版本运行有什么问题,这会给您带来更高的性能、更少的开销,并且可能会让您摆脱由调试器引起的问题,就像您目前所遇到的那样?
-
@Krumelur 我通常每周都会为代码提交补丁,但有一段时间我几个月没有提交任何代码。我不想在没有附加调试器的情况下运行应用程序,除非有理由相信调试器可能是罪魁祸首。
-
好吧,不使用调试器运行它很容易发现它是否仍然会失败。
-
@Krumelur 等待下一次冻结可能需要 70 天,这听起来不是一个简单的找出方法。同时,没有附加调试器来诊断可能发生的任何其他问题。
-
这样抽象的问题描述很难说。我建议如下: 1. 在没有调试器的情况下运行您的程序。您可以随时将调试器附加到正在运行的程序以解决您的问题。 2. 进程冻结时转储它。使用 Visual Studio 或 WinDBG + sos 扩展调查转储。或者将转储放在某个地方并在此处发布指向它的链接。还需要随构建生成的 PDB 文件。
标签: c# .net windows multithreading garbage-collection