2017-10-04 20 views
2

私たちのプロジェクトでは、ユニットテストにBoost.Testを使用しています。テストケース中に予期しない例外が発生したときにミニダンプを取得したいので、Google Breakpadを統合してミニダンプを作成し始めました。Boostテストの実行方法とミニダンプの作成方法

Boost.Testはユーザーテストからスローされた例外をすべて傍受しているようです。私はブーストテストケースがtry/catchで各関数をラップし、予期しない例外がスローされた場合単体テストが失敗するためです。これにより、Breakpad例外ハンドラがミニダンプを起動および書き込みできなくなります。

ユニットテストで予期しない例外をキャッチして失敗するだけでなく、代わりに、例外を未処理(または再スロー)にして、Breakpadまたは別の例外ハンドラをミニダンプを作成するようにトリガすることができます。

答えて

1

私はいくつかのアプローチを試みましたが、以下の解決策が最良の結果をもたらします。 BOOST_AUTO_TEST_CASEマクロをラップするマクロを定義し、呼び出しコードをSEH __try/__ exceptで囲み、例外データをブレークパッドにパイプする。

#define CUSTOM_AUTO_TEST_CASE(test_name)                 \ 
void test_name##_custom_wrapper();                   \ 
                              \ 
BOOST_AUTO_TEST_CASE(test_name)                   \ 
{                           \ 
    __try                         \ 
    {                          \ 
     test_name##_custom_wrapper();                  \ 
    }                          \ 
    __except(pHandler->WriteMinidumpForException(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER) {} \ 
}                           \ 
                              \ 
void test_name##_custom_wrapper()                   \ 

ここで、pHandlerはブレークパッドのExceptionHandlerポインタです。

BOOST_AUTO_TEST_CASTのすべてのオカレンスをラッパーマクロで置き換える必要があるという欠点があります。しかしそれはトリックです。

1

Boost.Testは、他のテストケースの実行を継続するために、テストケースからすべての例外をキャッチするように設計されています。私はあなたがこの振る舞いを止めることはできないと思いますが、いつでもソースコードを参照することができます。

あなたが何をしているかを達成するために、私はテストケースの本体を自分で包み込み、例外をキャッチし、予期しない例外がスローされたときにブレークパッドのミニダンプを書き出します。あなたは、テストケース本体であるとラムダのテストケース本体を使用してハンドラを呼び出すファンクタを受け入れる関数としてキャッチ/ダンプハンドラを記述することで、これを汎用化することができます

void handler(std::function<void()> test_case) 
{ 
    try { 
    test_case(); 
    } catch (...) { 
    write_minidump(); 
    } 
} 

BOOST_AUTO_TEST_CASE(doit) 
{ 
    handler([] { 
    // do testing here 
    }); 
} 

それがあればより複雑になりますあなたは器具を使っていますが、同じ考え方が適用されます。

+0

私はこの提案が好きですが、ミニダンプがキャッチブロックに書き込まれる頃には、ミニダンプに保存されている呼び出しスタックはスタックの最上部に 'ハンドラ'を表示します。ただし、「未処理の例外フィルタ」がトリガされ、ダンプが書き込まれると、問題のコールスタックが保持されます。 – mbradber

+0

ブレークパッドはどのように例外ハンドラを設定しますか? – legalize

+0

https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/windows_client_integration.md 私はそこにあるドキュメントに基づいてExceptionHandlerを作成しました。このブレークパッドでは、未処理の例外フィルタコールバックが設定され、未処理の例外によってミニダンプが正常に生成されます。しかし、私は 'WriteMinidump' APIをあなたが投稿したものと同様のcatchブロックで明示的に使用しています。 – mbradber

関連する問題