【发布时间】:2016-09-24 03:42:00
【问题描述】:
directshow 过滤器有哪些调试工具可用?目前,我有一个项目可以编译和注册一个视频源过滤器,然后我在 GraphEdit 中设置一个图形。我在 Visual Studio 2008 中使用 C++。是否可以通过设置断点、检查变量等的任何方式将调试器附加到过滤器?除此之外,有没有办法在某个地方记录诊断信息以便我可以实时查看?
【问题讨论】:
标签: c++ directshow
directshow 过滤器有哪些调试工具可用?目前,我有一个项目可以编译和注册一个视频源过滤器,然后我在 GraphEdit 中设置一个图形。我在 Visual Studio 2008 中使用 C++。是否可以通过设置断点、检查变量等的任何方式将调试器附加到过滤器?除此之外,有没有办法在某个地方记录诊断信息以便我可以实时查看?
【问题讨论】:
标签: c++ directshow
附加调试器应该没有问题。在过滤器的 Visual Studio 项目中将 graphedt.exe 设置为调试目标,您应该能够在代码中设置断点。如果您对此有困难,可能是因为某些解码器中的反调试逻辑 - 您必须避免使用这些。
您还可以通过记录交付及其时间戳和延迟来获取有用的调试信息。我发现最好的方法是使用直通滤波器。在 www.gdcl.co.uk/mobile(win32 和 win mobile)中,有一个像这样的示例监视器过滤器以源代码和二进制形式提供。
G
【讨论】:
在调试版本中,DirectShow 基类已包含由注册表项控制的灵活日志记录机制。基类本身使用这种机制来记录它们自己的操作。如果需要,应该可以修改基类,以便在诊断版本构建中可以使用日志记录。
一个简单的例子:
DbgLog(( LOG_TIMING, 1, TEXT(__FUNCTION__ " : Frame:%d, Stream Time:%dms, Sample Time:%dms"),
(int)currentFrame, (int)currentTime, (int)sampleTime ));
如果“TIMING”类别的日志级别设置为 >=1,则会生成以调用函数名称为前缀的日志输出。每个类别的日志记录级别在注册表中的以下项下进行配置。有一个 'GLOBAL' 子键用于所有过滤器的最低日志记录级别,以及用于按过滤器文件名进行额外日志记录的子键。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectShow\Debug HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DirectShow\Debug(x64 Windows 上的 32 位代码)。
编辑每个过滤器的“LogToFile”键以指定日志记录目标。这默认为“调试”(调试器输出),但也可以是“控制台”以登录到控制台窗口,或者是要登录的文件名。也可以添加其他类型的日志记录。
控制台选项对于没有调试器的实时监控特别方便。在我的系统上,如果基类尚未打开,则无法打开控制台窗口,因此我在 wxdebug.cpp 中添加了以下调整,以便在请求控制台输出时无条件地打开控制台。
if (!lstrcmpi(szFile, TEXT("Console"))) {
AllocConsole (); // modification - always allocate console if using Console output
【讨论】:
一些用于分析过滤器之间数据流的工具:
开源图形编辑器GraphStudioNext 分析器过滤器(和分析器文件编写器)将在插入两个感兴趣的过滤器之间时向您显示活动的可视化日志。您现在需要自己构建才能获得此功能。
Geraint Davie's monitor filter 会将活动日志文件写入磁盘。
【讨论】:
调试实时应用程序的最佳方法是生成日志文件。如果您想实时查看日志信息,只需创建一个基于客户端服务器套接字的日志记录。例如,您的应用可以开始侦听端口。外部查看器应用程序(客户端)可以连接到该端口并开始实时接收日志信息。
【讨论】: