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级别 |
跟踪级别。
|
-o输出文件 |
将跟踪输出写入指定文件。 默认情况下,输出将进入 stdout。 如果指定了输出文件,则文件扩展名必须为以下项目之一:
|
-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”注意:同时还会查找进程标识符,而该标识符会显示在每个跟踪行的开头。 |
相关主题