2011-01-25 76 views
3

我有基於ServiceBase類的常規C#服務。此服務在啓動C++動態鏈接庫時加載。有時候發生在非託管代碼中的服務崩潰。不幸的是,事件查看器只給出了非常簡短的描述。這是怎麼看起來之一,如果他的信息:未處理Windows服務異常

應用:StreamMapService.exe Framework版本:v4.0.30319 說明:該進程被終止,由於未處理的異常。 異常信息:異常代碼0000005,異常地址00000012"

有了99%的把握的問題是在非託管代碼的問題是,當作爲服務拼命地跑這一點很少(一般是一天一次),並只。在調試器一切正常要找出有問題的代碼,我在下面的方式編輯我的主要方法:。

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; 
     } 
    } 

爲了測試我生成的測試異常在非託管代碼的某些部分該異常處理程序一切正常運作,當我運行在調試器或命令行下的服務

我收到有關異常信息的電子郵件(最重要的是它包含發生非託管異常的調用堆棧)。當我運行這個程序作爲系統服務(從控制面板 - >管理工具 - >服務)服務明顯崩潰(它變得對tcp接口沒有反應,並且事件查看器包含崩潰信息),但我沒有收到任何電子郵件。

它看起來像在這種情況下甚至沒有調用異常處理程序。我試圖寫入異常信息到文件,但是也發生了這種情況。

因此,在調試器或命令行下運行時,正確記錄了callstack信息。當系統服務運行時什麼也沒有發生。看來在這種情況下,異常處理不能正常工作。

+0

打開命令提示符,調試器和以管理員身份運行,然後告訴情況。當它作爲服務運行時,它是否與之相同?並在調試之前將其框架版本更改爲低於或等於3.5 – PawanS 2011-01-25 09:27:33

回答

1

異常可能會在另一個線程上拋出。嘗試以捕捉任何未處理的異常代碼之前添加以下:

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

事件處理程序應具有以下特徵:

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

這解決了問題,但只是部分。當我更徹底地檢查了我的調用堆棧時,發現它不包含非託管方法(我寫的信息對此並不正確)。 – truthseeker 2011-01-25 11:02:45