private void CreateBreakpoints() { foreach (var assembly in configuration.assemblies) { var assemblySymbols = shell.PdbSymbolCache[assembly.path]; var methodLocator = shell.GetMethodLocator(assembly.path); foreach (var methodConfiguration in assembly.methods) { var methodInfo = methodLocator.GetMethod(methodConfiguration); var methodPath = MethodPath.Read(methodConfiguration.name); if (methodInfo != null) { var methodSymbols = assemblySymbols.methods.Where(s => MethodPath.Read(s.name).Type == methodPath.Type && MethodPath.Read(s.name).Method == methodPath.Method && Convert.ToInt32(s.token, 16) == methodInfo.MetadataToken).Single(); var bpDetails = new BreakpointDetails { Method = methodConfiguration, MethodInfo = methodInfo }; //Create method entry break point. var entrySequencePoint = methodSymbols.sequencePoints.First(p => !p.hidden); var methodEntryFile = assemblySymbols.sourceFiles.Where(s => s.id == entrySequencePoint.sourceId).Single(); var bpEntry = CreateBreakpointAtPosition(methodEntryFile.url + ":" + entrySequencePoint.startRow); var bpEntryInfo = new BreakpointMetadata { Reason = BreakpointReason.MethodEntry, Details = bpDetails }; breakpointMetadataList[bpEntry] = bpEntryInfo; shell.WriteLine(bpEntry.ToString()); //Create method exit break point. var exitSequencePoint = methodSymbols.sequencePoints.Last(); var methodExitFile = assemblySymbols.sourceFiles.Where(s => s.id == exitSequencePoint.sourceId).Single(); var bpExit = CreateBreakpointAtPosition(methodExitFile.url + ":" + exitSequencePoint.startRow); var bpExitInfo = new BreakpointMetadata { Reason = BreakpointReason.MethodExit, Details = bpDetails }; breakpointMetadataList[bpExit] = bpExitInfo; shell.WriteLine(bpExit.ToString()); shell.WriteLine("Monitoring {0}", methodConfiguration.name); } else { shell.WriteLine("WARNING: Unresolved {0}", methodConfiguration.name); } } } }