2009-12-07 26 views
6

我們有一個傳統的基礎設施建設爲每晚構建(在Perl中實現)編譯,鏈接和單元測試我們的應用軟件/插件。在Windows上,如果單元測試過程崩潰,這會彈出一個Modal對話框,它會「鎖定」我們的構建場。防止模態對話框上的win32進程崩潰

有沒有一種方法(win32 API調用,系統配置,env var,某事......)禁用此行爲使子進程在崩潰時立即終止,而沒有模態對話框和非零退出狀態?

感謝,--DD

PS:我們編譯在Windows SEC(結構化異常處理),能夠使用捕捉(...),以「抓」崩潰,從而避免這一問題大部分時間,但有時這還不夠,因爲當然有些崩潰是不可恢復的(例如,如果它們損壞了堆棧)。

回答

6

根據誰投擲對話,你可能必須結合多種方法。

 
    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); 

...將關閉一組對話框。

+1

您可以將它們組合爲:SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); – 2011-03-11 08:31:43

+3

你不僅可以將它們結合起來,你需要將它們結合起來;旗幟不堆疊,當你設置第二個時,你將失去第一個 – 2011-04-29 14:17:07

0
  1. 請勿使用「catch(...)」語句,因爲那樣您可能會錯過進行單元測試的觀點。
  2. 您需要的是非模態對話框,因爲模態對話框用於阻止用戶進行任何進一步的操作並執行程序(在您的情況下單元測試運行)掛起,直到用戶做出選擇。現在,崩潰對話框是無法避免的,但您需要了解您的單元測試框架如何處理這些情況。我會說你錯過了周圍的單元測試框架的東西,因爲如果我在我的應用程序有一個崩潰我只是從如Boost.Test存根日誌信息。

如果你運行你的單元測試作爲一個子進程,它不應該阻止你的構建機器人,但:如果單元測試用例失敗,你不應該繼續在我看來的建設過程。

0

您可以使用WSH爲「腳本」你的窗戶。

有了它,你可以「模擬」有人點擊了模態窗口的「接受」按鈕,或發送ESC鍵關閉。

問候。

3

您需要添加一個捕獲所有異常的「未處理的異常處理程序」:在初始化代碼中調用SetUnhandledExceptionFilter(handler),它將調用處理程序例程。真的很簡單。

我使用來自舊文章的示例代碼,包括一個名爲minidumper的文件,調用暴露的函數,就完成了。

Here's some more example code,這會彈出一個對話框不同,但你可以改變簡單地將消息寫入日誌文件或類似。

如果你正在寫一個純粹的.NET應用程序,那麼你會更感興趣this article

+0

Segfaults不被異常處理程序捕獲。 – 2014-09-12 07:22:34

+0

@IanThompson你是什麼意思? Windows上的Segfault?你的意思是0xc000005'訪問被拒絕'錯誤之一? – gbjbaanb 2014-09-12 07:28:16

+0

是的,任何發生信號而不是拋出異常的東西。例如。 class A {public:int b;}; A * nu_a = NULL; nu_a-> b = 5;會給你:訪問衝突寫入位置0x00000000。這不是一個例外,不會被任何異常處理程序捕獲。 – 2014-09-15 03:52:30

0

我仍然使用一個名爲RTVReco的舊程序。這只是一個按鈕推送應用程序,並且非常易於使用。它有一段時間沒有更新,但它仍然是我見過的最簡單的一個。