2010-06-09 83 views
9

什么调试工具可用于directshow过滤器?目前,我有一个编译和注册视频源过滤器的项目,然后在GraphEdit中设置图形。我在Visual Studio 2008中使用C++。是否有可能以任何方式将调试器连接到过滤器,我可以设置断点,检查变量等?除此之外,还有什么方法可以将诊断信息记录在某个可以实时查看的位置?如何调试C++ DirectShow过滤器

回答

12

连接调试器应该没有问题。在过滤器的Visual Studio项目中将graphedt.exe设置为调试目标,并且应该能够在代码中设置断点。如果你遇到困难,可能是因为某些解码器的反调试逻辑 - 你必须避免使用这些。

您还可以通过记录交付及其时间戳和延迟获得有用的调试信息。我发现要做的最好的方法是使用传递过滤器。有一个像这样的源代码和二进制形式的监视器过滤器可以从www.gdcl.co.uk/mobile(win32和win mobile)获得。

ģ

+3

Omigod。我不知道你可以像这样附加调试器。那很壮观。 – 2010-06-09 22:56:33

0

调试实时应用程序的最佳方式是生成日志文件。如果您想实时查看日志信息,只需创建一个基于客户端服务器套接字的日志记录。例如,您的应用可以开始监听端口。外部查看器应用程序(客户端)可以连接到该端口并开始实时接收日志信息。

6

在调试版本,DirectShow的基类已经包括由注册表项控制的灵活的记录机制。基类本身使用这种机制来记录他们自己的操作。如果需要,应该可以修改基类,以便在诊断版本构建中提供日志记录。

一个简单的例子:

DbgLog((LOG_TIMING, 1, TEXT(__FUNCTION__ " : Frame:%d, Stream Time:%dms, Sample Time:%dms"), 
(int)currentFrame, (int)currentTime, (int)sampleTime)); 

这产生由调用功能的名称为前缀,如果为“TIMING”类别记录级别被设置为> = 1日志输出。每个类别的记录级别都在注册表中的下面的键下进行配置。对于所有筛选器和子密钥的最小日志记录级别,都有一个“GLOBAL”子键,用于通过筛选文件名进行额外日志记录。 (Windows x64的32位代码)HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ DirectShow \ Debug HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DirectShow \ Debug 。

编辑每个过滤器的“LogToFile”键以指定一个记录目标。这默认为'Debug'(调试器输出),但也可以是'Console'登录到控制台窗口或要登录的文件名。其他类型的日志记录也可以添加。

控制台选项特别方便不带调试器的实时监控。在我的系统上,基类无法打开控制台窗口(如果尚未打开),所以我在wxdebug.cpp中添加了以下调整来无条件打开控制台(如果请求输出控制台)。

if (!lstrcmpi(szFile, TEXT("Console"))) { 
     AllocConsole();  // modification - always allocate console if using Console output 

进一步的信息,请参阅DirectShow Debug Output Functions

3

一些工具,用于分析过滤器之间的数据流:

开源图形编辑器GraphStudioNext分析过滤器(和分析文件作家)的兴趣两个过滤器之间插入时会显示活动性的视觉日志。您需要自己构建以获取此功能。

Geraint Davie's monitor filter将向磁盘写入活动日志文件。

相关问题