为何Perfview无法显示ETW日志的提供者名称、事件名称及消息?
Troubleshooting PerfView's GUID-only Display for Split ETW .etl Files
从你的描述来看,同一会话生成的分割ETW文件,部分能正常解析出提供者名称、事件名和消息,另一部分却只显示GUID,且异常事件缺少<PrettyPrint>信息、TemplateType为UnhandledTraceEvent——这种情况大概率和ETW元数据的加载/同步有关,而非事件源本身的问题。结合我处理这类问题的经验,给你几个排查和解决的方向:
1. 确认PerfView的元数据加载策略
PerfView依赖ETW提供者的元数据(包含事件模板、名称映射等)来解析事件,而分割文件可能存在元数据未被正确加载的情况:
- 打开PerfView时,确保勾选了**“Load All Metadata”**选项(在“Open Trace”对话框的右下角)。这个选项会强制PerfView加载所有可用的ETW元数据,而不是只加载当前文件中包含的元数据。
- 如果已经打开了文件,可以尝试在PerfView的菜单中选择**“Trace -> Reload Metadata”**,重新加载元数据后再查看异常文件。
2. 检查ETW会话的元数据写入时机
当使用Session.MultiFileMB分割日志时,ETW默认只会在会话启动或提供者元数据变更时写入元数据到日志文件中。如果后续的分割文件没有包含元数据片段,PerfView就无法解析事件,只能显示GUID:
- 可以尝试在ETW会话配置中,强制定期写入元数据。比如在代码创建会话时设置
EnableMetadataTrace为true,或者使用logman命令时添加-meta参数,让ETW在每个分割文件中都包含元数据。 - 验证第一个分割文件是否包含完整的元数据:用PerfView打开第一个文件,确认能正常解析事件,然后尝试将第一个文件的元数据导出(通过“File -> Export Metadata”),再导入到异常的文件中(“File -> Import Metadata”),看是否能正常解析。
3. 手动导入提供者元数据
如果PerfView自动加载元数据失败,可以手动导入提供者的元数据:
- 找到事件源对应的程序集或清单文件,如果是自定义ETW提供者,通常会有一个
.man清单文件或者包含元数据的DLL。 - 使用
wevtutil im <清单文件路径>命令注册清单(如果还没注册),然后重新用PerfView打开异常的.etl文件。 - 或者在PerfView中,通过**“Tools -> Register ETW Providers”**选项,手动注册提供者的元数据。
4. 排查系统层面的ETW错误
有时候系统层面的ETW服务异常也会导致元数据写入失败:
- 打开Windows事件查看器,查看**“Applications and Services Logs -> Microsoft -> Windows -> EventLog-ETW”**下的日志,看有没有关于ETW会话元数据写入失败、提供者注册失败的错误信息。
- 检查ETW相关服务(
EventLog和Windows Event Collector)是否正常运行,尝试重启这些服务后重新生成日志。
5. 验证PerfView版本和环境兼容性
旧版本的PerfView可能存在分割文件元数据解析的bug:
- 下载最新版本的PerfView,用新版本打开异常文件,看是否能正常解析。
- 确保运行PerfView的系统和生成ETW日志的系统是相同的架构(x86/x64),避免架构不兼容导致的元数据解析失败。
内容的提问来源于stack exchange,提问作者Amruth Raj.V
相关产品推荐
相关产品推荐

