Trace 如何从ETL文件中获取文件版本信息
使用,可以解析由或生成的ETL文件Trace 如何从ETL文件中获取文件版本信息,trace,etw,etw-eventsource,Trace,Etw,Etw Eventsource,使用,可以解析由或生成的ETL文件 我发现TracEvent中的事件ImageIDFileVersion显示文件版本,事件ImageGroup显示文件路径。现在,我需要将两个事件映射到一起,并需要一种方法来确保两个事件都指向ETL跟踪文件中的同一个文件。重要信息来自ImageGroup和ImageIDFileVersion事件,因此为事件指定方法: using (_source = new ETWTraceEventSource(dataFileName)) { var kernelP
我发现TracEvent中的事件ImageIDFileVersion显示文件版本,事件ImageGroup显示文件路径。现在,我需要将两个事件映射到一起,并需要一种方法来确保两个事件都指向ETL跟踪文件中的同一个文件。重要信息来自
ImageGroup
和ImageIDFileVersion
事件,因此为事件指定方法:
using (_source = new ETWTraceEventSource(dataFileName))
{
var kernelParser = new KernelTraceEventParser(_source);
_source.Kernel.ImageGroup += KernelOnImageGroup;
var symbolParser = new SymbolTraceEventParser(_source);
symbolParser.ImageIDFileVersion += SymbolParserOnImageIdFileVersion;
// go into a loop processing events can calling the callbacks. This will return when the all the events
// In the file are processed, or the StopProcessing() call is made.
_source.Process();
}
基本上,FileVersionTraceData事件位于相应的Image*事件之前,并且具有相同的时间戳。因此,时间戳被用作相关器
当发生ImageIDFileVersion
事件时,必须将当前数据克隆到其他FileVersionTraceData对象中,以将其存储起来供以后使用:
void SymbolParserOnImageIdFileVersion(FileVersionTraceData data)
{
lastFileVersionData = (FileVersionTraceData)data.Clone();
}
在此之后,第二个事件ImageGroup
被命中。在这里,您必须将时间戳(TimeStampRelativeMSec
)与存储的数据进行比较,如果时间戳与两个事件匹配,则指向同一个文件
void KernelOnImageGroup(ImageLoadTraceData imageLoadTraceData)
{
var fileName = imageLoadTraceData.FileName;
{
if (!string.IsNullOrEmpty(fileName))
{
if (lastFileVersionData != null && lastFileVersionData.TimeStampRelativeMSec == imageLoadTraceData.TimeStampRelativeMSec)
{
var fileVersion = lastFileVersionData.FileVersion;
var origFileName = lastFileVersionData.OrigFileName;
Console.WriteLine("found File {0} with File Version {1}", origFileName, fileVersion);
}
}
}
}
现在,您已经从ETL文件中解析了文件版本。重要的一点是,时间戳被用作查找正确数据的相关器。这花了我一段时间,在的帮助下,我发现时间戳被用作相关器,以及如何找到文件版本