我有一个用.net-3.5编写的有点大的服务器进程,即在VMWare vCenter Server中运行,不会报告任何错误而导致崩溃。该过程由32位Windows Server 2003上的Windows服务创建,旨在成为一个长时间运行的过程(多天)。它是一个协作过程,通过来自其他Windows XP计算机上运行的多个客户端的Tcp套接字接受连接,并允许它们共享数据。此外,该过程还自行托管大约8个WCF服务,这些服务暴露了混合物Tcp& Http端点。该过程通常消耗大约500 Mb的内存,并且始终消耗30-50%的CPU。在托管6个数据库的同一个VM上还有一个SQL Server 2005实例,占用大约1-1.2 Gb的内存。整个系统已经分配了8 Gb的ram,在正常运行期间消耗的功率高达7 Gb。我假设启用了PAE以允许系统寻址8 Gb的ram,但尚未证实这一点。
问题在于,在看似随机的时间,进程将突然崩溃,不会报告任何错误,包括在事件日志中。我已经尝试将调试器附加到进程中,他们也没有抓住崩溃。我首先尝试使用符号加载的版本构建WinDbg,然后用调试版本替换所有版本dll / exes并加载它们的符号。崩溃仍然发生,调试器没有捕获它们。我接下来在带有.Net Reflector插件的系统上安装了Visual Studio,并附加了它。它也没有发现崩溃。
在你讲述为什么我们在一台虚拟机上运行这么多东西之前,要知道我没有设计系统,也没有用这种方式实现它。我们的客户出于特定原因决定了这一点,我被要求进入并使其成功。如果你能提供有助于解释突然崩溃的具体证据,我只对环境的批评感兴趣。如果我们能够显示这些证据,我们的客户可能愿意改变环境。任何其他调试技术都可以让我捕获有关崩溃的更多信息,我们也非常感激。
答案 0 :(得分:1)
答案 1 :(得分:0)
没有输出的“崩溃”表示呼叫_exit()
(甚至exit()
)。我已经看到Visual Studio运行时库的一些角落可以做到这一点,尽管它们通常会向stderr
发送一条神秘的消息。是stderr
被捕获了吗?
似乎可能会怀疑内存不足。如果.net有类似heapspace()
的函数来描述堆使用了多少内存,请定期记录,也许与使用的总内存(代码+堆栈+数据)一起记录。我不熟悉.net,但必须有函数来获取这些值。
答案 2 :(得分:0)
事实证明,其中一个服务插件正在寻找和引用Java库。当用户注销时,由于JVM被终止,插件崩溃了服务。通过遵循本文中的建议(使用'-Xrs'参数启动JVM),我们能够让一切恢复正常: http://www.velocityreviews.com/forums/t128371-java-app-dies-on-logoff.html