Windows服务/无法创建堆栈的新保护页面

我有一个Windows服务,每隔一分钟做一些密集的工作(实际上它每次启动一个新的线程,它通过http同步到不同的系统)。 问题是, 几天后突然停止,没有错误信息。

我有NLog,我已注册’AppDomain.CurrentDomain.UnhandledException’。 textfile-log中的最后一个条目只是一个没有任何问题的正常条目。 查看EventLog,我也无法在应用程序日志中找到任何消息,但是,系统日志中有两个条目。

一个人基本上说服务意外终止了。 而已。 第二个事件(与第一个事件同时)说:“……无法创建堆栈的新保护页面……”

根据我的阅读,这可能是一个堆栈溢出exception。 我没有解析任何XML而且我不做递归工作。 我使用Gate,Nancy和SignalR托管一个Web服务器,并在嵌入模式下运行RavenDB。 每分钟都使用.NET 4.0中的Taskfactory启动一个新任务,我还有一个ContinueWith,我重新启动System.Timers.Timer,在一分钟内再次启动。

我该如何开始调查此问题? 可能出现这种错误的原因是什么?

根据您提供的信息,我至少应该至少执行以下操作:

  1. 特别注意任何第三方电话,并在这些点附近添加其他信息。
  2. 在某些情况下, AppDomain.CurrentDomain.UnhandledException将无法帮助您 – StackOverflowException就是其中之一。 我相信CLR只会在这种情况下给你一个字符串而不是堆栈跟踪。
  3. 在引入多个线程的区域周围要特别注意。

经常被忽视的StackOverflowException一个例子是:

 private string myString; public string MyString { get { return MyString; } } //should be myString 

就像’值得’ – 在我的情况下,当代码尝试写入Windows事件日志并且交互式用户没有足够的权限时,会报告此错误。 这是一个小型控制台应用程序,它记录了文本文件和事件日志的exception(如果需要)。 在exception时,文本文件正在更新,但随后抛出此错误并且未被error handling捕获。 禁用事件记录会停止发生错误。

为了防止任何其他人遇到同样的问题,在我的情况下,我发现我的Windows服务意外地被困在无限的递归循环中。 因此,如果其他人有这个问题,请考虑可能导致巨大递归循环的方法调用。

我在特定的计算机上得到了这个,并将其跟踪到初始化程序中引用自身的ac#对象