通過Microsoft TraceEvent Library可以解析由xperf, WPR或PerfView生成的ETL文件。如何從ETL文件獲取文件轉換信息
我發現TracEvent中的事件ImageIDFileVersion顯示了文件版本,事件ImageGroup顯示了文件的文件路徑。現在我需要將兩個事件映射到一起,並且需要一種方法來確保兩個事件都指向ETL跟蹤文件中的同一個文件。
通過Microsoft TraceEvent Library可以解析由xperf, WPR或PerfView生成的ETL文件。如何從ETL文件獲取文件轉換信息
我發現TracEvent中的事件ImageIDFileVersion顯示了文件版本,事件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事件涉及相應的圖像*事件之前,並且具有相同的時間戳。所以時間戳被用作相關器。
當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被用作相關器以及如何查找文件版本。