调试 DirectShow 筛选器

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 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 提高调试级别。

有关详细信息,请参阅 调试输出函数

关键部分

为了使死锁更易于跟踪,请包含断言,以确定调用代码是否拥有给定的关键部分。 CritCheckInCritCheckOut 函数指示调用线程是否拥有关键部分。 通常,你会从断言宏内部调用这些函数。

还可以使用 DbgLockTrace 函数跟踪何时保留或释放关键节。

在 DirectShow 中进行调试