私は非常にイライラする問題を抱えています。TCPServer のように動作する Windows サービスを作成しています (専門用語についてはよくわかりませんが、サービスは一連のクライアント間の tcp を介した通信を処理します)。
私の問題は、サービスがランダムにクラッシュし (少なくとも、例外の原因がわからない)、Windows アプリケーション ログに次のような VsJITDebugger (EventID 4096) エラー メッセージが含まれていることです。
SDUNoteTCPServerService.exe [1028] で未処理の win32 例外が発生しました。ジャストイン この例外の時間のデバッグが次のエラーで失敗しました: Debugger could not be ログオンしているユーザーがいないため、開始されました。
VsJITDebugger が何であるかは 100% わかりませんが、グーグルで調べた限りでは、VsJITDebugger は Visual Studio を使用して未処理の例外を明確にする何らかのツールです。VsJITDebugger エラー メッセージの直前に、次の .Net ランタイム (EventID: 1026) エラー メッセージが表示されることもあります。
アプリケーション: SDUNoteTCPServerService.exe フレームワークのバージョン: v4.0.30319 説明: 未処理の例外が発生したため、プロセスが終了しました。 例外情報: System.ComponentModel.Win32Exception スタック: System.Diagnostics.EventLogInternal.InternalWriteEvent (UInt32、UInt16、 System.Diagnostics.EventLogEntryType、System.String[]、Byte[]、System.String) System.Diagnostics.EventLogInternal.WriteEntry (System.String, System.Diagnostics.EventLogEntryType、Int32、Int16、Byte[]) System.Diagnostics.EventLog.WriteEntry (System.String, System.Diagnostics.EventLogEntryType、Int32) で TCPServer.TCPServerListener+AsynchronousSocketListener.WriteCustomSocketObjectMessagesToLog (System.String、System.Diagnostics.EventLogEntryType、Int32) TCPServer.TCPServerListener+CustomSocketObject.SendMessageToClientThread() で System.Threading.ThreadHelper.ThreadStart_Context (System.Object) で System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback、System.Object、ブール値) System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback、System.Object) System.Threading.ThreadHelper.ThreadStart() で
.Net ランタイム エラー メッセージに記載されているように、キャッチされた例外の詳細を EventLog に書き込もうとすると、未処理のエラーがスローされます。例外は、ソケットの BeginReceive メソッドのコールバック関数で常にスローされます。
Socket.BeginReceive メソッドのコールバック関数で try{}catch(Exception) を使用して一般的な例外をキャッチしているため、この例外が最初にサービスをクラッシュさせる理由はわかりませんが、に関する情報を抽出することはできません。この未処理の例外がスローされるため、キャッチされた例外。
問題が何であるかについてのアイデアはありますか?すべての返信をお待ちしております。
注: サービスは Windows Server 2003 (SP2) で実行されています。Visual Studio 2008 がインストールされています。
編集: WriteCustomSocketObjectMessagesToLog は次のようになります (イベントログ オブジェクトは AsynchronousSocketListener クラスのプロパティです)。
private void WriteExceptionToLog(string customstartmessage, Exception ex) { 試す { eventlog.WriteEntry(customstartmessage, EventLogEntryType.Error); eventlog.WriteEntry(ex.Message, EventLogEntryType.Error, 5); eventlog.WriteEntry(ex.Source, EventLogEntryType.Error, 5); eventlog.WriteEntry(ex.StackTrace, EventLogEntryType.Error, 5); } キャッチ (例外) { eventlog.WriteEntry("レポート例外の失敗", EventLogEntryType.Error); } }
編集2:
私は問題が何であるかを理解しました。イベントログがいっぱいであると報告されています。その時、私がそれに書き込むことができないのも不思議ではありません。クラス ライブラリをコンソール アプリケーションに変換することで問題を発見しました。TCPServer クラスを書き始めたときにもこれを行いましたが、当時は WriteLine メソッドを使用して Console にエラーを書き込んでいました。今回は、コンソール アプリケーションが作成されたイベント ログに書き込み、未処理の例外がコンソールに書き込まれました (これがコンソール アプリケーションの既定の動作であるかどうかはわかりません。これを行うコーディングを行っていないためです)。Windows サービスの未処理のエラーは、おそらく次のとおりです。
未処理の例外: System.ComponentModel.Win32Exception: イベント ログ ファイルがいっぱいです System.Diagnostics.EventLogInternal.InternalWriteEvent (UInt32 eventID、UInt16 カテゴリ、EventLogEntryType 型、String[] 文字列、Byte[] rawData、String currentMachineName) で System.Diagnostics.EventLogInternal.WriteEntry (文字列メッセージ、EventLogEntryType 型、Int32 eventID、Int16 カテゴリ、Byte[] rawData) で System.Diagnostics.EventLog.WriteEntry (文字列メッセージ) で TCPServer.Program.Main (文字列 [] 引数) で
今、私はおそらくこれを処理する必要があります。このエラーを処理するためのより良い解決策は何でしょうか? エラーがスローされるたびにプログラムでイベントログを保存して空にしますか? イベントログのサイズを無制限に増やしますか (これは可能であり、良い考えですか?)? 他の提案はありますか?