2011-01-25 2 views
3

У меня есть регулярная служба C#, основанная на классе ServiceBase. Эта служба загружается при запуске библиотеки динамических ссылок C++. Иногда случается, что сбой службы в неуправляемом коде. К сожалению Event Viewer дает только очень краткое описание этого. Вот как выглядит один, если его сообщения:Исключение службы Windows не обрабатывается

Применение: StreamMapService.exe Framework Version: v4.0.30319 Описание: Процесс был прерван из-за необработанного исключения. Исключение Info:. Код исключения c0000005, адрес исключения 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, а также средство просмотра событий содержит информацию о сбоях), но я не получаю ни одной электронной почты.

Похоже, что обработчик исключений даже не вызывается в этом случае. Я пытался написать информацию об исключении в файл, но это то же самое происходит.

Таким образом, при запуске под отладчиком или из командной строки информация о вызове корректно регистрируется. При запуске в качестве системного сервиса ничего не происходит. Похоже, что обработка исключений работает неправильно в этом состоянии.

+0

открыть окно командной строки и ваш отладчик и запустить в качестве администратора, то сказать ситуация. Это chrashing так же, как, когда вы запускаете его как службы. И до отладки изменения его версия рамки до ниже или равна 3.5 – PawanS

ответ

1

Исключение, вероятно, выбрано в другой поток. Попробуйте добавить следующее перед кодом, чтобы поймать любые необработанные исключения:

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

Обработчик должен иметь следующую подпись:

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

Эта решена проблема, но только частично. Когда я осмотрел свой callstack более подробно, я обнаружил, что он не содержит неуправляемых методов (информация, о которой я написал, не является правильным извините за это). – truthseeker

+0

Через некоторое время он неожиданно прекратил функционировать. При работе в качестве обычного exe-файла или в режиме отладчика обработка исключений работает правильно. – truthseeker

+0

Итак, событие AppDomain.UnhandledException не поднято? См. Http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx для получения дополнительной информации о том, что может вызвать это. –

Смежные вопросы