私は1分ごとにいくつかの集中的な作業を行うWindowsサービスを持っています(実際には、http経由でさまざまなシステムと同期するたびに新しいスレッドを開始しています)。問題は、数日後の後で、エラーメッセージなしで突然停止することです。
NLogを配置し、「AppDomain.CurrentDomain.UnhandledException」に登録しました。 textfile-logの最後のエントリは、問題のない通常のエントリです。 EventLogを見ると、アプリケーションログにもメッセージがありませんが、システムログには2つのエントリがあります。
基本的にはサービスが予期せず終了したと言っています。これ以上何もない。 2番目のイベント(最初のイベントと同時に)は、「...スタックの新しいガードページを作成できません...」と言います。
私が読んだことから、これはおそらくスタックオーバーフローの例外です。私はXMLを解析しておらず、再帰的な作業もしていません。 Gate、Nancy、SignalRを使用してWebサーバーをホストし、RavenDBを組み込みモードで実行しています。 .NET 4.0のTaskfactoryを使用して毎分新しいタスクが開始され、System.Timers.Timerを再起動して1分後に再び起動するContinueWithもあります。
この問題の調査を開始するにはどうすればよいですか?そのようなエラーの考えられる理由は何でしょうか?
ご提供いただいた情報に基づいて、少なくとも次のことを行います。
AppDomain.CurrentDomain.UnhandledException
は役に立ちません-StackOverflowException
はその1つです。この場合、CLRは単にスタックトレースの代わりに文字列を提供するだけだと思います。見落とされがちなStackOverflowException
の例は次のとおりです。
private string myString;
public string MyString { get { return MyString; } } //should be myString
ちょうど「それのために」のように-私の場合、このエラーは、コードがWindowsイベントログに書き込もうとしていて、対話型ユーザーに十分な権限がない場合に報告されました。これは、例外をテキストファイルとイベントログ(必要な場合)に記録する小さなコンソールアプリでした。例外として、テキストファイルは更新されていましたが、このエラーがスローされ、エラー処理でキャッチされませんでした。イベントログを無効にすると、エラーが発生しなくなりました。
他の人が同じ問題を抱えている場合に備えて、私の場合、Windowsサービスが誤って無限の再帰ループに閉じ込められていることがわかりました。他の誰かがこの問題を抱えている場合は、巨大な再帰ループを引き起こしている可能性のあるメソッド呼び出しを考慮してください。
これを特定のコンピューターで取得し、初期化子内から自分自身を参照するc#オブジェクトまで追跡しました