繁体   English   中英

Windows服务异常未处理

[英]Windows service exception not handled

我有基于ServiceBase类的常规C#服务。 此服务在启动c ++动态链接库上加载。 有时,非托管代码中的服务崩溃。 不幸的是,事件查看器只给出了非常简短的描述。 这是他的消息看起来如何:

应用程序:StreamMapService.exe Framework版本:v4.0.30319描述:由于未处理的异常,进程已终止。 异常信息:异常代码c0000005,异常地址00000012“。

99%的确定性问题出在非托管代码中。 问题是这种情况很少发生(通常每天一次),并且仅在作为服务运行时发生。 在调试器下一切都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("sender@domain.com", "sender", System.Text.Encoding.UTF8);
            MailAddress to = new MailAddress("receiver@domain.com");
            MailMessage message = new MailMessage(from, to);
            message.Body = sb.ToString();
            message.Subject = "StreamMapService crash info";
            client.Send(message);
            throw;
        }
    }

为了测试这个异常处理程序,我在非托管代码的某些部分生成了测试异常。 当我在调试器或命令行下运行服务时,所有功能都正常。

我收到有关异常信息的电子邮件消息(最重要的是它包含发起非托管异常的callstack)。

但是,当我将此程序作为系统服务运行时(从控制面板 - >管理工具 - >服务),服务明显崩溃(它在tcp界面上没有响应,事件查看器也包含崩溃信息)但我没有收到任何电子邮件。

看起来在这种情况下甚至不会调用异常处理程序。 我试图将异常信息写入文件,但同样的情况也是如此。

因此,当在调试器或命令行下运行时,会正确记录callstack信息。 当作为系统服务运行时没有任何反应。 在这种情况下,异常处理似乎无法正常运行。

异常可能是在另一个线程上引发的。 尝试在代码之前添加以下内容以捕获任何未处理的异常:

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

事件处理程序应具有以下签名:

void CurrentDomain_UnhandledException(
    object sender, UnhandledExceptionEventArgs e) {
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM