2011-01-25 132 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