【问题标题】:How to go about debugging in Media Foundation如何在 Media Foundation 中进行调试
【发布时间】:2017-06-20 17:37:04
【问题描述】:

问题

哪些工具或代码结构(如定义)应该在该领域使用,以及如何让它们发挥作用?作为媒体基金会的新人,在在这里提问之前我应该​​做些什么以避免简单的错误?

问题不是“你最喜欢的工具是什么,让我们来争论谁是对的”,而简单来说,关于这个媒体基础框架,哪些选项是根据你在值得考虑调试的领域的专业知识以及我如何使用他们?

我问这个问题的背景

在 stackoverflow 上环顾四周,似乎有些问题是在不知道如何正确调试 Media Foundation 应用程序的情况下提出的。在某些情况下,一个特定的问题会得到一个答案,指出 OP 应该使用 MFTrace 1、2。我还相信,如果使用适当的调试工具或特定于媒体基础的跟踪,我之前的问题会得到帮助。

我作为这个框架的新手遇到的事情

我自己甚至无法让MFTrace 或Event Viewer 工作,这两个工具都在official media foundation blog 中提到。

缺少有关如何获取 MFTrace 的文档,它是否仅在 .NET 4.0 上的旧 win 7 SDK 中可用,称为 here?还是可以使用更新的 SDK?在 Windows 10 上安装较旧的 win 7 SDK 会遇到一些痛点(first change regedit values、how to do that、new error -> SO suggest to look at the log and maybe uninstall any existing Visual C++ 2010 redistrubutable。) 很高兴知道这是否是您必须经历的事情,在这种情况下我会经历,或者是否可以在其他地方找到 MFTrace。

我没有从Event Viewer 获得任何日志。但也许应该完全跳过那个工具,只使用 MFTrace,因为官方博客说了以下内容?

但是,与事件查看器相比,MFTrace 功能更强大,收集的信息也更多。 source

除了工具,还有吗?

#define MF_TRACE_LEVEL 15

在this ms blog post 他们提到EventWriteString 和一些TRACE_LEVEL 定义。这在 MFTrace 之外有用吗?

【问题讨论】:

  • 哇,亚历克斯,看来您为自己的问题提供了答案,做得相当不错。说真的,我明白你的要求,我希望有人能提供一个全面的答复,但我没想到。

标签: ms-media-foundation


【解决方案1】:

通常我使用以下内容:

  1. VS 调试器,大多数工作通过 OutputDebugString 进行调试日志记录。即使使用媒体基础的异步特性,它也能很好地工作。
  2. MFTrace 用于在难以分析的情况下进行详细分析。这通常涉及在 MFAPI.h 中查找晦涩的 GUIDS
  3. 有时 TOPOEDIT 有助于测试。不过,它的功能远不及 GraphEdit。
  4. 运行Microsoft Media Foundation SDK Samples,或查看MFNode。 samples from the Developing Microsoft Media Foundation 这本书也可以从网上下载。请注意,一些 SDK 示例已经过时,如果您需要查看这些示例,您可能需要下载较旧的 SDK,直到找到它们。周围漂浮着更多的样本。找到他们。
  5. 查看 Stack Overflow 或 MSDN Media Foundation Forum。密切关注Roman Ryltsov 的任何回答;)
  6. 如果您是 COM 开发新手,请务必阅读 The N habits of Highly Defective DirectShow Applications。虽然它是直接显示特定的,但其中很多仍然适用。特别是:使用和理解 CCOMPtr 以及何时需要使用互斥锁。

运行 MFTRACE:

MFTrace 并不漂亮,但在它被弄清楚后它最终并不难。最后引用的 MS 博客条目帮助很大,文本分析工具也是如此。

  1. 启动 ADMIN 命令提示符。
  2. 运行 MFTRACEPATH.bat 将 MFTRACE.EXE 位置添加到路径中
  3. cd {YourExecutableLoc}
  4. 运行 MFTRACECALLER.BAT {YOUREXECUTABLENAME}(不带任何扩展名)
  5. 将 YOUREXECTUABLENAME.TXT 加载到文本分析工具中以帮助过滤输出。
  6. MSDN 博客中提到的 MFTRACEParseTopologies.bat 有时很有用。

我使用这些 .bat 脚本来运行 MFTRACE(记住:使用 ADMIN 命令提示符!)

MFTRACEPATH.BAT:

@echo off
Echo MFTracePath.bat adds MFTrace to path
SET _NT_SYMBOL_PATH=C:\Users\sschi\AppData\Local\Temp\SymbolCache;%QTDIR%\bin
SET PATH=%PATH%;%PROGRAMFILES(x86)%\Windows Kits\10\bin\x86
cd {your Binary Folder}
echo run MFTraceCaller CapstoneDebug next

MFTRACECALLER.BAT

@echo off
SET exFile=MYEXECUTABLEFILENAME
if '%%1' == '' goto start

set exFile=%1
:START

echo Starting MFTRACE using %exFile%, saving output to %exFile%.txt
@echo on
mftrace -es -k all -l 4 -o %exFile%.txt %exFile%.exe %2 %3 %4 %5
@echo off
echo.
echo Trace completed - output is in %exFile.Txt%
echo.
echo Post Processing is available using
echo MFTraceParseTimeStamps.bat
echo MFTraceParseTopologies.bat
echo a) Open %exfile%.txt in TextAnalysisTool
echo b) Load TextAnalysisToolDebugFilters.tat

文本分析工具有助于过滤大量输出。使用“文件”、“加载过滤器”根据需要加载过滤器 您可以打开和关闭单个过滤器,以帮助您将正在做的事情归零。此外,较高的过滤器会覆盖较低的过滤器,例如,一行中的文本“错误”会覆盖其下方的所有内容。此外,打开文件中的任何“OutputDebugString”日志记录,它将出现在跟踪的输出中。

以下是我的“厨房水槽”过滤器文件。关闭除红色错误跟踪之外的所有内容以启动。

过滤器.TAT:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<TextAnalysisTool.NET version="2016-06-16" showOnlyFilteredLines="False">
  <filters>
    <filter enabled="y" excluding="n" description="" foreColor="ff0000" type="matches_text" case_sensitive="n" regex="n" text="Error" />
    <filter enabled="y" excluding="n" description="" foreColor="000000" backColor="ffa500" type="matches_text" case_sensitive="n" regex="n" text="Warning" />
    <filter enabled="n" excluding="n" description="" backColor="ffa500" type="matches_text" case_sensitive="n" regex="n" text="Process Frame" />
    <filter enabled="y" excluding="n" description="" backColor="90ee90" type="matches_text" case_sensitive="n" regex="n" text="MESessionStart" />
    <filter enabled="y" excluding="n" description="" backColor="90ee90" type="matches_text" case_sensitive="n" regex="n" text="MESessionStopped" />
    <filter enabled="y" excluding="n" description="" backColor="90ee90" type="matches_text" case_sensitive="n" regex="n" text="MESessionPaused" />
    <filter enabled="y" excluding="n" description="" backColor="90ee90" type="matches_text" case_sensitive="n" regex="n" text="UpdatePendingCommands" />
    <filter enabled="y" excluding="n" description="" backColor="90ee90" type="matches_text" case_sensitive="n" regex="n" text="SetPositionInternal" />
    <filter enabled="n" excluding="n" description="" foreColor="008000" backColor="add8e6" type="matches_text" case_sensitive="n" regex="n" text="Scrub" />
    <filter enabled="y" excluding="n" description="" foreColor="008000" backColor="d3d3d3" type="matches_text" case_sensitive="n" regex="n" text="&lt;&lt;&lt;&lt;&lt;&lt; " />
    <filter enabled="y" excluding="n" description="" foreColor="008080" backColor="f0e68c" type="matches_text" case_sensitive="n" regex="n" text="RequestSample" />
    <filter enabled="y" excluding="n" description="" foreColor="006400" type="matches_text" case_sensitive="n" regex="n" text="MESession" />
    <filter enabled="y" excluding="n" description="" foreColor="008000" type="matches_text" case_sensitive="n" regex="n" text="MFStartup" />
    <filter enabled="y" excluding="n" description="" foreColor="008000" type="matches_text" case_sensitive="n" regex="n" text="MFShutdown" />
    <filter enabled="y" excluding="n" description="" foreColor="800080" type="matches_text" case_sensitive="n" regex="n" text="Grabber" />
    <filter enabled="y" excluding="n" description="" foreColor="800080" type="matches_text" case_sensitive="n" regex="n" text="Seek" />
    <filter enabled="y" excluding="n" description="" foreColor="d2691e" type="matches_text" case_sensitive="n" regex="n" text="GraphBuilder" />
    <filter enabled="y" excluding="n" description="" foreColor="2e8b57" type="matches_text" case_sensitive="n" regex="n" text="MF_TOPOLOGY" />
    <filter enabled="y" excluding="n" description="" foreColor="2e8b57" type="matches_text" case_sensitive="n" regex="n" text="MF_TOPONODE" />
    <filter enabled="y" excluding="n" description="" foreColor="2e8b57" type="matches_text" case_sensitive="n" regex="n" text="MF_TRANSFORM" />
    <filter enabled="y" excluding="n" description="" foreColor="5f9ea0" type="matches_text" case_sensitive="n" regex="n" text="CurrentPosition" />
    <filter enabled="y" excluding="n" description="" foreColor="5f9ea0" type="matches_text" case_sensitive="n" regex="n" text="CMFMediaSession" />
    <filter enabled="y" excluding="n" description="" foreColor="0000ff" type="matches_text" case_sensitive="n" regex="n" text="OutputDebugString" />
    <filter enabled="n" excluding="n" description="" foreColor="b22222" type="matches_text" case_sensitive="n" regex="n" text="MF_SOURCE_READER" />
    <filter enabled="n" excluding="n" description="" foreColor="008080" type="matches_text" case_sensitive="n" regex="n" text="CoCreateInstance" />
    <filter enabled="y" excluding="n" description="" foreColor="008b8b" type="matches_text" case_sensitive="n" regex="n" text="MeStream" />
    <filter enabled="y" excluding="n" description="" foreColor="008b8b" type="matches_text" case_sensitive="n" regex="n" text="MESource" />
    <filter enabled="y" excluding="n" description="" foreColor="008b8b" type="matches_text" case_sensitive="n" regex="n" text="MFT_MESSAGE" />
    <filter enabled="y" excluding="n" description="" foreColor="008080" type="matches_text" case_sensitive="n" regex="n" text="MF_MT_SUBTYPE" />
    <filter enabled="y" excluding="n" description="" foreColor="008b8b" type="matches_text" case_sensitive="n" regex="n" text="Sample" />
    <filter enabled="y" excluding="n" description="" foreColor="008b8b" type="matches_text" case_sensitive="n" regex="n" text="ProcessInput" />
    <filter enabled="y" excluding="n" description="" foreColor="008b8b" type="matches_text" case_sensitive="n" regex="n" text="ProcessOutput" />
    <filter enabled="y" excluding="n" description="" foreColor="008000" type="matches_text" case_sensitive="n" regex="n" text="OnClock" />
    <filter enabled="y" excluding="n" description="" foreColor="b22222" type="matches_text" case_sensitive="n" regex="n" text="Met=" />
  </filters>
</TextAnalysisTool.NET>

其他参考文献

  1. Introduction to Text Analysis Tool

  2. textanalysistool.github.io

  3. Microsoft Media Foundation Blog Entries

【讨论】:

  • 虽然我不再处理这个问题,也没有尝试过你的建议,但这似乎正是我所要求的!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
相关资源
最近更新 更多