首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#如何调查我的服务意外停止的原因

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

Stack Overflow用户
提问于 2012-10-07 20:55:07
回答 3查看 3.6K关注 0票数 1

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

我正在捕获我能看到的所有异常。我在创建服务的过程中添加了try/catch,以尝试获取某种错误,但我什么也得不到。服务就会停止。

代码语言:javascript
复制
        try
        {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] { new my_service() };
                ServiceBase.Run(ServicesToRun);
        }
        catch (Exception e)
        {
            logEvent(e);   // Log any errors to a .txt file.
        }

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

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2012-10-07 21:06:32

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

以下是我在我的项目中所做的:

首先,在我的Main()中,我对以下事件表示怀疑:

代码语言:javascript
复制
AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler;

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

代码语言:javascript
复制
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);
    }
票数 7
EN

Stack Overflow用户

发布于 2012-10-07 21:07:46

如果您的服务已经启动并在运行,那么围绕Run()进行日志记录不会给您带来太大的好处,因为在该方法中不会执行太多内容。它基本上只是触发你的服务的OnStart方法。

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-10-07 21:28:45

您总是可以做一个简单的控制台应用程序,引用程序集,并从控制台应用程序调用代码并轻松地对其进行调试。(这是最简单的选择)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12769022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档