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

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

我有一个在 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/

相关文章:

c# - 无法从 Windows 服务访问驱动器映射网络共享上的文件

c# - 如何在 Moq 中使用 lambda 语法设置现有模拟?

C# MVC 在默认路由上使用参数

c# - ASP.Net 表单抛出 SQL 异常

c# - 我应该使用 System.Security.Cryptography 命名空间中的哪个 AES 类?

c# - 按照可配置的时间表运行任务的最有效方式

c# - 在 .NET 应用程序中显式导致 AccessViolationException

.net - 如何将 C++ 字符串转换为 .NET 字符串^?

c# - 如何在VS/Resharper中生成对象-对象映射

C++ : Running a background task all the time on machine