我的服务在随机的时间内完美无缺,然后停止。
我正在捕捉我能看到的所有例外情况。 我已经在服务创建中添加了一个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 :(得分: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)
您始终可以执行简单的控制台应用程序,引用程序集,并从控制台应用程序调用代码并轻松调试它。 (通过远投最简单的选择)。