我有一个在WinXPe下运行的Windows服务应用程序,它有时会因错误而失败并向用户显示一个消息框:
“指令”“ 在“0x00000000”引用内存。该 内存无法“读取”。按“确定” 退出程序
如果用户点击“确定”,则服务正在重新启动。
我试图通过在AppDomain.CurrentDomain.UnhandledException
注册一个事件处理程序来捕获所有未处理的异常
在处理程序中,我记录异常详细信息并退出应用程序。
但是我上面提到的错误不是从“UnhandledException”处理的。
应用程序是多线程的,使用System.Threading.Timer和System.Threading.Thread。并且它使用了一些第三方库,其中一个库使用本机互操作,我没有本机库的来源。
我试图用附加的调试器指出错误,但错误没有显示;) 应用程序必须在错误发生前几天运行。
我需要一种处理这种错误的方法。
由于
答案 0 :(得分:3)
该错误不是托管例外。这是一种较低级别的内存访问冲突。基本上是本机代码中的NULL指针访问。
这是您应该在托管代码中完全保护的内容,因此它可能是您的本机库之一或您使用它们的方式。如果错误仅在执行几天后出现,那么您最好先进行任何本机库调用,检查其签名并确保将有效数据传递给它们。
答案 1 :(得分:3)
请参阅Vectored Exception Handling
这是Windows SEH(Structured Exception Handling)的一部分,而IIRC这里几乎没有任何错误,在这种情况下至少无法通知您。
你 可能希望将任何处理代码直接写入本机WIN32 API(在不安全/非托管代码中)并仅使用预分配(静态?)缓冲区,因为会有很多东西那个时刻不可靠。
小心/远离线程,锁定原语,内存分配,磁盘IO;最好使用Windows默认API,例如重启过程或生成minidump等等