我有一个在 WinXPe 下运行的 Windows 服务应用程序,它有时会因错误而失败并向用户显示一个消息框:
"The instruction at “” referenced memory at “0x00000000”. The memory could not be “read.” Press OK to exit the program
如果用户单击“确定”,服务将重新启动。
我试图通过在 AppDomain.CurrentDomain.UnhandledException
注册事件处理程序来捕获所有未处理的异常
在处理程序中,我记录异常详细信息并退出应用程序。
但是我上面提到的错误不是从“UnhandledException”处理的。
该应用程序是大量多线程的,使用 System.Threading.Timer 和 System.Threading.Thread。它正在使用一些第三方库,其中一个库正在使用 native 互操作,我没有 native 库的来源。
我试图用附加的调试器指出错误,但错误没有出现;) 应用程序必须在错误发生前运行几天。
我需要一种方法来处理这样的错误。
谢谢
最佳答案
参见 Vectored Exception Handling
这是 Windows 的一部分 SEH ( Structured Exception Handling ) 和 IIRC 是在这种情况下至少无法通知您的宝贵错误。
您将可能希望将任何处理代码直接写入 native WIN32 API(在不安全/非托管代码中)并仅使用预分配(静态?)缓冲区,因为会有很多事情在那一刻不可靠。
提防/远离线程、锁定原语、内存分配、磁盘 IO;最好使用 Windows 默认 API,例如重新启动进程或生成小型转储和类似的东西
关于c# - 如何绝对捕获所有异常/错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5920154/