C#如何调查我的服务意外停止的原因

时间:2012-10-07 12:55:07

标签: c# exception

我的服务在随机的时间内完美无缺,然后停止。

我正在捕捉我能看到的所有例外情况。 我已经在服务创建中添加了一个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

3 个答案:

答案 0 :(得分:7)

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

以下是我在项目中的表现:

首先,在我的Main()中,我接受以下事件:

AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler;

我定义了Handler,它只是将堆栈跟踪记录到一个文件并将其打印到控制台(虽然它与您无关,因为您将应用程序作为服务运行):

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

答案 1 :(得分:3)

如果您的服务已启动并正在运行,那么记录Run()对您来说效果不会太好,因为在该方法中没有多少执行。它基本上只会触发您的服务的OnStart方法。

正常情况是您的服务的OnStart方法启动一个全新的线程来运行实际服务。你需要在那个线程中进行日志记录。对try的整个threadstart方法进行try / catch,或者订阅AppDomain.CurrentDomain.UnhandledException应该会给你服务生成的任何异常,而不是捕获,这样你就可以记录它们。

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

答案 2 :(得分:1)

您始终可以执行简单的控制台应用程序,引用程序集,并从控制台应用程序调用代码并轻松调试它。 (通过远投最简单的选择)。