public static ProcessLookup <JitCapProcess> Collect(JitCapCollector collector) { TraceEventDispatcher source = collector.Source; ProcessLookup <JitCapProcess> perProc = new ProcessLookup <JitCapProcess>(); source.Kernel.PerfInfoSample += delegate(SampledProfileTraceData data) { JitCapProcess stats = perProc[data]; if (stats != null) { stats.ProcessCpuTimeMsec++; string name = stats.GetSampledMethodName(collector, data); stats.UpdateMethodCounts(name); } }; source.Process(); return(perProc); }
private string GetSampledMethodName(JitCapCollector collector, SampledProfileTraceData data) { TraceCodeAddress ca = collector.GetManagedMethodOnStack(data); if (ca == null) { return(null); } if (String.IsNullOrEmpty(ca.ModuleName)) { return(null); } // Lookup symbols, if not already looked up. if (!SymbolsLookedUp.Contains(ca.ModuleName)) { try { collector.EtlDataFile.SetFilterProcess(data.ProcessID); collector.EtlDataFile.LookupSymbolsForModule(ca.ModuleName); } catch (Exception) { return(null); } SymbolsLookedUp.Add(ca.ModuleName); } if (ca.Method == null) { SymbolsMissing.Add(ca.ModuleName); return(null); } return(ca.ModuleName + "!" + ca.Method.FullMethodName); }