使用Microsoft TraceEvent Library,可以解析由xperf, WPR或PerfView生成的ETL文件。
我发现TracEvent中的Event ImageIDFileVersion显示了文件版本,Event ImageGroup显示了文件的文件路径。现在我需要将两个事件一起映射,并且需要一种方法来确保两个事件都指向ETL跟踪文件中的同一文件。
答案 0 :(得分:2)
重要信息来自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文件解析了fileversion。重要的是,时间戳用作相关器来查找正确的数据。我花了一些时间和Vance Morrison的帮助来确定Timestamp是否用作相关器以及如何查找文件版本。