Вопрос

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

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

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

Спасибо!

Библиотека отладки Microsoft Visual C++ ASSERT http://img519.imageshack.us/img519/853/snapshotbu1.png

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top