2014-07-11 47 views

回答

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事件涉及相應的圖像*事件之前,並且具有相同的時間戳。所以時間戳被用作相關器

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被用作相關器以及如何查找文件版本。