У меня есть код, который использует NuGet пакет Microsoft.Diagnostics.Tracing.TraceEvent
, и я написал следующий код:Транслейтинг TypeId от GCSampledObjectAllocationHigh
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);
}
};
Но я не знаю, как вызвать его отправки из процесса, который я проверяю (который может быть очень долго работает один) , Объемный тип, кажется, отправляется только при запуске процесса (только наблюдение), и я не могу найти никаких документов на них.
Любые идеи, как это сделать?
Если вы посмотрите на код, я фактически отправляю флаги _all_ (в этом случае, очевидно). Мои проблемы в том, что мой код пытается проверить длинный сервер, поэтому все типы, о которых мы говорим, уже загружены. Есть ли способ побудить его отправить их снова? Или каким-либо другим способом получить сопоставление между TypeId и фактическим именем? –