如何捕获绝对所有异常/错误

时间:2011-05-07 09:12:51

标签: c# .net windows-services error-handling

我有一个在WinXPe下运行的Windows服务应用程序,它有时会因错误而失败并向用户显示一个消息框:

  

“指令”“   在“0x00000000”引用内存。该   内存无法“读取”。按“确定”   退出程序

如果用户点击“确定”,则服务正在重新启动。

我试图通过在AppDomain.CurrentDomain.UnhandledException注册一个事件处理程序来捕获所有未处理的异常 在处理程序中,我记录异常详细信息并退出应用程序。 但是我上面提到的错误不是从“UnhandledException”处理的。

应用程序是多线程的,使用System.Threading.Timer和System.Threading.Thread。并且它使用了一些第三方库,其中一个库使用本机互操作,我没有本机库的来源。

我试图用附加的调试器指出错误,但错误没有显示;) 应用程序必须在错误发生前几天运行。

我需要一种处理这种错误的方法。

由于

2 个答案:

答案 0 :(得分:3)

该错误不是托管例外。这是一种较低级别的内存访问冲突。基本上是本机代码中的NULL指针访问。

这是您应该在托管代码中完全保护的内容,因此它可能是您的本机库之一或您使用它们的方式。如果错误仅在执行几天后出现,那么您最好先进行任何本机库调用,检查其签名并确保将有效数据传递给它们。

答案 1 :(得分:3)

请参阅Vectored Exception Handling

这是Windows SEHStructured Exception Handling)的一部分,而IIRC这里几乎没有任何错误,在这种情况下至少无法通知您。

可能希望将任何处理代码直接写入本机WIN32 API(在不安全/非托管代码中)并仅使用预分配(静态?)缓冲区,因为会有很多东西那个时刻不可靠。

小心/远离线程,锁定原语,内存分配,磁盘IO;最好使用Windows默认API,例如重启过程或生成minidump等等