web-dev-qa-db-ja.com

Windowsサービス/スタックの新しいガードページを作成できません

私は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もあります。

この問題の調査を開始するにはどうすればよいですか?そのようなエラーの考えられる理由は何でしょうか?

13
Daniel Lang

ご提供いただいた情報に基づいて、少なくとも次のことを行います。

  1. サードパーティの呼び出しに特に注意を払い、それらのポイントに関する追加の情報ログを追加します。
  2. AppDomain.CurrentDomain.UnhandledExceptionは役に立ちません-StackOverflowExceptionはその1つです。この場合、CLRは単にスタックトレースの代わりに文字列を提供するだけだと思います。
  3. 複数のスレッドが導入される領域には特に注意してください。

見落とされがちなStackOverflowExceptionの例は次のとおりです。

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

ちょうど「それのために」のように-私の場合、このエラーは、コードがWindowsイベントログに書き込もうとしていて、対話型ユーザーに十分な権限がない場合に報告されました。これは、例外をテキストファイルとイベントログ(必要な場合)に記録する小さなコンソールアプリでした。例外として、テキストファイルは更新されていましたが、このエラーがスローされ、エラー処理でキャッチされませんでした。イベントログを無効にすると、エラーが発生しなくなりました。

2
Kevin Newton

他の人が同じ問題を抱えている場合に備えて、私の場合、Windowsサービスが誤って無限の再帰ループに閉じ込められていることがわかりました。他の誰かがこの問題を抱えている場合は、巨大な再帰ループを引き起こしている可能性のあるメソッド呼び出しを考慮してください。

1
Rolando Retana

これを特定のコンピューターで取得し、初期化子内から自分自身を参照するc#オブジェクトまで追跡しました

1
Kirsten Greed