使用 MFTrace

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

MFTrace 使用 Detours 库连接到 Media Foundation API 调用并生成跟踪日志。 此外,MFTrace 还可记录来自任意组件的跟踪,而这些组件会使用 Windows 事件跟踪 (ETW) 或软件跟踪预处理器 (WPP) 来生成跟踪。 通过从 MFTrace 启动新进程或将 MFTrace 附加到现有进程,可生成跟踪日志。

使用情况

mftrace [-a Process][-c ConfigurationFile][-dc][-es][-k KeyWords][-l Level][-o OutputFile][-v][-?] [{COMMAND|ETL_FILE}]

命令行参数 说明
-a进程 ID 或进程名称
附加到正在运行的进程。
-c配置文件
从指定配置文件读取设置。 请参阅 MFTrace 配置文件
-dc
禁用对子进程的跟踪。 默认情况下,会为子进程启用跟踪。
-es
启用公共符号。
-k关键字
关键字的逗号分隔列表。 请参阅 MFTrace 关键字
-l级别
跟踪级别。
  • 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”
源流的媒体类型是什么? “新流”、“MENewStream”、“CMFMediaSourceDetours::TracePD”
源流是否生成了示例? “CMFMediaStreamDetours::HandleEvent”、“MEMediaSample”
播放是否到达数据末尾? “MEEndOfStream”、“MEEndOfPresentation”
格式是否更改? “MEStreamFormatChanged”(媒体源)、“新格式”、“MESessionStreamSinkFormatChanged”(媒体接收器)
创建了哪些对象? “COle32ExportDetours::CoCreateInstance”
管道中的媒体基础转换 (MFT) 是否处理了任何数据? “CMFTransformDetours::ProcessOutput”、“CMFTransformDetours::ProcessInput”
在 MFT 上设置了哪些状态? “CMFTransformDetours::ProcessMessage”
MFT 是否请求了输入数据? “MF_E_TRANSFORM_NEED_MORE_INPUT”(同步 MFT)、“METransformNeedInput”(异步 MFT)。
异步 MFT 是否生成了输出数据? “ProcessOutputs 可用”
媒体接收器是否请求了示例? “MEStreamSinkRequestSample”
媒体接收器是否接收了示例? “CMFStreamSinkDetours::ProcessSample”
DirectShow:处理了哪些示例? “示例”、“CMemInputPinDetours”
DirectShow:使用了哪个筛选器图? “CGraphHelpers::Trace”
是否存在多个进程? “CreateProcess”注意:同时还会查找进程标识符,而该标识符会显示在每个跟踪行的开头。

 

MFTrace