如何在 Windows 的发布模式下避免“program.exe 已停止工作”窗口?

Posted

技术标签:

【中文标题】如何在 Windows 的发布模式下避免“program.exe 已停止工作”窗口?【英文标题】:How to avoid "program.exe has stopped working" window in release mode on windows? 【发布时间】:2012-07-19 11:01:18 【问题描述】:

我正在开发 Visual Studio 2010 上的 C++ 软件。由于该软件应该在无法进行人工交互的服务器上运行,我真的需要摆脱这个“program.exe 已停止工作”窗口,在出现错误时在发布版本中弹出。我只是希望程序终止(可能还会给出错误消息,但不一定)并且不要让它保持阻塞等待某人单击“关闭程序”按钮。我不得不提一下,我的机器上有 64 位 Windows 7 Professional。

我已经阅读了几件事,例如:

_set_abort_behavior 函数。这解决了调用 abort() 时的情况,但对于诸如“向量下标超出范围”之类的错误,情况并非如此。

我知道我可以通过执行异常处理来解决其中一些错误,但并非所有错误都是异常,因此这并不能解决我的全部问题。

我还阅读了有关 Dr. Watson 调试器的一些内容,它应该以静默方式终止应用程序,但我的印象是该调试器不适用于 Windows 7。另外我不知道是否这个调试器会在发布模式下解决我的问题...

我不认为在我的整个机器上禁用错误报告是一个优雅的选择,尽管我读到这也可能是一种替代方案(不是我真正想要的)。

如何在 Visual Studio 中执行此操作?有什么我可以使用的设置吗?

有没有办法在 Visual Studio 中将所有错误转为异常,以便我可以通过异常处理机制解决问题? (如果这是一个愚蠢的问题,请宽容)

我期待您的建议。非常感谢您的宝贵时间!

最好的问候, 科妮莉亚

【问题讨论】:

最好的方法是首先消除导致崩溃的任何原因。 “我还阅读了有关 Dr. Watson 调试器的一些信息,它应该以静默方式终止应用程序” - 这是调试器的一种“特殊”用法(我从未听说过,调试器可以在应用程序崩溃的情况下自动启动)。当然也不适合发布模式。 @Chris:这是一个显而易见的答案!但实际的问题是,当应用程序在某个服务器上运行并且遇到错误并崩溃时,它仍然挂起,我不知道它是否实际上仍在运行或卡住(没有实现某种平台相关的观察者后端系统,这不是我想要的!)。所以我宁愿应用程序在遇到错误后关闭,然后我可以检查日志文件并看到它意外停止工作,所以我会知道我有问题。 @SChepurin:我以为会是这样。感谢您的回复! 如果你的应用程序在没有人工监督的情况下运行,它应该是一个系统服务,在这种情况下你不会有这个问题。 【参考方案1】:

你可以使用

SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);

MSDN documentation for SetErrorMode

你也可以refer here

希望这能解决您的问题...

【讨论】:

谢谢,这就是我想要的 :)【参考方案2】:

一个好方法是添加您自己的未处理异常过滤器(请参阅SetUnhandledExceptionFilter() docs),然后编写日志和小型转储,以便您可以进行所需的任何错误处理(例如关闭设备/句柄),然后您还有一个故障转储,您可以稍后分析。此答案中的有用信息:https://***.com/a/1547251/188414

【讨论】:

感谢您的回复。以前的解决方案解决了我的问题。但只是出于我的好奇,这个 SetUnhandledExceptionFilter(),它适用于所有错误还是仅适用于异常?问题是在 C++ 中并非所有错误都是异常(例如在 Java 中),例如来自未定义行为的错误不是异常。 在 Windows 上的原生 C++ 中有两种类型的异常——常规的 C++ 异常以及特定于 Windows 的结构化异常。这些可以捕获运行时错误,例如纯虚函数调用和在常规 C++ 中无法捕获的访问冲突。这使您的应用程序有机会在发生致命错误的情况下进行整理。在 MSDN 中查看更多信息:msdn.microsoft.com/en-us/library/windows/desktop/…【参考方案3】:

有时出现此错误只是因为您没有在scanf 中使用的值之前添加& 符号

尝试以下解决我的问题

来自

scanf("%d",code);

scanf("%d",&code);

【讨论】:

以上是关于如何在 Windows 的发布模式下避免“program.exe 已停止工作”窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免在开发模式下提供预编译资产?

如何在 Windows 命令提示符下使用 Dev C++ 编译器编译 C++ 程序?

SwiftUI - 如何在编辑模式下避免列表中的行缩进,但不使用 onDelete? (附代码/视频)

我如何知道Windows何时进入/退出睡眠模式或休眠模式?

在 Eclipse Corrosion 上调试 rust 不再适用于全新安装

如何在 Windows 命令提示符下使用被动 FTP 模式?