2010-08-05 53 views
7

如果我運行一個拋出異常(內置調試)的可執行文件,我會收到一個錯誤對話框,說「Debug斷言失敗」,然後是一些有關異常的信息。發生這種情況時,程序的執行被暫停,直到我選擇「中止」,「重試」或「忽略」選項中的一個。如何禁用「Microsoft Visual C++調試庫」異常對話框?

問題是,我從腳本運行了很多應用程序,並且如果其中一個引發異常,它會暫停我的腳本直到它被處理。

有沒有辦法禁用這種異常處理機制?

編輯:我記得讀了一個註冊表鍵,前一段時間,這將禁用顯示的錯誤消息。有人知道嗎?

回答

1

你可以建立你的可執行文件作爲發佈嗎?如果我記得,那應該停止出現斷言錯誤。

+0

即使他們是我的應用程序,在釋放我可以不建立他們。 – Geo 2010-08-05 07:28:15

+0

@Geo:如果你不能修改應用程序本身,那麼一種選擇是編寫一個小程序,它定期檢查這個窗口的存在併發送關鍵筆劃'I'給它。我是這樣做的,這對我有很大的幫助。 – Naveen 2010-08-05 07:36:25

+0

是不是有我們可以修改以實現類似效果的註冊表項? – Geo 2010-08-05 07:46:24

4

如果你可以修改應用程序(一個或多個)的來源,看看在_CrtSetReportMode功能,如:

_CrtSetReportMode(_CRT_ASSERT, 0); 

更多見msdn

2

如果您可以修改源,則需要修改中止行爲(由assert調用)以禁止中止/重試/忽略對話框。

在中止時,仍然會產生一個故障轉儲(默認情況下),所以您不會失去重要的東西。

此外,您可以調整斷言行爲以僅寫入stderr。如果中止行爲足以滿足您的需求,則不需要此操作。注意:_Crtxxx調用僅在調試版本(/ Zi)中有效。

禁用中止/重試/忽略的最小更改。取消註釋_Crt調用幷包含crtdbg.h以修改調試模式構建中的斷言行爲。

#include <stdlib.h> 
//#include <crtdbg.h> 
int main(int argc,char **argv); 
int main(int argc,char **argv) 
{ 
    // ON assert, write to stderr. 
    //_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE); 
    //_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); 

    // Suppress the abort message 
    _set_abort_behavior(0, _WRITE_ABORT_MSG); 

    abort(); 
    return 0; 
} 

msdn assert mode