1

私のサービスはランダムな時間完全に正常に動作し、その後停止します。

私は見ることができるすべての例外をキャッチしています。サービスの作成に try/catch を追加して、何らかのエラーを取得しようとしましたが、何も取得しませんでした。サービスが停止するだけです。

        try
        {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] { new my_service() };
                ServiceBase.Run(ServicesToRun);
        }
        catch (Exception e)
        {
            logEvent(e);   // Log any errors to a .txt file.
        }

イベント ビューアには次のように表示されます。

Faulting application name: my_service.exe, version: 0.9.2.1, time stamp: 0x50717154
Faulting module name: ntdll.dll, version: 6.1.7601.17514, time stamp: 0x4ce7b96e
Exception code: 0xc0000005
Fault offset: 0x00055f99
Faulting process id: 0x%9
Faulting application start time: 0x%10
Faulting application path: %11
Faulting module path: %12
Report Id: %13
4

3 に答える 3

7

あなたが提供した情報で何が問題だったのかを推測することは不可能です。ただし、トリックを使用して、キャッチされていないすべての例外をキャッチしてログに記録することを試みることができます。

私のプロジェクトで私が行う方法は次のとおりです。

まず、Main() で、次のイベントを購読します。

AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler;

そして、スタックトレースをファイルに記録してコンソールに出力するだけのハンドラを定義します (ただし、アプリをサービスとして実行するため、これは関係ありません)。

private static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e){
        try{
            Logger.Append(Severity.CRITICAL, "Unhandlable error : "+e.ExceptionObject); 


        }catch{}
        Console.WriteLine("Unhandlable error : "+e.ExceptionObject);
        Environment.Exit(10);
    }
于 2012-10-07T13:06:32.177 に答える
3

サービスが稼働している場合Run()、そのメソッドでは何も実行されないため、ログを記録してもあまり効果がありません。OnStart基本的に、サービスのメソッドをトリガーするだけです。

通常、サービスのOnStartメソッドはまったく新しいスレッドを開始して、実際のサービスを実行します。ロギングを行う必要があるのはそのスレッドにあります。その Thread の threadstart メソッド全体に try/catch を配置するか、AppDomain.CurrentDomain.UnhandledException をサブスクライブすると、サービスが生成していてキャッチしていない例外がすべてログに記録できるようになります。

ただし、問題 (サービスのコードを表示していないためわかりにくい) は、サービスが ntdll.dll でクラッシュすることのようです。これは pinvoke (外部のネイティブ DLL への呼び出し) である可能性があります。キャッチする例外を取得します。ネイティブ クラッシュのデバッグは、まったく別の科学です。

于 2012-10-07T13:07:45.827 に答える
1

いつでも簡単なコンソール アプリケーションを実行し、アセンブリを参照して、コンソール アプリからコードを呼び出し、簡単にデバッグできます。(ロングショットによる最も簡単なオプション)。

于 2012-10-07T13:28:44.593 に答える