0

私は非常にイライラする問題を抱えています。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 (文字列 [] 引数) で

今、私はおそらくこれを処理する必要があります。このエラーを処理するためのより良い解決策は何でしょうか? エラーがスローされるたびにプログラムでイベントログを保存して空にしますか? イベントログのサイズを無制限に増やしますか (これは可能であり、良い考えですか?)? 他の提案はありますか?

4

3 に答える 3

1

2番目の編集で書かれたように、イベントログに書き込もうとしたときにイベントログがいっぱいになるという問題を見つけました。多くのログを記録していますが、EventLog のデフォルトの動作は MaximumKilobytes 程度で 512 程度で、7 日より新しいエントリを保持しています。MaximumKilobytes が 25 メガバイトに等しくなるように構成を変更し、必要に応じてエントリを上書きしました。

于 2013-09-03T07:46:06.173 に答える
0

AppDomain UnhandledException イベントのハンドラーを定義します。

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

void MyHandler(object sender, UnhandledExceptionEventArgs e)
{
    // See the exception context here using e.ExceptionObject 
}
于 2013-09-02T13:16:00.810 に答える
0

例外をキャッチしたい場合は、 に例外ハンドラを追加する必要がありますAsynchronousSocketListener.WriteCustomSocketObjectMessagesToLog。クラスは、名前空間のAsynchronousSocketListener内にネストされています。このクラスは、あなたまたはあなたの組織が実装したものだと思います。TCPServerListenerTCPServer

残念ながら、イベント ログに書き込もうとする一部のコードで例外がスローされるため、例外の根本的な原因がメモリの枯渇などである場合、例外をキャッチしてログに記録するのはやや難しい場合があります。

InternalWriteEventクラスの.NET 4.0 ソース コードを調べると、aをスローできるSystem.Diagnostics.EventLogInternal場所は 1 つしかないようで、それは関数の呼び出しが失敗した場合です。Win32ExceptionReportEvent

にはWin32Exception、Windows エラー コードが含まれます。ドキュメントによると、次のReportEvent4 つのエラー コードが考えられます。

  • ERROR_INVALID_PARAMETER (87)
  • ERROR_NOT_ENOUGH_MEMORY (8)
  • RPC_S_INVALID_BOUND (1734)
  • RPC_X_BAD_STUB_DATA (1783)
  • 他のエラーコードの可能性もあります

のエラー コードをWin32Exception見つけることが、問題の原因を理解するのに役立つことを願っています。

于 2013-09-02T13:28:39.617 に答える