コード例 #1
0
ファイル: Monitor.cs プロジェクト: jeswin/BigBrother
        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);
                    }
                }
            }
        }
コード例 #2
0
ファイル: Monitor.cs プロジェクト: EbinJohn/BigBrother
        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);
                    }
                }
            }
        }