什么原因会导致.NET应用程序导致计算机冻结?

3

我知道这可能是一个典型的“视情况而定”的问题,但我会感激任何指向开始寻找的方向。

我有一个在以太网上传输数据的客户端/服务器应用程序。在一台计算机上,我运行服务器和客户端,在另一台计算机上只运行客户端。其中一台运行Vista,另一台运行XP。在大约3周的运行时间后,整个计算机会冻结,什么都不工作,不是鼠标,也不是键盘,什么都没有 - 只能强制关机。除了每十秒钟服务器发送ping消息以检查客户端是否存活之外,每天只有几条小消息来回传递。

我正在努力找出是我引起的问题还是其他原因。我已经开始了一个会话,几天后我想检查内存使用是否异常增加,但除此之外我几乎没有什么想法。

4个回答

3
您可以将内核调试器附加到操作系统上。这样,即使操作系统完全无响应,您也应该能够检查操作系统和进程的状态。(不幸的是,这比在VS中只需点击"break"要困难得多。我建议在尝试之前阅读John Robbin的"Debugging Applications for .NET and Windows")。
您还可以尝试定期创建应用程序的内存转储。不过,您可能需要进行一些脚本编写。(通常情况下,您可以使用userdump或adplus等工具通过按键来创建一个转储,但如果操作系统不响应按键,那么这种方法就行不通了。)这样,您就可以知道在挂起期间或挂起之前您的进程处于什么状态了。 这个页面:http://blogs.msdn.com/debuggingtoolbox/default.aspx是WinDbg脚本编写的好起点。(如果您不知道如何处理内存转储,我再次建议阅读John Robbin关于调试的优秀书籍!)
除此之外,我只能想到标准的调试技巧:问题是否在每台PC上都出现?如果没有客户端请求会发生吗?如果有更多的客户端请求,它会更早地发生吗?如果可用物理内存更少,它会更早地发生吗?尝试删除应用程序的某些部分(可能在单独的服务器上进行测试),看看问题是否仍然存在等等。尝试在虚拟机中运行它,这样您就可以看到它在这些"挂起"期间使用了CPU、硬盘还是网络。

3

一些需要考虑的问题:

  1. 你知道电脑没有响应,但这并不意味着它已经挂起。它是否响应ping命令?
  2. 也许硬盘活动指示灯一直亮着?
  3. 你说“没有键盘” - 是指没有大写锁定或数字锁定指示灯吗?
  4. 尽管.NET应用程序可能是您此时唯一运行的应用程序,但这并不意味着它是问题的原因。一些后台作业可能在影响系统。

例如,我发现当Retrospect备份创建快照时,整个系统会冻结10-15分钟。我的意思是,没有大写锁定键,任务栏中的时钟不更新,没有CTRL-ALT-DEL,无法在SO的“回答”文本框中输入任何内容。这与我当时所做的事情无关,我正在回答SO上的一个问题。

回来之后,SO问我是否是人类。我的感觉受到了伤害。;-)


1

这不会是最后的答案,但我建议从检查操作系统事件日志并运行perfmon以跟踪内存、CPU使用情况等方面开始。


CPU使用率非常低,在使用期间低于10%,在空闲期间低于3%。操作系统日志是一个好主意。除了XP中的任务管理器之外,是否有其他更好的性能监视工具? - Niklas Winde

0

哪台电脑会冻结,服务器还是客户端?它们分别运行的操作系统是什么?

正如Daniel L所指出的那样,紧密轮询循环确实会严重占用CPU。如果可以的话,请更改您的代码以使用事件处理程序,这是一个更强大的解决方案。

最后,您确定冻结的计算机没有硬件问题吗?


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