2010-11-03 65 views
1

在某些情况下,我的.Net Windows服务可能会生成一个StackOverflowException。不幸的是,这种行为似乎是服务停止死机,并且不会在事件日志中写入任何内容。我甚至没有收到服务控制管理员发送的表示服务失败的消息。.Net Windows服务中的StackOverflowException

有没有办法在所有Windows服务可以检测已发生这样的异常?

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

请不要只是回复说我应该确保我的代码永远不会抛出这样的异常 - 相信我,我会如果我可以 - 我想要做的是以合理的方式处理最糟糕的情况,使我的服务能够应对意外的错误。

+0

您是否尝试将调试器附加到服务? :http://msdn.microsoft.com/en-us/library/7a50syb3(VS.80).aspx尝试找出究竟出了什么问题? – 2010-11-03 15:26:15

+0

你是否在捕捉错误? – 2010-11-03 15:27:16

+0

是的,托尼,我正在尽我所能在CLR – 2010-11-03 15:37:15

回答

4

SO是一种线程可能遭受的最严重的心脏病。这很糟糕,你甚至没有在事件日志中得到什么。这是非常糟糕的,你甚至不能做任何合理的事来恢复你的程序状态。线程已经死亡,appdomain的状态也是如此。它以完全不可预知的方式变异,你只能扔掉它。

那么,你已经知道这一切。但是耸耸肩,假装它没有发生导致一种不同的失败。系统故障,该服务应该做些什么,但没有发生。在可接受的情况下没有太多的情况。文件没有得到处理,数据库更新没有发生,等等。这种事故可能会导致一连串的事故。就像首席财务官发现在年底失去了一百万美元。

你不想听到这个,但没有明智的办法来解决这个问题。将所有的努力都集中在寻找错误上,而不是创可贴。而SO是总是一个编程错误。

+0

+1内说得好。 – 2010-11-03 15:38:32

+0

不幸的是,这种情况下的问题是由在一个100页的用户提供的单词XML文档上运行6000行XSLT转换引起的。当然,我们将努力寻找错误,但是XSL的复杂性和几乎无限范围的输入数据(即我们试图处理任何word文档),偶尔需要一个逆止机制。 – 2010-11-03 15:40:08

0

好的,一个实际的答案。你是而不是卡住了一个固定大小的堆栈。您可以使用Thread(ThreadStart,int)构造函数创建一个具有较大堆栈的构造函数。给它几十兆字节。如果不能彻底解决问题,这应该是一个很大的方法来避免这个问题。

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

问另外一个问题,如果你认为.xml文件内容的原因可能和你需要找出什么样的不良内容可能导致这个(不知道太多关于XLT任何东西)。

+0

感谢您增加堆栈大小的想法,我一定会放弃这一想法。目前,我设计了一个解决方案,通过该解决方案,我们可以将服务设置为在故障时自动重新启动,并检测意外的进程退出并明确地失败该任务。 不幸的是,一个单词文档是一件很复杂的事情(和样式表一样),所以很难提出一些规则来清理输入,而不必排除某些可能工作的文档,那样会更糟。 – 2010-11-10 15:43:41