2011-05-07 57 views
4

我有一个Windows服务应用程序,WinXPe,有时因错误而失败,并显示一个消息框,用户下运行:如何完全捕获所有异常/错误

“的指令‘’ 在“00000000”中所引用的内存。该 内存不能为“read”。按OK 退出程序

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

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

该应用程序严重多线程,使用System.Threading.Timer和System.Threading.Thread。它使用一些第三方库,其中一个库使用本地互操作,我没有本地库的来源。

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

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

谢谢

+0

马蒂是正确的,这不是一个托管的异常,所以你平时的调试技术将无法正常工作。你使用P/Invoke来调用任何本地方法吗?您是否使用任何以非托管代码编写的第三方库?我们真的需要更多细节才能解决这个问题。如果您想自己尝试调试问题,则必须启用本地代码调试。 – 2011-05-07 09:20:54

+0

我没有办法修复本地库中的任何东西。我没有消息来源。它是基于PC的PLC“TwinCat”的一个组件。必须有一些办法来处理这个:( – chriszero 2011-05-07 09:30:26

+0

我想[我的选择](http:// stackoverflow。com/questions/5920154/how-to-catch-absolutely-all-exceptions-errors/5920184#5920184)应该可以正常工作** [使用单独的AppDomain](http://msdn.microsoft.com/en-us/库/ system.appdomain.load.aspx)**。对于绝对隔离,请使用[.NET Remoting](http://msdn.microsoft.com/zh-cn/library/kwdt6w2k(v = vs.71).aspx)从单独的进程使用本机库。另一个明显的道路是向[库创建者/维护者]报告一个错误(http://www.beckhoff.com/english/support/default.htm)_ – sehe 2011-05-07 10:01:31

回答

3

Vectored Exception Handling

这是(Structured Exception Handling)窗口SEH的一部分,IIRC这里要说的是,你不能,至少可以在这样的情况下,通知的珍贵的几个误区。

可能要直接写任何处理代码到本地的Win32 API(不安全/非托管代码),只有使用预分配(静态?)缓冲区,因为会有很多东西不可靠的在那一刻及时。

注意/远离线程,锁定原语,内存分配,磁盘IO;最好使用Windows默认的API,例如重新启动进程或产生一个小型转储和类似的东西

+0

我假设你错过了用.NET Framework编写C#程序的部分? – 2011-05-07 09:22:31

+0

@Cody:我假设你错过了这个问题本身?如果这不是问题,那就没有问题了。也''它使用一些第三方库,其中一个库使用本地互操作“' – sehe 2011-05-07 09:26:46

+0

但由于我无法访问本地源,我想我不能应用这个。或者我错过了什么? – chriszero 2011-05-07 10:16:33

3

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

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

+0

是的。但是如果你可以在某处使用非托管代码,你仍然可以拥有这个。许多具有非托管代码(依赖性)的库以及插件/ IoC习惯用语的兴起,讽刺地说,这种“问题”受到管理平台崛起的讽刺。如果您对可靠性/安全性有任何担忧,您应始终在您的应用程序中要求所有加载的程序集都是强名称,可验证的并且不要求完全信任。只有这样,我才会谨慎地同意Matti的陈述,您不需要担心这样的事情 – sehe 2011-05-07 09:23:21

+0

但是我必须处理这些选项? – chriszero 2011-05-07 09:37:40

+0

@chriszero:我......我们不得不等待一个知道Windows更好的人。 – 2011-05-07 09:39:18