0

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

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

4

1 回答 1

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*event 之前,并且具有相同的时间戳。所以Timestamp 被用作相关器

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 文件中解析了文件版本。重要的一点是时间戳被用作相关器来找到正确的数据。这花了我一段时间,并在Vance Morrison的帮助下弄清楚 Timestamp 被用作相关器以及如何找到文件版本。

于 2014-07-11T14:48:23.463 回答