2011-01-25 4 views
3

저는 ServiceBase 클래스를 기반으로하는 일반 C# 서비스를 가지고 있습니다. 이 서비스는 시작 C++ 동적 링크 라이브러리에로드됩니다. 관리되지 않는 코드에서 서비스가 중단되는 경우가 있습니다. 불행히도 이벤트 뷰어는 이것에 대한 간단한 설명 만 제공합니다.Windows 서비스 예외가 처리되지 않았습니다.

응용 프로그램 : StreamMapService.exe 프레임 워크 버전 : v4.0.30319 설명 : 이것은 하나의 경우 자신의 메시지를 보는 방법 인 프로세스로 인해 처리되지 않은 예외로 종료되었습니다. 예외 정보 :. 예외 코드 C0000005 예외 주소 00,000,012는 "

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

내가 관리되지 않는 코드의 일부에 시험 예외를 생성이 예외 핸들러를 테스트하려면를 내가 실행할 때 모든 확인을 작동 디버거 또는 명령 줄에서 서비스를 실행하십시오.

예외에 대한 정보가 포함 된 전자 메일 메시지를받습니다. 가장 중요한 것은 관리되지 않는 예외가 발생한 callstack입니다.

하지만 시스템 서비스 (제어판 -> 관리 도구 -> 서비스)에서이 프로그램을 실행할 때 서비스가 분명히 중단됩니다 (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를 참조하십시오. –

관련 문제