如何从ETL文件中获取fileversion信息

时间:2014-07-11 14:48:23

标签: trace etw etw-eventsource

使用Microsoft TraceEvent Library,可以解析由xperf, WPRPerfView生成的ETL文件。

我发现TracEvent中的Event ImageIDFileVersion显示了文件版本,Event ImageGroup显示了文件的文件路径。现在我需要将两个事件一起映射,并且需要一种方法来确保两个事件都指向ETL跟踪文件中的同一文件。

1 个答案:

答案 0 :(得分:2)

重要信息来自ImageGroupImageIDFileVersion事件,因此请为事件分配方法:

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文件解析了fileversion。重要的是,时间戳用作相关器来查找正确的数据。我花了一些时间和Vance Morrison的帮助来确定Timestamp是否用作相关器以及如何查找文件版本。