1

我的服务在随机的时间内工作得很好,然后就停止了。

我正在捕捉我能看到的所有异常。我在服务创建周围添加了一个 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
4

3 回答 3

7

无法猜测您提供的信息出了什么问题。但是您可以尝试使用一种技巧来捕获每个未捕获的异常,并将其记录下来。

这是我在项目中的做法:

首先,在我的 Main() 中,我订阅了以下事件:

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);
    }
于 2012-10-07T13:06:32.177 回答
3

如果您的服务已启动并正在运行,那么四处登录Run()对您没有多大好处,因为在该方法中没有执行任何操作。它基本上只会触发您的服务OnStart方法。

正常情况是您的服务OnStart方法启动一个全新的线程来运行实际服务。您需要在该线程中进行日志记录。在该线程的整个 threadstart 方法周围放置一个 try/catch,或订阅 AppDomain.CurrentDomain.UnhandledException 应该会为您提供服务正在生成但未捕获的任何异常,以便您可以记录它们。

但是问题(这很难知道,因为您没有显示服务的代码)似乎是服务在 ntdll.dll 中崩溃,这可能是 pinvoke(调用外部本机 DLL),这意味着您可能不会获取要捕获的任何异常。调试本机崩溃是一门完全不同的科学。

于 2012-10-07T13:07:45.827 回答
1

你总是可以做一个简单的控制台应用程序,引用程序集,并从控制台应用程序调用代码并轻松调试它。(远射最简单的选择)。

于 2012-10-07T13:28:44.593 回答