Example #1
0
        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);
        }
Example #2
0
        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);
        }