/// <summary> /// Looks up symbols for all modules that have an inclusive count >= minCount. /// stackSource, if given, can be used to be the filter. If null, 'this' is used. /// If stackSource is given, it needs to use the same indexes for frames as 'this' /// </summary> public void LookupWarmSymbols(int minCount, SymbolReader reader, StackSource stackSource = null) { if (stackSource == null) { stackSource = this; } Debug.Assert(stackSource.CallFrameIndexLimit == this.CallFrameIndexLimit); Debug.Assert(stackSource.CallStackIndexLimit == this.CallStackIndexLimit); reader.Log.WriteLine("Resolving all symbols for modules with inclusive times > {0}", minCount); if ((reader.Flags & SymbolReaderFlags.CacheOnly) != 0) { reader.Log.WriteLine("Cache-Only set: will only look on the local machine."); } // Get a list of all the unique frames. We also keep track of unique stacks for efficiency var stackModuleLists = new ModuleList[stackSource.CallStackIndexLimit]; var stackCounts = new int[stackSource.CallStackIndexLimit]; var totalCount = 0; // Compute for each stack, the set of inclusive modules for that stack stackSource.ProduceSamples(delegate(StackSourceSample sample) { stackCounts[(int)sample.StackIndex]++; totalCount++; }); reader.Log.WriteLine("Got a total of {0} samples", totalCount); // for each stack in the trace, find the list of modules for that stack var moduleCounts = new int[TraceLog.ModuleFiles.MaxModuleFileIndex]; for (int i = 0; i < stackCounts.Length; i++) { var count = stackCounts[i]; if (count > 0) { var modules = GetModulesForStack(stackModuleLists, (StackSourceCallStackIndex)i); // Update the counts for each module in that stack. while (modules != null) { moduleCounts[(int)modules.Module.ModuleFileIndex] += count; modules = modules.Next; } } } // Now that we have an list of the inclusive counts of all frames. Find all stacks that meet the threshold for (int i = 0; i < moduleCounts.Length; i++) { if (moduleCounts[i] >= minCount) { var moduleFile = TraceLog.ModuleFiles[(ModuleFileIndex)i]; reader.Log.WriteLine("Resolving symbols (count={0}) for module {1} ", moduleCounts[i], moduleFile.FilePath); TraceLog.CallStacks.CodeAddresses.LookupSymbolsForModule(reader, moduleFile); } } reader.Log.WriteLine("Done Resolving all symbols for modules with inclusive times > {0}", minCount); }