2011-01-25 9 views
3

私はServiceBaseクラスに基づいて通常のC#サービスを持っています。このサービスは、スタートアップC++ダイナミックリンクライブラリに読み込まれます。管理されていないコードでサービスがクラッシュすることがあります。残念なことに、イベントビューアはこれについて非常に簡単な説明のみを提供します。Windowsサービス例外が処理されない

アプリケーション::StreamMapService.exe Frameworkのバージョン:v4.0.30319 説明:これは、1つの場合は、彼のメッセージをどのように見えるかであるプロセスが原因未処理の例外に終了しました。 例外情報:例外コードC0000005、例外アドレス00000012"

問題は、アンマネージコードである99%の確実性に問題はこれが(通常は一日一回)非常にまれにしか起こらないことを、サービスとしてrunnedたときのみです。デバッガの下ですべてがOKです、私は次のように私の主な方法を編集し、問題のコードを調べるには:。。

static void Main() 
    { 
     try 
     { 
      if (!Environment.UserInteractive) 
      { 
       ServiceBase[] ServicesToRun; 
       ServicesToRun = new ServiceBase[] 
       { 
        new Service1() 
       }; 
       ServiceBase.Run(ServicesToRun); 
      } 
      else 
      { 
       var services = new Service1(); 
       services.Start(); 
       Console.WriteLine("Press return to exit"); 
       Console.ReadLine(); 
       services.Stop(); 
      } 
     } 
     catch (SEHException e) 
     { 
      // wrapper for all exceptions having its origin in unmanaged code 
      StringBuilder sb = new StringBuilder(); 
      sb.AppendFormat("Crash time: {0}\n", DateTime.Now.ToString()); 
      sb.AppendFormat("\nMessage:\n{0}", e.Message); 
      sb.AppendFormat("\nSource: {0}\n", e.Source); 
      sb.AppendFormat("Stack trace:\n{0}", e.StackTrace); 
      sb.AppendFormat("\nTarget site:{0}", e.TargetSite); 

      SmtpClient client = new SmtpClient("mail.domain.com"); 
      MailAddress from = new MailAddress("[email protected]", "sender", System.Text.Encoding.UTF8); 
      MailAddress to = new MailAddress("[email protected]"); 
      MailMessage message = new MailMessage(from, to); 
      message.Body = sb.ToString(); 
      message.Subject = "StreamMapService crash info"; 
      client.Send(message); 
      throw; 
     } 
    } 

は、私は、アンマネージコードの一部でテスト例外を生成し、この例外ハンドラをテストするには、私が実行したときにすべてがOKに機能していますデバッガ下またはコマンドラインからのサービス。

例外に関する情報を含む電子メールメッセージを受け取ります(最も重要なのは、管理対象外の例外が発生したコールスタックです)。

しかし、このプログラムをシステムコントロール(コントロールパネル - >管理ツール - >サービス)から実行すると、サービスがクラッシュします(tcpインターフェイスで応答しなくなり、イベントビューアにもクラッシュ情報が含まれます)。

この場合、例外ハンドラが呼び出されないようです。例外情報をファイルに書き込もうとしましたが、これも同じです。

したがって、デバッガまたはコマンドラインで実行されると、コールスタック情報が正しく記録されます。システムサービスとして実行されると、何も起こりません。この状態で例外処理が正しく機能していないようです。

+0

コマンドプロンプトを開き、あなたのデバッガをして教えた後、管理者として実行状況。あなたはそれをサービスとして実行するときと同じように怒鳴りますか?デバッグする前に、フレームワークのバージョンを3.5以下に変更してください。 – PawanS

答えて

1

例外はおそらく別のスレッドでスローされます。任意の未処理の例外をキャッチするために、あなたのコードの前に次のことを追加してみてください:

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

イベントハンドラは、次のシグネチャが必要です。

void CurrentDomain_UnhandledException(
    object sender, UnhandledExceptionEventArgs e) { 
} 
+0

この問題は部分的にしか解決されていません。コールスタックをもっと徹底的に調べてみると、アンマネージドメソッドが含まれていないことがわかりました(私が問題に書いた情報は、これで申し訳ありません)。 – truthseeker

+0

しばらくして予期せず機能しなくなりました。通常のexeファイルまたはデバッガの下で例外処理が正しく機能しているときに実行されます。 – truthseeker

+0

したがって、AppDomain.UnhandledExceptionイベントは発生しませんか?これを引き起こす可能性のあるものの詳細については、http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspxを参照してください。 –

関連する問題