2012-07-19 71 views
12

我正在使用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

回答

19

您可以使用

SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); 

MSDN documentation for SetErrorMode

您也可以refer here

希望這將解決您的問題...

+0

謝謝,這解決了我的問題! – 2012-07-19 15:04:00

+0

謝謝! <3 <3 <3 <3 – 2015-11-09 19:34:59

+0

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

0

一個好方法是添加自己的未處理的異常過濾器(請參閱SetUnhandledExceptionFilter()文檔),然後編寫一個日誌和一個小轉儲,以便您可以執行任何需要的錯誤處理(例如關閉設備/句柄),並且還會崩潰轉儲,您可以稍後分析。在這個答案的有用信息:https://stackoverflow.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

-1

只是因爲你還沒有加入您在scanf

用於嘗試它解決了我的問題

以下值前 &標誌有時會出現此錯誤
scanf("%d",code); 

scanf("%d",&code);