저는 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 인터페이스에서 반응이 없으며 이벤트 뷰어에 충돌 정보가 포함되어 있음).
예외 처리기가이 경우에도 호출되지 않는 것처럼 보입니다. 예외 정보를 파일에 쓰려고했지만이 경우에도 마찬가지입니다.
따라서 디버거 또는 명령 줄에서 실행될 때 콜 스택 정보가 올바르게 기록됩니다. 시스템 서비스로 실행될 때 아무 일도 일어나지 않습니다. 이 조건에서 예외 처리가 올바르게 작동하지 않는 것 같습니다.
명령 프롬프트를 엽니 및 디버거를하고 관리자로 실행하고 말할 처리되지 않은 예외를 포착하기 위해 코드 전에 다음을 추가하십시오 그 상황. 당신이 그것을 서비스로 운영 할 때와 마찬가지로 진절머리 나는가? 그리고 디버깅하기 전에 프레임 워크 버전을 3.5 이하로 변경하십시오. – PawanS