Windows tracerpt 生成无效的事件架构

Windows tracerpt 生成无效的事件架构

我正在使用 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

相关内容