如何在 Media Foundation 中进行调试

How to go about debugging in Media Foundation

问题

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

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

我问这个问题的背景

环顾 Whosebug,似乎有人在不知道如何正确调试 Media Foundation 应用程序的情况下提出了一些问题。在某些情况下,特定问题得到的答案表明 OP 应该使用 MFTrace 1, 2。我也相信,通过使用适当的调试工具或特定于媒体基础的跟踪,我之前在这里的问题会得到帮助。

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

我自己连MFTrace or Event Viewer to work, both tools that are mentioned in the official media foundation blog都搞不定。

缺少有关如何获取 MFTrace 的文档,它是否仅在 .NET 4.0 上的旧 win 7 SDK 中可用,参考 here? Or can one use a newer SDK? Installing the older win 7 SDK involves some pain points on windows 10 (, 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,因为官方博客说了以下内容?

However, MFTrace is much more powerful, and collects way more information, than Event viewer. source

除了工具,还有没有?

#define MF_TRACE_LEVEL 15

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

通常我使用以下:

  1. VS 调试器,大多数工作通过 OutputDebugString 进行调试日志记录。它工作得很好,即使是媒体基础的异步性质。
  2. MFTrace 用于在难以分析的情况下进行详细分析。这通常涉及在 MFAPI.h
  3. 中查找晦涩的 GUID
  4. TOPOEDIT 有时会有助于测试。虽然它的功能不如 GraphEdit。
  5. 运行 Microsoft Media Foundation SDK Samples, or have a look at MFNode. The samples from the Developing Microsoft Media Foundation 这本书也可以从网上下载。请注意,某些 SDK 示例已被废弃,如果您需要查看这些示例,您可能需要下载旧版 SDK,直到找到它们。周围漂浮着更多样本。找到他们。
  6. 查看 Stack Overflow,或查看 MSDN Media Foundation Forum. Pay close attention to any answers from Roman Ryltsov ;)
  7. 如果您是 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. 偶尔MFTRACEParseTopologies.bat,在MSDN博客中提到的很有用。

我使用这些 .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\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

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

下面是我的 'kitchen sink' 过滤器文件。关闭除红色错误痕迹以外的所有内容以开始。

FILTERS.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