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

本文关键字:异常 错误 何捕获 | 更新日期: 2023-09-27 17:55:08

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

"指示在" 在"0x00000000"处引用内存。这 内存无法"读取"。按确定 退出程序

如果用户单击"确定",则服务将重新启动。

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

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

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

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

谢谢

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

请参阅向量异常处理

这是 Windows SEH(结构化异常处理)和 IIRC 的一部分,在这种情况下,您至少无法收到通知的错误很少。

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

当心/远离线程,锁定原语,内存分配,磁盘IO;最好使用Windows默认API来,例如重新启动进程或生成小型转储等

该错误不是托管异常。这是较低级别的内存访问冲突。本质上是本机代码中的 NULL 指针访问。

这是你应该在托管代码中完全保护的东西,所以它可能是你的本机库之一或你使用它们的方式。如果错误仅在执行几天后出现,则最好先通过任何本机库调用,检查其签名并确保向其传递有意义的数据。