2015-08-24 3 views
8

У меня есть код, который использует 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); 
    } 
}; 

Но я не знаю, как вызвать его отправки из процесса, который я проверяю (который может быть очень долго работает один) , Объемный тип, кажется, отправляется только при запуске процесса (только наблюдение), и я не могу найти никаких документов на них.

Любые идеи, как это сделать?

ответ

0

Если вы посмотрите на ClrTraceEventParser.Keywords в TraceEvent (вы найдете бит GCHeapAndTypeNames). Когда вы включаете это, а также бит AllocationHigh, каждый раз, когда новый тип замещается в первый раз, он должен отправлять событие BulkType.

+0

Если вы посмотрите на код, я фактически отправляю флаги _all_ (в этом случае, очевидно). Мои проблемы в том, что мой код пытается проверить длинный сервер, поэтому все типы, о которых мы говорим, уже загружены. Есть ли способ побудить его отправить их снова? Или каким-либо другим способом получить сопоставление между TypeId и фактическим именем? –