调试输出函数

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 Debug

对于第三方筛选器,位置取决于使用哪个版本的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 或更高版本,则以下代码输出字符串“这是调试消息” :

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

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

\ HKEY_LOCAL_MACHINEDebugRootModuleNameMessageType<>\<>\<>

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

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

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

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

调试库使用大于哪个级别、全局级别或模块级别。

调试输出位置

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

\ HKEY_LOCAL_MACHINE<DebugRootModile>\<NameLogToFile>\

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

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

调试实用工具