我有使用Microsoft.Diagnostics.Tracing.TraceEvent NuGet包的代码,并且我编写了以下代码:
using (var session = new TraceEventSession("mine"))
{
session.StopOnDispose = true;
session.EnableProvider(ClrTraceEventParser.ProviderGuid, TraceEventLevel.Verbose,
(ulong)ulong.MaxValue,//,ClrTraceEventParser.Keywords.GCSampledObjectAllocationHigh,
new TraceEventProviderOptions
{
StacksEnabled = true,
});
using (TraceLogEventSource traceLogSource = TraceLog.CreateFromTraceEventSession(session))
{
traceLogSource.Clr.GCSampledObjectAllocation += data =>
{
Console.WriteLine(data);
};
traceLogSource.Process();
}
}这给我的输出看起来有点像这样:
<Event
MSec="10355.9688"
PID="7056"
PName=""
TID="11468"
EventName="GC/SampledObjectAllocation"
Address="0x000000C780036870"
TypeID="0x00007FFF1EC60BD8"
ObjectCountForTypeSample="1"
TotalSizeForTypeSample="28"
ClrInstanceID="9" /> 很明显,这里分配了一个对象,它的大小是28字节。但是,我不知道如何将TypeID映射到类型名称。
看起来这就是我想要的:
traceLogSource.Clr.TypeBulkType += data =>
{
for (int i = 0; i < data.Count; i++)
{
var e = data.Values(i);
Console.WriteLine("{0} -> {1}", e.TypeID, e.TypeName);
}
};但我不知道如何从我正在检查的进程中触发它的发送(这可能是一个非常长时间运行的进程)。批量类型似乎只在进程启动时发送(仅限观察),并且我找不到有关它们的任何文档。
你知道怎么做吗?
发布于 2015-08-26 04:04:49
如果您查看TraceEvent中的ClrTraceEventParser.Keywords (您将找到GCHeapAndTypeNames位)。当您打开它以及AllocationHigh位时,每次第一次注意到一个新类型时,它都应该发送一个BulkType事件。
https://stackoverflow.com/questions/32192615
复制相似问题