2015-08-24 13 views
8

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?

risposta

0

Se si guarda ClrTraceEventParser.Keywords in TraceEvent (si trova il bit GCHeapAndTypeNames). Quando attivi questo e il bit AllocationHigh, ogni volta che un nuovo tipo viene notato per la prima volta, deve inviare un evento BulkType.

+0

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? –