.Net Windows服务中的StackOverflowException

时间:2010-11-03 15:17:13

标签: .net windows-services stack-overflow

在某些情况下,我的.Net Windows服务可以生成StackOverflowException。不幸的是,行为似乎是服务简单地停止并且不会在事件日志中写入任何内容。我甚至没有收到服务控制经理发来的消息,说服务失败了。

有没有办法让Windows服务能够检测到发生了这样的异常?

在此异常的文档中,MSDN说:“请注意,承载公共语言运行时(CLR)的应用程序可以指定CLR卸载发生堆栈溢出异常的应用程序域,并让相应的进程继续”。这是我期望windows服务实现的事情,但事实并非如此。

请不要回复说我应该确保我的代码永远不会抛出这样的例外 - 相信我,如果可以的话我会 - 我想要做的是以合理的方式处理最坏的情况并制作我的服务可以抵御意外错误。

2 个答案:

答案 0 :(得分:5)

堆栈溢出是线程可能遭受的最严重的心脏病发作。这是非常糟糕的,你甚至没有在事件日志中得到一些东西。这是非常糟糕的,你甚至无法做任何合理的事情来恢复你的程序状态。线程已经死了,appdomain的状态也是如此。它以完全不可预测的方式发生变异,你只能扔掉它。

嗯,你已经知道了这一切。但是耸耸肩并假装它没有发生会导致另一种失败。系统故障,该服务应该做一些事情,但没有发生。没有很多场景可以接受。没有处理文件,没有发生数据库更新,等等。这种可能导致一连串意外事故发生的事故。就像首席财务官发现在年底失去了一百万美元。

你不想听到这个,但没有合理的方法来解决这个问题。将所有努力集中在发现错误上,而不是创可贴。堆栈溢出总是编程错误。

答案 1 :(得分:0)

好的,一个实际的答案。您卡在固定大小的堆栈中。您可以使用Thread(ThreadStart,int)构造函数来创建具有更大堆栈的构造函数。给它几十兆字节。如果不能完全解决问题,这应该可以避免这个问题。

接下来要做的是开始筛选您要处理的xml文件。不确定是否是文件的原始大小会导致.xml中的SO或坏数据。首先检查文件的大小,如果它是怪物,请将其放在单独的目录中。要手动处理,最好是首先创建此文件的人。如果你还没有它们,请确保你有一些麻烦制造者的文件。尝试使用怪物线程堆栈大小离线处理它们。如果仍然存在,请开始寻找可以预先筛选.xml内容以检测问题根源的算法。

如果您认为.xml文件内容可能是原因而提出另一个问题,那么您需要找出可能导致此问题的不良内容(对xlt一无所知)。