20

I have a bunch of unit tests that I'm running in batch mode. Occasionally, one will crash with a debug assertion fired from the Visual C++ library. This causes a dialog to pop up, and the unit tests stop running until I click "OK" to close the dialog.

How can I make a C++ program just crash (like on Linux) when it hits an assertion, instead of popping up the annoying dialog?

Note: I do not want to disable assertions; just the dialog.

4

3 に答える 3

18

Check out _CrtSetReportHook():

http://msdn.microsoft.com/en-us/library/0yysf5e6.aspx

MSDN advertises this as a robust way for an application to handle CRT runtime failures like assertions. Presumably you can define a report hook that dumps your process:

How to create minidump for my process when it crashes?

于 2012-12-19T00:29:44.740 に答える
14

This code will disable display of dialog. Instead, it will print an error in the output window, and stderr.

int main( int argc, char **argv )
{
     if( !IsDebuggerPresent() )
     {
          _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG );
          _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR );
     }

     ...
}

The same must be applied for _CRT_ERROR if you use Q_ASSERT from Qt library.

于 2015-07-24T12:58:40.480 に答える
0

I put the code for a suitable hook (that you can install with _CrtSetReportHook()) in: https://stackoverflow.com/a/28852798/2345997

于 2015-03-16T14:10:22.953 に答える