使用 MFTrace

MFTrace 是一种工具,用于为 Microsoft Media Foundation 应用程序生成跟踪日志。

MFTrace 使用 Detours 库挂钩到 Media Foundation API 调用并生成跟踪日志。 MFTrace 还可以记录来自任何使用 Windows (ETW) 事件跟踪的组件或软件跟踪预处理器 (WPP) 来生成跟踪的跟踪。 可以通过从 MFTrace 启动新进程或将 MFTrace 附加到现有进程来生成跟踪日志。

使用情况

mftrace [-aProcess][-cConfigurationFile][-dc][-es][-kKeyWords][-lLevel][-oOutputFile][-v][-?] [{COMMAND|ETL_FILE}]

命令行参数 说明
-a进程 ID 或进程名称
附加到正在运行的进程。
-C配置文件
从指定的配置文件中读取设置。 请参阅 MFTrace 配置文件
-直流
禁用子进程的跟踪。 默认情况下,为子进程启用跟踪。
-es
启用公共符号。
-K关键 字
以逗号分隔的关键字列表。 请参阅 MFTrace 关键字
-我水平
跟踪级别。
  • 0:无
  • 1:严重
  • 2:错误
  • 3:警告
  • 4:信息性
  • 5:详细
  • 16:调试
-o输出文件
将跟踪输出写入指定的文件。 默认情况下,输出将转到 stdout
如果指定了输出文件,则文件扩展名必须是以下项之一:
  • .etl:事件跟踪日志 (ETL) 文件。
  • .log 或 .txt:文本文件。
-V
启用详细模式。
-?
显示用法信息。
命令
用于创建新进程的命令行参数。
ETL_FILE
现有 ETL 文件的名称。 如果提供此参数,则 ETL 文件将转换为文本输出。

 

环境变量

TRACE_FORMAT_SEARCH_PATH

若要跟踪使用 Windows 软件跟踪预处理器 (WPP) 的组件,请将此环境变量设置为指定组件 (TMF) 文件跟踪消息格式的路径。

_NT_SYMBOL_PATH

如果启用符号查找 (-es) ,请设置此环境变量以指定符号路径。

示例

创建新进程并跟踪该进程:

mftrace.exe wmplayer.exe Wildlife.wmv

将 MFTrace 附加到现有进程:

mftrace.exe -a wmplayer.exe
mftrace.exe -a 9132

将跟踪输出发送到文本文件:

mftrace.exe -a wmplayer.exe -o trace.txt

跟踪 ETW 或 WPP 事件:

mftrace.exe -c config.xml -o trace.txt
mftrace.exe -c config.xml -o trace.etl

注意

第一个示例生成文本文件。 第二个示例生成 ETL 文件。

 

将 ETL 文件转换为文本文件:

mftrace.exe -o trace.txt trace.etl

注解

默认情况下,MFTrace 仅生成 Detours 跟踪。 若要生成 ETW 或 WPP 跟踪,必须提供配置文件。 配置文件提供跟踪提供程序的名称。 有关详细信息,请参阅 MFTrace 配置文件

MFTrace 可以将输出发送到以下目标:

  • stdout (默认) 。
  • 文本文件。
  • 二进制 ETL 文件。

如果要记录 ETW/WPP 跟踪,ETL 文件是最有效的选项,因为跟踪数据保存为二进制 Blob。 跟踪会话完成后,可以使用 MFTrace 将 ETL 文件转换为文本文件。

注意

对于 Detours 跟踪,文本输出与 ETL 文件一样高效。 因此,如果只记录 (的 Detours 跟踪,并且没有 ETW/WPP 跟踪) ,则建议使用文本输出。

 

对于 Detours 跟踪,必须将 MFTrace 附加到正在运行的进程 (-a) 或使用 MFTrace 创建新进程。 对于 ETW/WPP 跟踪,MFTrace 侦听配置文件中列出的任何事件提供程序。

可以通过 -k 命令行选项或在配置文件中指定跟踪关键字来筛选跟踪结果。 但是,更典型的用法是记录所有跟踪,然后使用脚本或 grep 搜索特定的字符串模式。

解释跟踪结果

可以使用 MFTrace 回答有关 Media Foundation 应用程序或组件内发生的情况的问题。 下表列出了一些典型问题。 第二列提供可帮助回答问题的搜索字符串。

问题 搜索字符串
是否发生了错误? “0xc00d”
拓扑是否正确解析? “CTopologyHelpers::Trace”
媒体会话是否已启动? “MESessionStarted”
播放了哪个文件? “CMFSourceResolverDetours”
源流的媒体类型有哪些? “New stream”、“MENewStream”、“CMFMediaSourceDetours::TracePD”
源流是否生成了示例? “CMFMediaStreamDetours::HandleEvent”、“MEMediaSample”
播放是否已到达数据末尾? “MEEndOfStream”、“MEEndOfPresentation”
格式是否发生了更改? “MEStreamFormatChanged” (媒体源) 、“新格式”、“MESessionStreamSinkFormatChanged” (媒体接收器)
创建了哪些对象? “COle32ExportDetours::CoCreateInstance”
媒体基础转换 (MRT 是否在管道中) 处理任何数据? “CMFTransformDetours::P rocessOutput”、“CMFTransformDetours::P rocessInput”
MRT 上设置了哪些状态? “CMFTransformDetours::P rocessMessage”
MFT 请求是否输入数据? “MF_E_TRANSFORM_NEED_MORE_INPUT” (同步 MFT) ,“METransformNeedInput” (异步 MFT) 。
异步 MFT 是否生成输出数据? “可用的 ProcessOutputs”
媒体接收器是否请求采样? “MEStreamSinkRequestSample”
媒体接收器是否接收了样本? “CMFStreamSinkDetours::P rocessSample”
DirectShow:处理了哪些样本? “sample”、“CMemInputPinDetours”
DirectShow:使用了哪个筛选器图? “CGraphHelpers::Trace”
是否存在多个进程? “CreateProcess” 注意: 另请查找显示在每个跟踪行开头的进程标识符。

 

MFTrace