Ho codice che utilizza il pacchetto Microsoft.Diagnostics.Tracing.TraceEvent
NuGet, e ho scritto il seguente codice:Traducendo TypeId da 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();
}
}
Questo mi dà un output che appare un po 'come questo:
<Event
MSec="10355.9688"
PID="7056"
PName=""
TID="11468"
EventName="GC/SampledObjectAllocation"
Address="0x000000C780036870"
TypeID="0x00007FFF1EC60BD8"
ObjectCountForTypeSample="1"
TotalSizeForTypeSample="28"
ClrInstanceID="9" />
Quale è abbastanza chiaro, c'è un oggetto allocato e la sua dimensione è di 28 byte. Tuttavia, non so come mappare il TypeID in un nome di tipo.
Sembra che questo sarebbe fare quello che voglio:
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);
}
};
Ma io non so come attivare la sua inviando dal processo che sto controllando (che può essere un tempo molto lungo in esecuzione uno) . Il tipo di massa sembra essere inviato solo all'avvio del processo (solo per l'osservazione) e non riesco a trovare alcun documento su di essi.
Qualche idea su come farlo?
Se guardi il codice, sto effettivamente inviando _all_ flags (in questo caso di test, ovviamente). Il mio problema è che il mio codice sta provando a controllare un server di lunga durata, quindi tutti i tipi di cui stiamo parlando sono già stati caricati. C'è un modo per indurlo a mandarli di nuovo? O qualche altro modo per ottenere il mapping tra TypeId e il nome effettivo? –