Поделиться через


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

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

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

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

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

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

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

Метод конструктора для базового класса CBaseObject и большинства классов, производных от него, включает параметр для имени объекта . Присвойте объектам уникальные имена, чтобы идентифицировать их. Используйте макрос ИМЯ при объявлении имени, чтобы имя было выделено только в отладочных сборках. В розничных сборках имя становится 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