Пример #1
0
        public static IEnumerable <CompilerInvocation> ExtractInvocations(string binLogFilePath)
        {
            if (!File.Exists(binLogFilePath))
            {
                throw new FileNotFoundException(binLogFilePath);
            }

            if (binLogFilePath.EndsWith(".buildlog", StringComparison.OrdinalIgnoreCase))
            {
                return(ExtractInvocationsFromBuild(binLogFilePath));
            }

            var invocations           = new List <CompilerInvocation>();
            var reader                = new BinaryLogReplayEventSource();
            var records               = reader.ReadRecords(binLogFilePath);
            var taskIdToInvocationMap = new Dictionary <int, CompilerInvocation>();

            foreach (var record in records)
            {
                var invocation = TryGetInvocationFromRecord(record, taskIdToInvocationMap);
                if (invocation != null)
                {
                    invocations.Add(invocation);
                }
            }

            return(invocations);
        }
Пример #2
0
            public void ProcessFile(string filePath)
            {
                var eventsSource = new BinaryLogReplayEventSource();

                eventsSource.AnyEventRaised += (sender, e) => Dispatch(e);
                eventsSource.Replay(filePath);
            }
Пример #3
0
        public void TestBinaryLoggerRoundtrip()
        {
            var originalTargetOutputLogging = Environment.GetEnvironmentVariable(MSBUILDTARGETOUTPUTLOGGING);

            try
            {
                var binaryLogger = new BinaryLogger();
                var logFilePath  = "BinaryLoggerTest.binlog";
                binaryLogger.Parameters = logFilePath;

                var mockLogger1 = new MockLogger();

                // build and log into binary logger and mockLogger1
                ObjectModelHelpers.BuildProjectExpectSuccess(s_testProject, binaryLogger, mockLogger1);

                var mockLogger2 = new MockLogger();

                var binaryLogReader = new BinaryLogReplayEventSource();
                mockLogger2.Initialize(binaryLogReader);

                // read the binary log and replay into mockLogger2
                binaryLogReader.Replay(logFilePath);

                if (File.Exists(logFilePath))
                {
                    File.Delete(logFilePath);
                }

                Assert.Equal(mockLogger1.FullLog, mockLogger2.FullLog);
            }
            finally
            {
                Environment.SetEnvironmentVariable(MSBUILDTARGETOUTPUTLOGGING, originalTargetOutputLogging);
            }
        }
        public int LoadDocData(string moniker)
        {
            try
            {
                var replayer = new BinaryLogReplayEventSource();
                var builder  = new ModelBuilder(replayer);
                replayer.Replay(moniker);
                _filename = moniker;
                Log       = builder.Finish();
            }
            catch (Exception ex)
            {
                if (ex is AggregateException aggregateException)
                {
                    Log = new Log(null, ImmutableList <Evaluation> .Empty, aggregateException.InnerExceptions.ToImmutableList());
                }
                else
                {
                    Log = new Log(null, ImmutableList <Evaluation> .Empty, new[] { ex }.ToImmutableList());
                }
            }

            Loaded?.Invoke(this, new EventArgs());

            return(VSConstants.S_OK);
        }
Пример #5
0
        public static Build ReadBuild(string filePath)
        {
            var eventSource = new BinaryLogReplayEventSource();

            byte[] sourceArchive = null;

            eventSource.OnBlobRead += (kind, bytes) =>
            {
                if (kind == BinaryLogRecordKind.ProjectImportArchive)
                {
                    sourceArchive = bytes;
                }
            };

            StructuredLogger.SaveLogToDisk = false;
            StructuredLogger.CurrentBuild  = null;
            var structuredLogger = new StructuredLogger();

            structuredLogger.Parameters = "build.buildlog";
            structuredLogger.Initialize(eventSource);

            var sw = Stopwatch.StartNew();

            eventSource.Replay(filePath);
            var elapsed = sw.Elapsed;

            structuredLogger.Shutdown();

            var build = StructuredLogger.CurrentBuild;

            StructuredLogger.CurrentBuild = null;

            if (build == null)
            {
                build = new Build()
                {
                    Succeeded = false
                };
                build.AddChild(new Error()
                {
                    Text = "Error when opening the file: " + filePath
                });
            }

            var projectImportsZip = Path.ChangeExtension(filePath, ".ProjectImports.zip");

            if (sourceArchive == null && File.Exists(projectImportsZip))
            {
                sourceArchive = File.ReadAllBytes(projectImportsZip);
            }

            build.SourceFilesArchive = sourceArchive;
            // build.AddChildAtBeginning(new Message { Text = "Elapsed: " + elapsed.ToString() });

            return(build);
        }
Пример #6
0
        //[Fact]
        //public void SearchPerf()
        //{
        //    var file = @"D:\contentsync.xml";
        //    var build = Serialization.Read(file);
        //    var sw = Stopwatch.StartNew();
        //    var search = new Search(build);
        //    var results = search.FindNodes("test");
        //    var elapsed = sw.Elapsed;
        //    MessageBox.Show(elapsed.ToString());
        //    File.WriteAllLines(@"D:\2.txt", results.Select(r => r.Field).ToArray());
        //}

        //[Fact]
        public void ReadBinaryLogRecords()
        {
            var reader  = new BinaryLogReplayEventSource();
            var records = reader.ReadRecords(@"C:\temp\msbuild.binlog");

            foreach (var record in records)
            {
                var t = record.Args;
            }
        }
Пример #7
0
        //[Fact]
        //public void SearchPerf()
        //{
        //    var file = @"D:\contentsync.xml";
        //    var build = Serialization.Read(file);
        //    var sw = Stopwatch.StartNew();
        //    var search = new Search(build);
        //    var results = search.FindNodes("test");
        //    var elapsed = sw.Elapsed;
        //    MessageBox.Show(elapsed.ToString());
        //    File.WriteAllLines(@"D:\2.txt", results.Select(r => r.Field).ToArray());
        //}

        //[Fact]
        public void ReadBinaryLogRecords()
        {
            var reader  = new BinaryLogReplayEventSource();
            var records = reader.ReadRecords(@"D:\msbuild.binlog").ToArray();
            var count   = records.Length;

            foreach (var record in records)
            {
                var t = record.Args;
            }
        }
Пример #8
0
        public void TestBinaryLoggerRoundtrip(string projectText)
        {
            var binaryLogger = new BinaryLogger();

            binaryLogger.Parameters = _logFile;

            var mockLogFromBuild = new MockLogger();

            var serialFromBuildText = new StringBuilder();
            var serialFromBuild     = new SerialConsoleLogger(Framework.LoggerVerbosity.Diagnostic, t => serialFromBuildText.Append(t), colorSet: null, colorReset: null);

            serialFromBuild.Parameters = "NOPERFORMANCESUMMARY";

            var parallelFromBuildText = new StringBuilder();
            var parallelFromBuild     = new ParallelConsoleLogger(Framework.LoggerVerbosity.Diagnostic, t => parallelFromBuildText.Append(t), colorSet: null, colorReset: null);

            parallelFromBuild.Parameters = "NOPERFORMANCESUMMARY";

            // build and log into binary logger, mock logger, serial and parallel console loggers
            ObjectModelHelpers.BuildProjectExpectSuccess(projectText, binaryLogger, mockLogFromBuild, serialFromBuild, parallelFromBuild);

            var mockLogFromPlayback = new MockLogger();

            var serialFromPlaybackText = new StringBuilder();
            var serialFromPlayback     = new SerialConsoleLogger(Framework.LoggerVerbosity.Diagnostic, t => serialFromPlaybackText.Append(t), colorSet: null, colorReset: null);

            serialFromPlayback.Parameters = "NOPERFORMANCESUMMARY";

            var parallelFromPlaybackText = new StringBuilder();
            var parallelFromPlayback     = new ParallelConsoleLogger(Framework.LoggerVerbosity.Diagnostic, t => parallelFromPlaybackText.Append(t), colorSet: null, colorReset: null);

            parallelFromPlayback.Parameters = "NOPERFORMANCESUMMARY";

            var binaryLogReader = new BinaryLogReplayEventSource();

            mockLogFromPlayback.Initialize(binaryLogReader);
            serialFromPlayback.Initialize(binaryLogReader);
            parallelFromPlayback.Initialize(binaryLogReader);

            // read the binary log and replay into mockLogger2
            binaryLogReader.Replay(_logFile);

            // the binlog will have more information than recorded by the text log
            mockLogFromPlayback.FullLog.ShouldContainWithoutWhitespace(mockLogFromBuild.FullLog);

            var serialExpected   = serialFromBuildText.ToString();
            var serialActual     = serialFromPlaybackText.ToString();
            var parallelExpected = parallelFromBuildText.ToString();
            var parallelActual   = parallelFromPlaybackText.ToString();

            serialActual.ShouldContainWithoutWhitespace(serialExpected);
            parallelActual.ShouldContainWithoutWhitespace(parallelExpected);
        }
        public static void SomeMethodWithLogger()
        {
            string binLogFilePath = @"C:\temp\test.binlog";

            var binLogReader = new BinaryLogReplayEventSource();

            foreach (var record in binLogReader.ReadRecords(binLogFilePath))
            {
                var buildEventArgs = record.Args;

                // print command lines of all tool tasks such as Csc
                if (buildEventArgs is TaskCommandLineEventArgs taskCommandLine)
                {
                    Console.WriteLine(taskCommandLine.CommandLine);
                }
            }
        }
Пример #10
0
        private static void WriteOutCommandlineArgs(string binLogPath, string outFilePath)
        {
            string binLogFilePath = binLogPath;
            var    binLogReader   = new BinaryLogReplayEventSource();

            TaskCommandLineEventArgs[] taskCommandLineEventArgs = binLogReader.ReadRecords(binLogFilePath).AsParallel()
                                                                  .Select(x => x.Args).OfType <TaskCommandLineEventArgs>().ToArray();
            var commandline = taskCommandLineEventArgs
                              .Where(x => x.CommandLine.StartsWith(@"C:\Users\jmarolf\.nuget\packages\microsoft.net.compilers\2.9.0-beta7-63018-03\tools\vbc.exe") ||
                                     x.CommandLine.StartsWith(@"C:\Users\jmarolf\.nuget\packages\microsoft.net.compilers\2.9.0-beta7-63018-03\tools\csc.exe"))
                              .Select(x => x.CommandLine.StartsWith(@"C:\Users\jmarolf\.nuget\packages\microsoft.net.compilers\2.9.0-beta7-63018-03\tools\vbc.exe")
                            ? x.CommandLine.Replace(@"C:\Users\jmarolf\.nuget\packages\microsoft.net.compilers\2.9.0-beta7-63018-03\tools\vbc.exe", "vbc.exe")
                            : x.CommandLine.Replace(@"C:\Users\jmarolf\.nuget\packages\microsoft.net.compilers\2.9.0-beta7-63018-03\tools\csc.exe", "csc.exe"))
                              .ToArray();

            File.WriteAllLines(outFilePath, commandline);
        }
Пример #11
0
        public static Build ReadBuild(string filePath)
        {
            var eventSource = new BinaryLogReplayEventSource();

            StructuredLogger.SaveLogToDisk = false;
            StructuredLogger.CurrentBuild  = null;
            var structuredLogger = new StructuredLogger();

            structuredLogger.Parameters = "build.buildlog";
            structuredLogger.Initialize(eventSource);

            eventSource.Replay(filePath);

            var build = StructuredLogger.CurrentBuild;

            StructuredLogger.CurrentBuild = null;

            return(build);
        }
        public void Load(string fileName)
        {
            try {
                var replayEventSource = new BinaryLogReplayEventSource();
                var builder           = new ModelBuilder(replayEventSource);
                replayEventSource.Replay(fileName);
                Log = builder.Finish();
            } catch (Exception ex) {
                if (ex is AggregateException aggregateException)
                {
                    Log = new Log(null, ImmutableList <Evaluation> .Empty, aggregateException.InnerExceptions.ToImmutableList());
                }
                else
                {
                    Log = new Log(null, ImmutableList <Evaluation> .Empty, new[] { ex }.ToImmutableList());
                }
            }

            Loaded?.Invoke(this, new EventArgs());
        }
Пример #13
0
        public void TestBinaryLoggerRoundtrip()
        {
            var binaryLogger = new BinaryLogger();

            binaryLogger.Parameters = _logFile;

            var mockLogger1 = new MockLogger();

            // build and log into binary logger and mockLogger1
            ObjectModelHelpers.BuildProjectExpectSuccess(s_testProject, binaryLogger, mockLogger1);

            var mockLogger2 = new MockLogger();

            var binaryLogReader = new BinaryLogReplayEventSource();

            mockLogger2.Initialize(binaryLogReader);

            // read the binary log and replay into mockLogger2testassembly
            binaryLogReader.Replay(_logFile);

            Assert.Equal(mockLogger1.FullLog, mockLogger2.FullLog);
        }
Пример #14
0
 public void AddLog(string filename)
 {
     try
     {
         var replayer = new BinaryLogReplayEventSource();
         var builder  = new ModelBuilder(replayer);
         replayer.Replay(filename);
         var log = builder.Finish();
         _logs.Add(new LogViewModel(filename, log));
     }
     catch (Exception ex)
     {
         if (ex is AggregateException aggregateException)
         {
             _logs.Add(new LogViewModel(filename, aggregateException.InnerExceptions));
         }
         else
         {
             _logs.Add(new LogViewModel(filename, new [] { ex }));
         }
     }
 }
Пример #15
0
        public void TestBinaryLoggerRoundtrip()
        {
            var originalTargetOutputLogging = Environment.GetEnvironmentVariable(MSBUILDTARGETOUTPUTLOGGING);

            try
            {
                var binaryLogger = new BinaryLogger();

                // with this file name, the file will be archived as as build artifact so we can inspect it later
                // this is needed to investigate an intermittent failure of this test on Ubuntu 14
                var logFilePath = "Microsoft.Build.Engine.UnitTests.dll_TestBinaryLoggerRoundtrip.binlog";
                binaryLogger.Parameters = logFilePath;

                var mockLogger1 = new MockLogger();

                // build and log into binary logger and mockLogger1
                ObjectModelHelpers.BuildProjectExpectSuccess(s_testProject, binaryLogger, mockLogger1);

                var mockLogger2 = new MockLogger();

                var binaryLogReader = new BinaryLogReplayEventSource();
                mockLogger2.Initialize(binaryLogReader);

                // read the binary log and replay into mockLogger2
                binaryLogReader.Replay(logFilePath);

                if (File.Exists(logFilePath))
                {
                    File.Delete(logFilePath);
                }

                Assert.Equal(mockLogger1.FullLog, mockLogger2.FullLog);
            }
            finally
            {
                Environment.SetEnvironmentVariable(MSBUILDTARGETOUTPUTLOGGING, originalTargetOutputLogging);
            }
        }
Пример #16
0
        public void TestBinaryLoggerRoundtrip(string projectText)
        {
            var binaryLogger = new BinaryLogger();

            binaryLogger.Parameters = _logFile;

            var mockLogFromBuild = new MockLogger();

            // build and log into binary logger and mockLogger1
            ObjectModelHelpers.BuildProjectExpectSuccess(projectText, binaryLogger, mockLogFromBuild);

            var mockLogFromPlayback = new MockLogger();

            var binaryLogReader = new BinaryLogReplayEventSource();

            mockLogFromPlayback.Initialize(binaryLogReader);

            // read the binary log and replay into mockLogger2
            binaryLogReader.Replay(_logFile);

            // the binlog will have more information than recorded by the text log
            Assert.Contains(mockLogFromBuild.FullLog, mockLogFromPlayback.FullLog);
        }
Пример #17
0
        private static void PlaybackBinlog(string binlogFilePath, params ILogger[] loggers)
        {
            var replayEventSource = new BinaryLogReplayEventSource();

            foreach (var logger in loggers)
            {
                if (logger is INodeLogger nodeLogger)
                {
                    nodeLogger.Initialize(replayEventSource, 1);
                }
                else
                {
                    logger.Initialize(replayEventSource);
                }
            }

            replayEventSource.Replay(binlogFilePath);

            foreach (var logger in loggers)
            {
                logger.Shutdown();
            }
        }
Пример #18
0
        public static Build ReadBuild(Stream stream, byte[] projectImportsArchive = null)
        {
            var eventSource = new BinaryLogReplayEventSource();

            Build build = null;

            eventSource.OnBlobRead += (kind, bytes) =>
            {
                if (kind == BinaryLogRecordKind.ProjectImportArchive)
                {
                    projectImportsArchive = bytes;
                }
            };
            eventSource.OnException += ex =>
            {
                if (build != null)
                {
                    build.AddChild(new Error()
                    {
                        Text = "Error when reading the file: " + ex.ToString()
                    });
                }
            };

            StructuredLogger.SaveLogToDisk = false;
            StructuredLogger.CurrentBuild  = null;
            var structuredLogger = new StructuredLogger();

            structuredLogger.Parameters = "build.buildlog";
            structuredLogger.Initialize(eventSource);

            build = structuredLogger.Construction.Build;

            var sw = Stopwatch.StartNew();

            eventSource.Replay(stream);
            var elapsed = sw.Elapsed;

            structuredLogger.Shutdown();

            build = StructuredLogger.CurrentBuild;
            StructuredLogger.CurrentBuild = null;

            if (build == null)
            {
                build = new Build()
                {
                    Succeeded = false
                };
                build.AddChild(new Error()
                {
                    Text = "Error when opening the log file."
                });
            }

            if (build.SourceFilesArchive == null && projectImportsArchive != null)
            {
                build.SourceFilesArchive = projectImportsArchive;
            }

            // build.AddChildAtBeginning(new Message { Text = "Elapsed: " + elapsed.ToString() });

            return(build);
        }