防止,避免或绕过AppCrash

本文关键字:AppCrash 防止 | 更新日期: 2023-09-27 18:06:07

我们得到一个看似随机的AppCrash,其中windows实际上接管了进程并关闭它,给出一些神秘的调试报告,其中包括NTDLL.dll, StackHash, User32.dll等。花了一年多的时间研究这些模块和报告中的信息,我们得到的信息并没有比以前多多少。我们所能做的最好的事情是将其缩小到我们的应用程序用于与通过TCP/IP通信的硬件进行交互的DLL。我们无法控制这个外部库,必须使用它,并且考虑到问题是随机的(不能在我们端复制,在PC重新启动时自行解决),我们似乎被它困住了。

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

我们想做的是运行一个服务来检查应用程序是否正在运行,如果没有,它会发出一个reboot命令来重新启动系统。然而,当AppCrash对话框显示时,它使进程继续运行。

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

防止,避免或绕过AppCrash

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

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

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

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

编辑-根据注释一些链接到MemoryMappedFile信息:

  • http://blogs.msdn.com/b/salvapatuel/archive/2009/06/08/working - -内存映射文件-网- 4. - aspx
  • http://weblogs.asp.net/gunnarpeipman/archive/2009/06/21/net-framework-4-0-using-memory-mapped-files.aspx
  • http://blogs.msdn.com/b/bclteam/archive/2011/06/06/memory-mapped-file-quirks.aspx
  • http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile.aspx

考虑以下建议: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和其他工具,所以也许它们冲突?不知道。您是否更改了网络堆栈或网卡设备设置?