3

我知道这可能是典型的“这取决于......”问题,但我会很感激任何关于从哪里开始寻找的指示。

我有一个通过以太网交谈的客户端/服务器应用程序。在一台计算机上,我运行服务器和一个客户端,而在另一台计算机上只运行客户端。一个运行Vista,一个运行XP。大约 3 周的正常运行时间后,整个计算机死机,没有任何工作,鼠标、键盘、没有任何东西 - 只是关闭电源。服务器每隔 10 秒发送一条 ping 消息以查看客户端是否处于活动状态,除此之外,每天只有几条小消息来回发送。

我正在尝试找出是我造成的还是其他原因。我已经开始了一个会话,几天后我想我会检查内存使用的奇怪增加,但除此之外我几乎没有什么想法。

4

4 回答 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 上?如果没有客户端请求,会发生这种情况吗?如果有更多的客户请求,它会更快发生吗?如果可用的物理内存较少,它会更快发生吗?尝试删除应用程序的某些部分(可能在单独的服务器上进行测试)并查看问题是否仍然存在,等等。尝试在 VM 中运行它,以便查看它在“挂起”期间是否使用 CPU、硬盘或网络。

于 2009-03-12T07:50:45.187 回答
3

需要考虑的一些想法:

  1. 您知道计算机没有响应,但这并不意味着它已挂起。它对 ping 有响应吗?
  2. 也许磁盘活动指示灯一直亮着?
  3. 你说“没有键盘” - 你的意思是没有大写锁定或数字锁定灯?
  4. 虽然 .NET 应用程序可能是您当时正在运行的唯一应用程序,但这并不意味着它是问题的原因。一些后台工作可能正在做。

例如,我注意到 Retrospect 备份在创建快照时会将整个系统冻结 10-15 分钟。我的意思是,没有大写锁定,任务栏中的时钟不会更新,没有 CTRL-ALT-DEL,不能在 SO 中输入“答案”文本框,什么都没有。这与我当时在回答关于 SO 的问题无关。

回来后,SO问我是不是人。我的感情受到了伤害。;-)

于 2009-03-12T08:01:12.870 回答
1

这不会是答案,但我建议首先检查您的操作系统事件日志并运行 perfmon 以跟踪内存、cpu 使用情况等。

于 2009-03-12T07:08:26.427 回答
0

哪台计算机死机,服务器还是客户端?他们分别运行什么操作系统?

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

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

于 2009-03-12T08:07:53.430 回答