2012-06-26 41 views
9

我有一個Windows服務,做一些深入細緻的工作每隔一分鐘(實際上是每一個在它通過HTTP同步到不同的系統時間開始一個新的線程)。問題是,幾天後突然停止,沒有錯誤信息。Windows服務/堆棧一個新的保護頁無法創建

我NLOG到位,我已經註冊了「AppDomain.CurrentDomain.UnhandledException」。 textfile-log中的最後一項只是一個普通的入口而沒有任何問題。查看EventLog,我也無法在應用程序日誌中找到任何消息,但是,系統日誌中有兩個條目。

一個基本上說,該服務已意外終止。而已。第二個事件(與第一個同時)說:「...爲堆棧創建一個新的守衛頁面不能創建...」

從我讀過的,這可能是一個堆棧溢出例外。我不解析任何XML,也不做遞歸工作。我使用Gate,Nancy和SignalR託管一個Web服務器,並使RavenDB以嵌入模式運行。每分鐘都會有一個新的任務使用.NET 4.0的Taskfactory開始,我也有一個ContinueWith,我重新啓動一個System.Timers.Timer來在一分鐘內再次啓動。

如何開始調查這個問題?造成這種錯誤的可能原因是什麼?

+3

是的,這是一個SO。它不是託管代碼,它以不同的方式報告異常。你有一堆你沒寫的代碼,它都是可疑的。 –

回答

9

根據您所提供的信息,我至少,至少,請執行下列操作:

  1. 格外注意任何第三方調用,並添加額外的信息圍繞這些點登錄。
  2. 在某些情況下AppDomain.CurrentDomain.UnhandledException不會幫助你 - StackOverflowException就是其中之一。我相信CLR在這種情況下只會給你一個字符串,而不是堆棧跟蹤。
  3. 支付約在引入多個線程方面格外注意。

的往往一個例子忽略StackOverflowException是:

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

感謝您的回答!我會試着放棄Task.New.ContinueWith的東西,看看是否有任何區別。一個問題 - 它也可能是一個System.OutOfMemoryException? –

+1

@DanielLang:是的,這也是可能的。 –

+0

@BryanCrosby是否有可能得到一個System.OutOfMemoryException,而不是專門在事件查看器的Appliaction部分中記錄它? –

2

正如「什麼是值得」 - 在我的情況報告該錯誤代碼時正試圖寫入Windows事件日誌和交互式用戶沒有足夠的權限。這是一個小型控制檯應用程序,它記錄了文本文件和事件日誌的異常(如果需要)。在例外情況下,文本文件正在更新,但是這個錯誤被拋出並且沒有被錯誤處理捕獲。禁用事件記錄會停止發生錯誤。

0

爲防萬一任何其他人有同樣的問題,在我的情況下,我發現我的Windows服務被無意中陷入了無盡的遞歸循環。所以如果其他人有這個問題,考慮可能會導致巨大的遞歸循環的方法調用。