进程突然崩溃,没有错误

问题描述:

我有一个用.net-3.5编写的有点大的服务器进程,也就是说,运行在一个VMWare vCenter Server中,在不报告任何错误的情况下会一直崩溃。该进程由32位Windows Server 2003上的Windows Service创建,旨在成为长时间运行的进程(多天)。这是一个协作过程,它接受来自运行在其他Windows XP机器上的多个客户端的Tcp套接字的连接,并允许它们共享数据。此外,该过程还自行承载大约8个WCF服务,这些服务公开混合Tcp & Http端点。该过程通常会消耗大约500 Mb的内存和30-50%的CPU。在托管6个数据库的同一虚拟机上还有一个SQL Server 2005实例,并消耗大约1-1.2 Gb的内存。整个系统已经分配了8G的RAM,并且在正常操作期间消耗高达7Gb。我假设PAE已启用,以允许系统处理8 Gb的内存,但尚未确认。进程突然崩溃,没有错误

问题是,在看似随机的时间里,进程会突然崩溃而没有报告错误,包括事件日志。我试着将调试器附加到进程中,但他们也没有发现崩溃。我首先在发布版本上尝试了WinDbg,并加载了符号,然后用调试版本替换了所有发行版的dll/exes并加载了它们的符号。崩溃仍然发生,调试器没有捕获它们。接下来,我使用.Net Reflector加载项在系统上安装了Visual Studio,并附加了它。它也没有赶上崩溃。

在你讲述为什么我们要在单个虚拟机上运行这么多事情之前,我知道我没有设计系统,也没有这样实现。我们的客户因为特定的原因决定了它,并且我被要求进来并使其工作。如果你能找到有助于解释突发事故的具体证据,我只对环境的批评感兴趣。如果我们可以展示这样的证据,我们的客户可能愿意改变环境。任何额外的调试技术都可以让我捕获更多关于崩溃的信息,我们将不胜感激。

+0

我首先在应用程序中包含过多的日志记录(例如NLOG或LOG4NET)在例外的情况下记录什么。 – 2011-04-17 15:00:06

+0

ru使用任何非托管的第三方库?当你连接windbg并且没有发现异常时,windbg输出还有什么其他的兴趣点? – wal 2011-04-17 15:14:33

+0

嗯,我的第一个猜测(这是*所有*它)是这是某种内存不足的错误。你的进程可能会消耗大量的RAM,你遇到了垃圾回收的问题,并且进程正在终止。不知道为什么你不能用调试器捕捉错误。检查以确保您没有泄漏内存或手柄。当事情稳定时,像Process Monitor这样的东西会告诉你什么? – 2011-04-17 15:18:07

事实证明,服务插件之一是寻找和引用的Java库。当用户注销时,由于JVM被终止,插件会使服务崩溃。我们可以按照这篇文章中的建议重新开始工作(使用'-Xrs'参数启动JVM: http://www.velocityreviews.com/forums/t128371-java-app-dies-on-logoff.html

没有输出的“crash”会提示致电_exit()(或甚至exit())。我已经看到了Visual Studio运行时库的几个角落,尽管它们通常会向stderr发送一条神秘的消息。是否抓获stderr

怀疑耗尽内存似乎也可能。如果.net有一个类似heapspace()的函数来描述堆使用了多少内存,那么定期记录这些内存,也许还有使用的总内存(代码+堆栈+数据)。我对.net不熟悉,但必须有函数来获取这些值。

+0

这是我没有尝试过的工具。我会看看。 – Todd 2011-04-19 15:10:19