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

时间:2012-06-26 23:36:01

标签: c# debugging windows-services clr stack-overflow

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

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

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

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

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

4 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我在一台特定的计算机上得到了它,并将其追溯到一个c#对象,该对象在初始化器中引用自身