2012-10-07 70 views
1

我的服务工作完全正常,随机时间量然后停止。C#如何调查为什么我的服务意外停止

我正在捕捉所有可以看到的异常。 我已经添加了一个try/catch创建服务,试图获得某种错误,但我什么也没有得到。该服务刚刚停止。

 try 
     { 
       ServiceBase[] ServicesToRun; 
       ServicesToRun = new ServiceBase[] { new my_service() }; 
       ServiceBase.Run(ServicesToRun); 
     } 
     catch (Exception e) 
     { 
      logEvent(e); // Log any errors to a .txt file. 
     } 

事件查看器显示以下内容:

Faulting application name: my_service.exe, version: 0.9.2.1, time stamp: 0x50717154 
Faulting module name: ntdll.dll, version: 6.1.7601.17514, time stamp: 0x4ce7b96e 
Exception code: 0xc0000005 
Fault offset: 0x00055f99 
Faulting process id: 0x%9 
Faulting application start time: 0x%10 
Faulting application path: %11 
Faulting module path: %12 
Report Id: %13 
+0

您可以尝试将visual studio调试器附加到服务进程并等待发生错误? – pilotcam

+0

@CathalMF你有所进步吗?我们帮助你了吗? – mbarthelemy

回答

7

这是不可能猜到了什么问题你给的信息。但是您可以尝试使用技巧来捕获每个未捕获的异常,并将其记录下来。

这是我在我的项目怎么办:

首先,在我的主要(),我suscribe以下事件:

AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler; 

我定义了处理程序,它只是记录的堆栈跟踪到一个文件并打印到控制台(尽管它无关你,因为你运行你的应用程序作为服务):

private static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e){ 
     try{ 
      Logger.Append(Severity.CRITICAL, "Unhandlable error : "+e.ExceptionObject); 


     }catch{} 
     Console.WriteLine("Unhandlable error : "+e.ExceptionObject); 
     Environment.Exit(10); 
    } 
+0

这帮了我。问题是在“finally”块中发生了异常,这就是为什么我没有在日志中看到它的原因。不要像我一样愚蠢= / – wsbaser

3

如果您的服务已启动并运行,记录周围Run()不会对你有太大的好处,因为在这种方法中没有太多的执行。它基本上只会触发你的服务的OnStart方法。

正常情况下,您的服务的OnStart方法启动一个全新的线程来运行实际的服务。在那个线程中你需要做日志记录。围绕Thread的整个threadstart方法放置一个try/catch,或者订阅AppDomain.CurrentDomain.UnhandledException应该会给你任何例外,你的服务正在生成并且没有捕获,所以你可以记录它们。

虽然(这很难知道,因为你没有显示服务的代码)的问题似乎是服务在ntdll.dll崩溃,这可能是一个pinvoke(调用一个外部本地DLL),其中意味着你可能没有得到任何例外。调试本机崩溃是一个完全不同的科学。

1

您可以随时做一个简单的控制台应用程序,参考程序集并从控制台应用程序中调用代码并轻松地进行调试。 (通过远投最简单的选择)。