C# 如何使用TraceProcessor读取虚拟配置?

C# 如何使用TraceProcessor读取虚拟配置?,c#,etw,.net-traceprocessing,C#,Etw,.net Traceprocessing,启用VirtualAlloc跟踪后,如何使用TraceProcessor返回VirtualAlloc事件 在Microsoft.Windows.EventTracing.Memory中,我只能找到 IHEAP分配 IHeapSnapshot IReferenceSetAccessedPage 我的工作环境 但没有提到虚拟的东西 请注意:使用此库解析.NET ETW事件有多难。TraceEvent库对.NET事件有很好的支持,但我不清楚应该如何扩展TraceProcessor。TracePr

启用VirtualAlloc跟踪后,如何使用TraceProcessor返回VirtualAlloc事件

在Microsoft.Windows.EventTracing.Memory中,我只能找到

  • IHEAP分配
  • IHeapSnapshot
  • IReferenceSetAccessedPage
  • 我的工作环境
但没有提到虚拟的东西

请注意:使用此库解析.NET ETW事件有多难。TraceEvent库对.NET事件有很好的支持,但我不清楚应该如何扩展TraceProcessor。TraceProcessor的.NET事件是否在路线图上?

(直到最近我还在TraceProcessor库上工作。)

正如您所注意到的,我认为我们今天没有对VirtualAlloc事件的内置支持。我将让当前的团队讨论优先级问题,但我们在过去没有收到对.NET事件的重大请求

对于VirtualAlloc(和.NET事件),是的,您可以自己解析这些事件。见:

请参阅概述。您需要了解VirtualAlloc事件的格式,才能知道如何解析它,以及这些事件的提供者ID/事件ID/版本。

(直到最近我还在TraceProcessor库上工作。)

正如您所注意到的,我认为我们今天没有对VirtualAlloc事件的内置支持。我将让当前的团队讨论优先级问题,但我们在过去没有收到对.NET事件的重大请求

对于VirtualAlloc(和.NET事件),是的,您可以自己解析这些事件。见:


请参阅概述。您需要了解VirtualAlloc事件的格式,才能知道如何解析它,以及这些事件的提供者ID/事件ID/版本。

现在有几个人提出了问题,下面是一个获取VirtualAlloc/VirtualFree事件数据的示例:

使用Microsoft.Windows.EventTracing;
使用Microsoft.Windows.EventTracing.Process;
使用Microsoft.Windows.EventTracing.Symbols;
使用制度;
使用System.Collections.Generic;
使用System.Runtime.InteropServices;
班级计划
{
静态int Main(字符串[]args)
{
如果(args.Length!=1)
{
Console.Error.WriteLine(“用法:VirtualAllocFree.exe”);
返回1;
}
尝试
{
运行(args[0]);
}
捕获(异常)
{
Console.Error.WriteLine(异常);
返回exception.HResult;
}
返回0;
}
静态无效运行(字符串跟踪路径)
{
使用(ITraceProcessor trace=TraceProcessor.Create(tracePath))
{
Guid kernelMemoryProviderId=新Guid(“3d6fa8d3-fe05-11d0-9dda-00c04fd7ba7c”);
IPendingResult pendingStackDataSource=trace.UseStacks();
IPendingResult pendingProcessDataSource=trace.useProcesss();
List virtualAllocOrFreeEvents=新列表();
TraceeEventCallback handleKernelMemoryEvent=(EventContext EventContext)=>
{
ClassicEvent ClassicEvent=eventContext.Event.AsClassicEvent;
如果(ClassiceEvent.Version<2)
{
回来
}
int eventId=classicEvent.Id;
常数int virtualAllocEventId=98;
const int virtualFreeEventId=99;
if(eventId!=virtualAllocEventId&&eventId!=virtualFreeEventId)
{
回来
}
VirtualAlloc64EventData事件数据;
if(ClassiceEvent.is32位)
{
if(classicEvent.Data.Length!=Marshal.SizeOf())
{
抛出新的InvalidTraceDataException(“无效的虚拟alloc/free事件”);
}
VirtualAlloc32EventData thunk=MemoryMarshal.Read(classicEvent.Data);
eventData.Base=thunk.Base;
eventData.Size=thunk.Size;
eventData.ProcessId=thunk.ProcessId;
eventData.Flags=thunk.Flags;
}
其他的
{
if(classicEvent.Data.Length!=Marshal.SizeOf())
{
抛出新的InvalidTraceDataException(“无效的虚拟alloc/free事件”);
}
eventData=MemoryMarshal.Read(ClassiceEvent.Data);
}
AddressRange AddressRange=新地址范围(新地址(eventData.Base),
未选中((long)eventData.Size));
int processId=未选中((int)eventData.processId);
VirtualAllocFlags=eventData.flags;
TraceTimestamp时间戳=ClassiceEvent.timestamp;
int threadId=classicEvent.threadId.Value;
添加新的virtualAllocOrFreeEvents(地址范围、进程ID、标志、时间戳、,
threadId、pendingProcessDataSource、pendingStackDataSource);
};
使用(新Guid[]{kernelMemoryProviderId},handleKernelMemoryEvent);
IPendingResult pendingSymbolDataSource=trace.usesymbles();
trace.Process();
pendingSymbolDataSource.Result
.LoadSymbolForConsoleAsync(SymCachePath.Automatic,SymbolPath.Automatic).GetWaiter().GetResult();
WriteLine($“虚拟alloc/free事件总数:{virtualAllocOrFreeEvents.Count}”);
}
}
结构VirtualAlloc64EventData
{
公共乌龙基地;
公共乌龙大小;
公共uint进程ID;
公共虚拟彩旗;
}
结构VirtualAlloc32EventData
{
#pragma警告禁用CS0649
公共单位基地;
公共单位面积;
公共uint进程ID;
公共虚拟彩旗;
#pragma警告恢复CS0649