Остановить ошибки отладки MSVC++ от блокировки текущего процесса?

Любые неудачные операторы ASSERT в Windows приводят к появлению приведенного ниже отладочного сообщения и зависанию выполнения приложений. Я понимаю, что это ожидаемое поведение, но оно периодически запускается на безголовой машине, поэтому не допускайте сбоев модульных тестов, вместо этого бесконечно ожидая ввода пользователя.

Есть ли ключ реестра или флаг компилятора, который я могу использовать, чтобы это окно сообщения не запрашивало пользовательский ввод, в то же время допуская сбой теста при ASSERT?

По сути, я хочу сделать это без изменения кода, просто изменив параметры компилятора или Windows.

Спасибо!

http://img519.imageshack.us/img519/853/snapshotbu1.png


person Mike McQuaid    schedule 02.10.2008    source источник


Ответы (3)


Из MSDN о макросе ASSERT:

В приложении MFC ISAPI утверждение в режиме отладки вызовет модальное диалоговое окно (диалоговые окна ASSERT теперь являются модальными по умолчанию); это прервет или повесит выполнение. Чтобы отключить диалоги модальных утверждений, добавьте следующие строки в исходный файл проекта (projectname.cpp):

// For custom assert and trace handling with WebDbg
#ifdef _DEBUG
CDebugReportHook g_ReportHook;
#endif

Сделав это, вы можете использовать средство WebDbg (WebDbg.exe) для просмотра утверждений.

person Andrew Stein    schedule 02.10.2008

Я думаю, что это диалог, показанный _CrtDbgReport для отчетов типа _CRT_ASSERT. С помощью _CrtSetReportHook вы можете адаптировать это поведение для всего приложения. (т.е. требуется одно локальное изменение) В частности, вы можете продолжить выполнение после неудачного утверждения, тем самым игнорируя его.

person MSalters    schedule 03.10.2008

В контексте модульного тестирования часто полезно преобразовать ASSERT (фактически _CrtDbgReport вызовы) в какое-то исключение, обычно std::exception, которое содержит некоторый информативный текст. Это имеет тенденцию выходить в журнал вывода модульного теста как сбой. Это как раз то, что вам нужно: неудачный ASSERT должен быть неудачным модульным тестом.

Сделайте это, добавив функцию-ловушку отчета, как указано, используя: _CrtSetReportHook()

person MartinP    schedule 18.03.2010