Остановить ошибки отладки MSVC ++ от блокировки текущего процесса? - PullRequest
1 голос
/ 02 октября 2008

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

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

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

Спасибо!

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

Ответы [ 3 ]

2 голосов
/ 03 октября 2008

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

1 голос
/ 02 октября 2008

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

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

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

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

0 голосов
/ 18 марта 2010

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

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

...