MSVC ++デバッグエラーが現在のプロセスをブロックしないようにしますか?
-
03-07-2019 - |
質問
WindowsでASSERTステートメントが失敗すると、以下のデバッグメッセージが表示され、アプリケーションの実行がフリーズします。これは予想される動作ですが、ヘッドレスマシンで定期的に実行されているため、ユニットテストが失敗するのを防ぎ、代わりにユーザー入力を無期限に待機します。
ASSERTでのテストの失敗を許可しながら、このメッセージボックスがユーザー入力を要求しないようにするために使用できるレジストリキーまたはコンパイラフラグはありますか?
基本的に、コードを変更せずに、コンパイラまたはWindowsオプションを変更するだけでこれを実行したいです。
ありがとう!
Microsoft Visual C ++デバッグライブラリASSERT http ://img519.imageshack.us/img519/853/snapshotbu1.png
解決
ASSERTマクロに関するMSDNから:
MFC ISAPIアプリケーションでは、デバッグモードでのアサーションによりモーダルダイアログボックスが表示されます(ASSERTダイアログボックスはデフォルトでモーダルになりました)。これにより、実行が中断またはハングします。モーダルアサーションダイアログを抑制するには、プロジェクトソースファイル(projectname.cpp)に次の行を追加します。
// For custom assert and trace handling with WebDbg
#ifdef _DEBUG
CDebugReportHook g_ReportHook;
#endif
これを実行したら、WebDbgツール(WebDbg.exe)を使用してアサーションを確認できます。
他のヒント
これは、_CRT_ASSERTタイプのレポートに対して_CrtDbgReportによって表示されるダイアログだと思います。 _CrtSetReportHookを使用すると、アプリケーション全体の動作を調整できます。 (つまり、1つのローカル変更が必要です)特に、アサーションが失敗した後も実行を継続できるため、それを無視できます。
単体テストのコンテキストでは、ASSERT(実際には _CrtDbgReport
呼び出し)をいくつかの例外(通常は情報テキストを含むstd :: exception)に変換するとよい場合があります。
これは、失敗として単体テストの出力ログに到達する傾向があります。
それはまさにあなたが望むものです:失敗したASSERTは失敗した単体テストでなければなりません。
_CrtSetReportHook()