防止,避免或绕过AppCrash

时间:2011-08-18 19:57:39

标签: c# crash

我们得到一个看似随机的AppCrash,其中windows实际接管进程并关闭它,给出一些神秘的调试报告,包括NTDLL.dll,StackHash,User32.dll等。在报告中研究这些模块和信息超过一年的时间,我们收到的信息就更多了。我们能够做的最好的事情是将其缩小到我们的应用程序用来与通过TCP / IP进行通信的硬件进行交互的DLL。我们无法控制这个外部库,必须使用它,并且鉴于问题是随机的(不能在我们的最终复制,在PC重启时解决),我们似乎一直坚持它。

问题是我们的应用程序需要在不受人类监控的仪器上全天候运行。我需要检测应用程序何时崩溃,并向整个事件发出重启命令。问题是检测到AppCrash;应用程序内部不会生成异常(AppCrash在应用程序外部),并且没有任何日志记录会生成程序正在关闭的任何指示。

我们要做的是运行检查应用程序是否运行的服务,如果没有,它会发出重启命令来重启系统。但是,当显示AppCrash对话框时,它将使进程保持运行状态。

有没有办法阻止这些AppCrash通知,绕过它们,或者将它们设置为至少先关闭程序?请不要指向stackhash.com或使用MS错误报告;这些设备不具备互联网功能。我们也无法修复我们正在使用的DLL中的任何错误(OEM供应商不合作)。

3 个答案:

答案 0 :(得分:6)

一种方法可能是让应用程序定期告诉另一个服务它还活着并运行良好,而不是试图检测它何时崩溃。使用IPC,您可以每秒向监控服务发送一次心跳消息。

答案 1 :(得分:3)

您可以创建一个与DLL交互的包装应用程序,让您的应用程序将该包装器作为一个单独的进程启动,并且只与包装器应用程序通信(例如通过MemoryMappedFile并命名为Mutex)。 这样,当这样的AppCrash发生时,你的应用程序不会直接受到影响(只有包装器被杀死) - 然后它可以自动采取你认为必要的措施(例如让对话消失和/或使用Process.Kill去除它...)。

您甚至可以将该包装器设置为Windows服务,然后为其配置自动重启失败(在MMC /服务中)。

另一点是设置操作系统在这种情况下自动重启(如果这被归类为系统错误,那么你可以配置这样的行为)。

编辑 - 根据评论指向MemoryMappedFile信息的一些链接:

答案 2 :(得分:0)

考虑以下建议: http://forums.techguy.org/windows-7/1032392-solved-all-browsers-crashing-windows.html

在管理控制台中:

Reset WINSOCK entries to installation defaults: netsh winsock reset catalog
Reset IPv4 TCP/IP stack to installation defaults: netsh int ipv4 reset reset.log
Reset IPv6 TCP/IP stack to installation defaults: netsh int ipv6 reset reset.log

这解决了我使用firefox和chrome时遇到的相同stackhash问题。这似乎是一个通用的tcp / ip解决方案,也可以解决你的应用程序的tcp / ip问题。

我认为这些设置在某种程度上不合时宜 - 我的机器上有pcap和其他工具,所以它们可能会冲突吗?不知道。您是否摆弄了网络堆栈或设备设置?