重要な情報は および イベントから取得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();
}
この後、2 番目のイベント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 が相関子として使用されていることと、ファイルのバージョンを見つける方法を見つけました。