2015-08-24 10 views
8

Ich habe Code, der die Microsoft.Diagnostics.Tracing.TraceEvent NuGet-Paket verwendet, und ich schrieb den folgenden Code:Translating TypeId von 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(); 
    } 
} 

Diese mir Ausgabe gibt, die etwas wie folgt aussieht:

<Event 
    MSec="10355.9688" 
    PID="7056" 
    PName="" 
    TID="11468" 
    EventName="GC/SampledObjectAllocation" 
    Address="0x000000C780036870" 
    TypeID="0x00007FFF1EC60BD8" 
    ObjectCountForTypeSample="1" 
    TotalSizeForTypeSample="28" 
    ClrInstanceID="9" /> 

Welche ist Klar genug, es ist ein Objekt zugeordnet, und seine Größe beträgt 28 Bytes. Ich weiß jedoch nicht, wie die TypeID einem Typnamen zugeordnet werden soll.

es so scheint, würde das tun, was ich will:

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); 
    } 
}; 

Aber ich weiß nicht, wie seine aus dem Prozess sendet auszulösen, die ich überprüft habe (was eine sehr lange dauern, kann man läuft) . Der Bulk-Typ scheint nur beim Prozessstart (nur Beobachtung) gesendet zu werden, und ich kann keine Dokumente auf ihnen finden.

Irgendwelche Ideen, wie man das macht?

Antwort

0

Wenn Sie sich die ClrTraceEventParser.Keywords in TraceEvent ansehen (Sie finden das Bit GCHeapAndTypeNames). Wenn Sie dieses Kontrollkästchen und das Bit "ZuweisungHoch" aktivieren, sollte jedes Mal, wenn ein neuer Typ zum ersten Mal erkannt wird, ein BulkType-Ereignis gesendet werden.

+0

Wenn Sie sich den Code ansehen, sende ich eigentlich _all_ flags (in diesem Testfall natürlich). Meine Probleme bestehen darin, dass mein Code versucht, einen Server mit langer Laufzeit zu überprüfen, sodass alle Typen, über die wir sprechen, bereits geladen wurden. Gibt es eine Möglichkeit, es zu veranlassen, sie wieder zu senden? Oder eine andere Möglichkeit, die Zuordnung zwischen TypeId und dem tatsächlichen Namen zu erhalten? –

Verwandte Themen