Отладка приложений



     Организация корпоративных праздников на mandarinfox.ru. | Купить венок на могилу и еще. |     

Обзор операторов утверждений для Visual C++ и Visual Basic - часть 4


Когда макрос assert направляет свой вывод в стандартный выходной поток ошибок (stderr), то его можно легко пропустить. А если assert пытается направить свой вывод в панель сообщений, то консольное приложение повиснет, пытаясь закрыть эту панель, т. к. не использует UI-интерфейса и не может выводить на экран никаких окон.

С другой стороны, макросы исполнительной С-библиотеки, по умолчанию направляющие вывод утверждений на панель сообщений, позволяют переадресовывать его в файл или к API-функции outputoebugstring, вызывая функцию __CrtsetReportMode. Однако все операторы утверждений, поставляемые компанией Microsoft, имеют один фатальный недостаток: они изменяют состояние системы (неизменность состояния является кардинальным правилом, которое утверждения не могут нарушать). Вызов утверждений с побочными эффектами едва ли не хуже, чем полный отказ от использования утверждений.

Следующий пример показывает, как рассматриваемые утверждения могут изменить состояние системы при переходе от отладочной конфигурации к выпускной.

//Послать сообщение окну. Если время такой посылки истекает (тайм-аут),

// то другой поток зависает, так что нужно прервать данный поток. 

//Напоминаем, что единственный способ проверить, произошел ли сбой 

//функции SendMessageTimeout, состоит в том, чтобы проверить функцию

// GetLastError. Если функция возвратила 0 и последняя ошибка есть 0, 

//то SendMessageTimeout выполнила тайм-аут.

_ASSERTE ( NULL != pDataPacket)

if ( NULL == pDataPacket)

return ( ERR_INVALID_DATA);

}

LRESULT IRes = SendMessageTimeout ( hUIWnd,

WM_USER_NEEDNEXTPACKET,

0

(LPARAM)pDataPacket ,

SMTO_BLOCK ,

10000

&pdwRes ) ;

_ASSERTE ( FALSE != IRes);

if ( 0 == IRes)

{

// Получить значение последней ошибки. 

DWORD dwLastErr = GetLastError ();

 if ( 0 == dwLastErr)

{

// UI висит или нет достаточно быстрой обработки данных.

return ( ERR_UI_IS_HUNG);

}

// Если ошибка в чем-то еще, то существует проблема

//с данными, посылаемыми через параметр.




Содержание  Назад  Вперед