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

问题描述:

我正在使用Visual Studio 2010在C++上开发一个软件。由于这个软件应该在没有人工交互的服务器上运行,我真的需要摆脱这个“program.exe已停止工作“在发布错误的情况下弹出窗口。我只是希望程序终止(也许还会给出错误消息,但不一定),并且不会阻止程序等待某人单击“关闭程序”按钮。我不得不提,我的机器上有64位Windows 7专业版。如何在Windows上以发布模式避免“program.exe已停止工作”窗口?

我看了一下几件事情,如:

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

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

  • 我也读了一些关于Dr.Watson调试器的消息,它应该是默默地终止应用程序,但我的印象是这个调试器不适用于Windows 7.另外我不知道这个调试器将解决我的问题在释放模式...

  • 我不觉得在我的整个机器上禁用错误报告是一个优雅的选择,虽然我读了这也可以是一个替代品(不是真的我要拿)。

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

是否有办法在Visual Studio中打开异常中的所有错误,以便我可以解决异常处理机制的问题? (如果这是一个愚蠢的问题,请耐心等待)

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

最好的问候, 科妮莉亚

+2

最好的办法是首先摆脱造成事故的任何事物。 – chris 2012-07-19 11:02:42

+0

“我还读过一些关于Dr.Watson调试器的信息,这个调试器应该静静地终止应用程序” - 这对于调试器来说是“特殊的”用法(我从来没有听说过这种用法,调试器可以自动启动以防万一应用程序崩溃)。当然不适用于发布模式。 – SChepurin 2012-07-19 11:24:49

+0

@Chris:这是一个明显的答案!但实际的问题是,当应用程序在某个服务器上运行并遇到错误并崩溃时,它仍然是挂起的,我不知道它是否实际上仍在运行或停滞(不实现某种依赖于平台的观察器后端系统,这不是我想要的!)。所以我宁愿应用程序在包含错误后关闭,然后我可以检查日志文件,看到它意外停止工作,所以我会知道我有一个问题。 – 2012-07-19 15:13:02

您可以使用

SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); 

MSDN documentation for SetErrorMode

您也可以refer here

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

+0

谢谢,这解决了我的问题! – 2012-07-19 15:04:00

+0

谢谢! 2015-11-09 19:34:59

+0

谢谢,这是我想要的:) – 2017-11-20 09:49:23

一个好方法是添加自己的未处理的异常过滤器(请参阅SetUnhandledExceptionFilter()文档),然后编写一个日志和一个小转储,以便您可以执行任何需要的错误处理(例如关闭设备/句柄),并且还会崩溃转储,您可以稍后分析。在这个答案的有用信息:https://*.com/a/1547251/188414

+0

谢谢你的回复。以前的解决方案解决了我的问题但是为了我的好奇心,这个SetUnhandledExceptionFilter(),它适用于所有错误还是仅仅是异常?问题是,在C++中,并不是所有的错误都是异常的(例如在Java中),例如来自未定义行为的错误不是例外。 – 2012-07-19 15:07:30

+0

在Windows上的本地C++中,有两种类型的异常 - 常规C++异常,以及特定于Windows的结构异常。这些可以捕获运行时错误,如纯虚函数调用和访问违例,这些在常规C++中无法捕捉。这使您的应用程序有机会在致命错误的情况下进行整理。查看更多MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657%28v=vs.85%29.aspx – 2012-07-19 16:00:04

+0

非常有趣,谢谢。我会看看它。 – 2012-07-20 12:32:36

只是因为你还没有加入您在scanf

用于尝试它解决了我的问题

以下值前 &标志有时会出现此错误
scanf("%d",code); 

scanf("%d",&code);