Windows 事件跟踪框架 (ETW) 可用于记录大量有关系统内部的信息。Windows tracefmt.exe
SDK 附带的工具可用于将.etl
日志文件转换为文本。
但是,它需要.tmf
消息格式文件来处理消息。否则数据填充只会显示为未知数:
Unknown( 25): GUID=72e5b5cd-5b46-3568-7f3a-3eb074bedc0f (No Format Information found).
我如何下载所需的.tmf
文件?
答案1
1. 确定哪个.sys
文件与 GUID 相关。
有时只需在线搜索 GUID 即可找到相关.sys
文件。如果没有,可以对 中的.sys
文件进行二进制搜索C:\Windows\System32
。
可以使用任何二进制 grep 工具,但必须将 GUID 字节重新排序为小端顺序。例如72e5b5cd
将显示为0xcd 0xb5 0xe5 0x72
。我使用以下 Python 单行代码执行搜索:
python -c 'import sys,uuid; print([x for x in sys.argv[1:] if uuid.UUID("72e5b5cd-5b46-3568-7f3a-3eb074bedc0f").bytes_le in open(x,"rb").read()])' *.sys
该特定 GUID 将出现在 中winusb.sys
。
请注意,只有 64 位应用程序才能访问真实的系统文件,32 位应用程序将看不到它们。
2. 下载.pdb
文件.sys
对于此步骤,您需要symchk.exe
Windows SDK。创建一个新目录来存储文件,这里我使用了C:\tracing
:
symchk.exe C:\Windows\System32\drivers\winusb.sys /s "SRV*C:\tracing*http://msdl.microsoft.com/download/symbols" /od
3. 从中提取跟踪格式.pdb
此步骤需要tracepdb.exe
Windows SDK。我已将输出放在与上一步相同的目录中。
tracepdb.exe -f C:\tracing\winusb.pdb\450C4140E6D427E5ED2F1820DE4C7A2E1\winusb.pdb -p C:\tracing
请注意,十六进制字符串将取决于系统文件版本。检查文件列表以查看符号以什么名称下载。
现在您将看到正在生成的 TMF 文件列表:
....
tracepdb: info BNP0000: WPPFMT generating C:\tracing\72e5b5cd-5b46-3568-7f3a-3eb074bedc0f.tmf for C:\tracing\winusb.pdb\450C4140E6D427E5ED2F1820DE4C7A2E1\winusb.pdb
...
希望您能在该列表中看到所需的 GUID。如果没有,则它实际上不在该文件中,或者由于某种原因已从公共符号中删除。
请注意,如果您正在调试.etl
从另一台计算机收集的文件,您还需要.sys
从该计算机收集文件以获取正确的符号版本。
4. 解码踪迹
现在我们有了文件.tmf
,可以将它们传递给tracefmt.exe
:
tracefmt.exe mylog.etl -p C:\tracing -o mylog.txt
该命令将显示结果计数如下:
Processing completed Buffers: 156, Events: 274074, EventsLost: 0 :: Format Errors: 0, Unknowns: 8409
在这种情况下,大多数事件都已正确解码,但仍有一些未知数。检查其中还有哪些行Unknown
,然后从步骤 1 开始重复。