Отладка фильтров DirectShow

[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио- и видеозахватом в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

Многие средства отладки, описанные в этом разделе, реализованы в библиотеке базовых классов DirectShow. Дополнительные сведения см. в разделе Базовые классы DirectShow.

Проверка утверждения

Используйте проверку утверждений либерально. Утверждения могут проверять предположения, которые вы делаете в коде о предварительных условиях и послекондициях. DirectShow предоставляет несколько макросов утверждения. Дополнительные сведения см. в макросах подтверждения и точек останова.

Имена объектов

В отладочных сборках существует глобальный список объектов, производных от класса CBaseObject. Как создаются объекты, они добавляются в список. Когда они уничтожены, они удаляются из списка. Чтобы отобразить список этих объектов, вызовите функцию DbgDumpObjectRegister.

Метод конструктора для базового класса CBaseObject и большинство классов, производных от него, включает параметр для имени объекта. Присвойте своим объектам уникальные имена для их идентификации. Используйте макрос NAME при объявлении имени, чтобы имя было выделено только в отладочных сборках. В розничных версиях сборки имя становится NULL.

Ведение журнала отладки

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

Каждое сообщение отладки имеет тип, например LOG_TRACE или LOG_ERROR, а также уровень отладки, указывающий на важность сообщения. Сообщения с более низким уровнем отладки более важны, чем сообщения с более высоким уровнем.

В следующем примере гипотетический фильтр разъединяет пин от массива пинов. Если попытка отключения выполнена успешно, фильтр отображает сообщение LOG_TRACE. Если попытка завершается ошибкой, отображается сообщение LOG_ERROR:

hr = m_PinArray[iPin]->Disconnect();
if (FAILED(hr))
{
    DbgLog((
        LOG_ERROR, 
        1, 
        TEXT("Could not disconnect pin %d. HRESULT = %#x", 
        iPin, 
        hr
        ));
 
   // Error handling code (not shown).
}
DbgLog((LOG_TRACE, 3, TEXT("Disconnected pin %d"), iPin));

При отладке можно задать уровень отладки для каждого типа сообщения. Кроме того, каждый модуль (DLL или исполняемый файл) поддерживает собственные уровни отладки. При тестировании фильтра создайте уровни отладки для библиотеки DLL, содержащей фильтр.

Дополнительные сведения см. в разделе Отладка выходных функций.

Критические разделы

Чтобы упростить отслеживание взаимоблокировок, включите утверждения, определяющие, принадлежит ли вызывающий код заданному критическому разделу. Функции CritCheckIn и CritCheckOut указывают, является ли вызывающий поток владельцем критического раздела. Как правило, эти функции вызываются внутри макроса утверждения.

Вы также можете использовать функцию DbgLockTrace для трассировки выполнения и освобождения критических секций.

Отладка в DirectShow