我的服务在一段随机的时间内工作得很好,然后就停止了。
我正在捕获我能看到的所有异常。我在创建服务的过程中添加了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发布于 2012-10-07 21:06:32
无法猜测你所提供的信息出了什么问题。但是您可以尝试使用一个技巧来捕获每个未捕获的异常,并将其记录下来。
以下是我在我的项目中所做的:
首先,在我的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);
}发布于 2012-10-07 21:07:46
如果您的服务已经启动并在运行,那么围绕Run()进行日志记录不会给您带来太大的好处,因为在该方法中不会执行太多内容。它基本上只是触发你的服务的OnStart方法。
通常情况下,服务的OnStart方法会启动一个全新的线程来运行实际的服务。它在你需要做日志记录的线程中。在线程的整个threadstart方法周围放置一个try/catch,或者订阅AppDomain.CurrentDomain.UnhandledException,应该会给出任何您的服务正在生成但没有捕获的异常,以便您可以记录这些异常。
然而,问题(很难知道,因为您没有显示服务的代码)似乎是服务在ntdll.dll中崩溃,这可能是一个pinvoke (调用外部本机DLL),这意味着您可能无法捕获任何异常。调试本机崩溃是一门完全不同的科学。
发布于 2012-10-07 21:28:45
您总是可以做一个简单的控制台应用程序,引用程序集,并从控制台应用程序调用代码并轻松地对其进行调试。(这是最简单的选择)。
https://stackoverflow.com/questions/12769022
复制相似问题