2009-12-07 5 views
6

私たちはアプリケーション/プラグインのコンパイル、リンク、ユニットテストのために、夜間ビルド(Perlで実装)用のレガシービルドインフラストラクチャを用意しています。 Windowsでは、単体テストプロセスがクラッシュすると、モーダルダイアログがポップアップし、ビルドファームを「ロック」します。win32プロセスクラッシュでのモーダルダイアログの防止

この動作を無効にして、代わりにモーダルダイアログやゼロ以外の終了ステータスを伴うクラッシュ時に子プロセスを終了させる方法(win32 APIコール、システム設定、env var、何か...) ?

おかげで、--DD

PS:私たちは、そのためのほとんどをこの問題を回避、キャッチ(...)を使用しての「キャッチ」クラッシュできるようにするには、Windows上のSEC(構造化例外処理)を使用してコンパイルもちろん、それだけでは不十分です。もちろん、いくつかのクラッシュは回復できません(スタックが破損した場合など)。

答えて

6

誰がダイアログを投げているかによって、複数のアプローチを組み合わせなければならない場合があります。

 
    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); 

... 1組のダイアログをシャットダウンします。

+1

これらを以下のように組み合わせることができます。SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); –

+3

あなたはそれらを組み合わせることができるだけでなく、それらを組み合わせる必要があります。フラグはスタックしません。2番目のフラグを設定すると、最初のフラグが失われます –

0
  1. 単体テストのポイントを逃すことができるため、「catch(...)」ステートメントは使用しないでください。
  2. あなたが必要とするのは、非モーダルダイアログです。モーダルダイアログは、ユーザーがそれ以上のアクションをブロックするためのもので、ユーザーが選択するまでプログラム実行(あなたの場合は単体テストが実行されます)がハングアップします。今、クラッシュダイアログを避けることはできませんが、ユニットテストフレームワークがこれらの状況をどのように処理するかを確認する必要があります。アプリケーションでクラッシュした場合、Boost.Testスタブからのログメッセージが表示されるだけです。

ユニットテストを子プロセスとして実行する場合は、ビルドボットをブロックすべきではありませんが、単体テストケースが失敗した場合は、自分の意見でビルドプロセスを続行しないでください。

0

WSHを使用すると、ウィンドウを「スクリプト」できます。

これで、誰かがモーダルウィンドウの「同意する」ボタンをクリックしたことを「シミュレート」するか、ESCキーを送信して閉じることができます。

よろしくお願いいたします。

3

すべての例外をキャッチする「未処理の例外ハンドラ」を追加する必要があります。初期化コードにSetUnhandledExceptionFilter(ハンドラ)を呼び出し、ハンドラルーチンを呼び出します。本当に簡単です。

古い記事のサンプルコードを使用し、minidumperというファイルを含めて、公開された関数を呼び出すと完了です。

Here's some more example codeこれは別のダイアログをポップしますが、これを変更してログファイルなどに簡単にメッセージを書き込むことができます。

純粋な.NETアプリケーションを作成する場合は、this articleにもっと興味があります。

+0

例外ハンドラによってSegfaultがキャッチされません。 –

+0

@IanThompson何を意味していますか? Segfault on Windows?それらの0xc000005「アクセス拒否」エラーの1つを意味しますか? – gbjbaanb

+0

はい、例外がスローされるのではなくシグナルが発生する場所です。例えば。クラスA {public:int b;}; A * nu_a = NULL; nu_a-> b = 5;あなたに与えます:アクセス違反書込み場所0x00000000。これは例外ではなく、例外ハンドラによって捕捉されません。 –

0

私はまだRTVRecoという古いプログラムを使用しています。それは単にボタンを押すだけのアプリで、とても使いやすいです。それはしばらく更新されていませんが、それはまだ私が見た中で最も簡単なものです。

関連する問題