调试输出函数

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

DirectShow 基类提供了多个用于显示调试信息的宏。

函数 说明
DbgCheckModuleLevel 检查是否为给定的消息类型和级别启用了日志记录。
DbgDumpObjectRegister 显示有关活动对象的信息。
DbgInitialise 初始化调试库。
DbgLog 如果为指定的类型和级别启用了日志记录,则向调试输出位置发送字符串。
DbgOutString 将字符串发送到调试输出位置。
DbgSetModuleLevel 设置一个或多个消息类型的日志记录级别。
DbgTerminate 清理调试库。
DisplayType 将媒体类型的相关信息发送到调试输出位置。
DumpGraph 将有关筛选器图的信息发送到调试输出位置。
GuidNames 包含表示 Uuids.h 中定义的 GUID 的字符串的全局数组。
名字 生成仅调试字符串。
注意 将字符串发送到调试输出位置。
提醒 在编译时生成提醒。

 

注册表项

DirectShow 中的调试输出函数使用一组注册表项。 这些注册表项的位置取决于 Windows 的版本。

在 Windows Vista 之前,调试密钥位于以下路径下:

\ HKEY_LOCAL_MACHINE软件\调试

在 Windows Vista 或更高版本中,它们位于以下路径下:

\ HKEY_LOCAL_MACHINE软件\微软\DirectShow\调试

对于第三方筛选器,位置取决于使用哪个版本的 DirectShow 基类 来生成筛选器。 Windows SDK for Windows Vista 中包含的版本使用较新的路径。 以前的版本使用了较旧的路径。

在后面的备注中,标签< DebugRoot> 用于指示这两个路径。 替换正确的路径,具体取决于 Windows 版本或基类的版本。

调试日志记录

DirectShow 定义多种消息类型,如下表所示。

说明
LOG_ERROR 错误通知。
LOG_LOCKING 锁定和解锁关键部分。
LOG_MEMORY 内存分配以及对象创建和销毁。
LOG_TIMING 计时和性能度量。
LOG_TRACE 常规呼叫跟踪。
CUSTOM1 到 CUSTOM5 可用于自定义调试消息

 

每个 DirectShow 调试日志记录函数指定消息类型和日志级别。 仅当该消息类型的当前调试级别等于或大于日志记录函数中指定的级别时,才会显示调试消息。 否则,将忽略该消息。

例如,如果LOG_TRACE级别为 3 或更高,则以下代码将输出字符串“This is a debug message”:

DbgLog((LOG_TRACE, 3, TEXT("This is a debug message")));

每个模块都可以为每个消息类型设置自己的调试级别。 (模块 是可以使用 LoadLibrary 函数加载的 DLL 或可执行文件。) 模块的调试级别显示在注册表中的以下项下:

\ HKEY_LOCAL_MACHINE<DebugRoot>\<ModuleName>\<MessageType>

其中 <,消息类型> 为消息类型减去初始“LOG_”;例如,LOG_LOCKING消息的 LOCKING 。 加载模块时,调试库在注册表中查找模块的日志记录级别。 如果注册表项不存在,调试库会创建它们。

模块还可以使用 DbgSetModuleLevel 函数在运行时设置自己的级别。 若要将消息发送到调试输出,请调用 DbgLog 宏。 以下示例创建 LOG_TRACE 类型的 3 级消息:

还可以使用以下注册表项指定全局日志记录级别:

\HKEY_LOCAL_MACHINE\<DebugRoot>\GLOBAL\<Message Type>

调试库使用更高的级别、全局级别或模块级别。

调试输出位置

调试输出位置由另一个注册表项确定:

\ HKEY_LOCAL_MACHINE<DebugRoot>\<Modile Name>\LogToFile

如果此键 Console的值为 ,则输出将转到控制台窗口。 如果值为 DebDebugDebugger或空字符串,则输出将转到调试器窗口。 否则,输出将写入注册表项指定的文件。

在可执行文件使用 DirectShow 调试库之前,它必须调用 DbgInitialise 函数。 之后,它必须调用 DbgTerminate 函数。 DLL 不需要调用这些函数,因为 (基类库中定义的 DLL 入口点) 自动调用它们。

调试实用工具