使用Microsoft TraceEvent 库,可以解析由xperf、WPR或PerfView生成的 ETL 文件。
我发现 TracEvent 中的 Event ImageIDFileVersion 向我显示了文件版本,而 Event ImageGroup 向我显示了文件的文件路径。现在我需要将两个事件映射在一起,并且需要一种方法来确保两个事件都指向 ETL 跟踪文件中的同一个文件。
使用Microsoft TraceEvent 库,可以解析由xperf、WPR或PerfView生成的 ETL 文件。
我发现 TracEvent 中的 Event ImageIDFileVersion 向我显示了文件版本,而 Event ImageGroup 向我显示了文件的文件路径。现在我需要将两个事件映射在一起,并且需要一种方法来确保两个事件都指向 ETL 跟踪文件中的同一个文件。
重要信息来自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*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 被用作相关器以及如何找到文件版本。