我正在使用 Windows 性能记录器Windows 性能工具包记录事件跟踪日志。
事件跟踪日志不是自描述的,而是依赖于在 Windows 中注册的“提供程序”才能正确解析二进制事件详细信息。数据收集将在一台机器上进行,而分析将在另一台机器上进行,因此需要从生成事件跟踪日志的机器导出提供程序信息。
这tracerpt
工具生成一个事件模式并将相关数据与其-export
选项捆绑在一起,这似乎是我需要的一切。
问题
当我使用生成的事件模式来tracefmt
生成可解析的文本时,它会打印一条警告:
WARNING: TdhLoadManifest("traces/providers.man") returned error code 1465
生成的文件FmtFile.txt
中有很多无法解码的条目。这些条目在事件前缀中显示为“未知”,例如:
Unknown(0v0o34t0): GUID=9b79ee91-b5fd-41c0-a243-4248e266e9d0 (decoding error 1168)
我做了一些研究,发现消息编译器可以提供事件架构文件的更详细错误。在同一文件上运行它显示:
traces/providers.man : error : Duplicate opcode value 35(0x23) used in opcode : 'opcode13'.
这看起来是一个正确的表述,如下所示
[XML]$xml = Get-Content .\traces\providers.man
echo (Select-XML -Xml $xml -XPath '//n:provider[.//n:opcode[@value="35"]/following-sibling::n:opcode[@value="35"]]' -Namespace @{ "n" = "http://schemas.microsoft.com/win/2004/08/events"}).Node
返回
name : Microsoft-Windows-DotNETRuntimeRundown
symbol : provider1
guid : {a669021c-c450-4609-a035-5af59af4df18}
source : Xml
messageFileName : noMessageFile
resourceFileName : noResourceFile
events : events
keywords : keywords
tasks : tasks
opcodes : opcodes
templates : templates
maps : maps
但这很奇怪,因为这看起来像是一个普通的内置/Microsoft 提供的提供程序,所以我认为我在生成事件模式时做错了什么。如果我编辑事件模式来解决这个问题,还有其他几个问题会引发我的tracefmt
抱怨mc
。
我的问题
为什么生成的事件模式无效?我该如何修复根本原因?我可以手动“修复”此事件模式并编写更改脚本,但这很烦人,而且不能保证它以后不会以略有不同的方式中断。
复制
可以从可用的干净虚拟机中重现此问题这里通过在 PowerShell 中运行此命令:
# Setup Windows Performance Toolkit
Invoke-WebRequest `
-Uri https://go.microsoft.com/fwlink/?linkid=2026036 `
-OutFile adksetup.exe
./adksetup.exe /features OptionId.WindowsPerformanceToolkit `
/log adk-setup.log `
/ceip off `
/installpath "C:\Program Files (x86)\Windows Kits\10\"
# Wait for setup to complete
sleep 10
# Generate dummy traces
mkdir traces
& 'C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\wpr.exe' `
-start GeneralProfile.verbose `
-start CPU.verbose
sleep 10
& 'C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\wpr.exe' `
-stop traces/wpr-result.etl
# Generate Event Schema
tracerpt -l traces/wpr-result.etl -export traces/providers.man
# Confirm with tracefmt that the generated Event Schema is not valid
$tracefmt = Get-ChildItem -Path "C:\Program Files (x86)\Windows Kits\10\bin\*\x64\tracefmt.exe" | `
Sort CreationTime -Desc | Select -First 1
& $tracefmt.FullName traces/wpr-result.etl -man traces/providers.man
# Confirm with Message Compiler that the generated Event Schema is not valid
$mc = Get-ChildItem -Path "C:\Program Files (x86)\Windows Kits\10\bin\*\x64\mc.exe" | `
Sort CreationTime -Desc | Select -First 1
& $mc.FullName traces/providers.man