Пример #1
0
        internal DisassemblyResult Dissasemble(DiagnoserActionParameters parameters)
        {
            var resultsPath = Path.GetTempFileName();

            var errors = ProcessHelper.RunAndReadOutput(
                GetDisassemblerPath(parameters.Process, parameters.BenchmarkCase.Job.Environment.Platform),
                BuildArguments(parameters, resultsPath));

            if (!string.IsNullOrEmpty(errors))
            {
                parameters.Config.GetCompositeLogger().WriteError(errors);
            }

            try
            {
                using (var stream = new FileStream(resultsPath, FileMode.Open, FileAccess.Read))
                    using (var reader = XmlReader.Create(stream))
                    {
                        var serializer = new XmlSerializer(typeof(DisassemblyResult));

                        return((DisassemblyResult)serializer.Deserialize(reader));
                    }
            }
            finally
            {
                File.Delete(resultsPath);
            }
        }
 // method was already compiled and executed for the Warmup, we can attach to the process and do the job
 public void AfterGlobalSetup(DiagnoserActionParameters parameters)
 {
     if (ShouldUseWindowsDissasembler(parameters.Benchmark))
     {
         results.Add(
             parameters.Benchmark,
             windowsDisassembler.Dissasemble(parameters));
     }
 }
Пример #3
0
 // if the benechmark requires jitting we use disassembler entry method, if not we use benchmark method name
 private string BuildArguments(DiagnoserActionParameters parameters, string resultsPath)
 => new StringBuilder(200)
 .Append(parameters.Process.Id).Append(' ')
 .Append("BenchmarkDotNet.Autogenerated.Runnable_").Append(parameters.BenchmarkId.Value).Append(' ')
 .Append(DisassemblerConstants.DiassemblerEntryMethodName).Append(' ')
 .Append(printAsm).Append(' ')
 .Append(printIL).Append(' ')
 .Append(printSource).Append(' ')
 .Append(printPrologAndEpilog).Append(' ')
 .Append(recursiveDepth).Append(' ')
 .Append($"\"{resultsPath}\"")
 .ToString();
Пример #4
0
        public void Handle(HostSignal signal, DiagnoserActionParameters parameters)
        {
            var benchmark = parameters.Benchmark;

            if (signal == HostSignal.AfterAll && ShouldUseWindowsDissasembler(benchmark))
            {
                results.Add(benchmark, windowsDisassembler.Dissasemble(parameters));
            }
            else if (signal == HostSignal.SeparateLogic && ShouldUseMonoDisassembler(benchmark))
            {
                results.Add(benchmark, monoDisassembler.Disassemble(benchmark, benchmark.Job.Env.Runtime as MonoRuntime));
            }
        }
Пример #5
0
        public void Handle(HostSignal signal, DiagnoserActionParameters parameters)
        {
            if (signal != HostSignal.BeforeAnythingElse)
            {
                return;
            }

            var diagnosticsClient = new DiagnosticsClient(parameters.Process.Id);

            EventPipeSession session = diagnosticsClient.StartEventPipeSession(eventPipeProviders, true);

            var fileName = ArtifactFileNameHelper.GetTraceFilePath(parameters, DateTime.Now, "nettrace").EnsureFolderExists();

            benchmarkToTraceFile[parameters.BenchmarkCase] = fileName;

            collectingTask = Task.Run(() => CopyEventStreamToFile(session, fileName, parameters.Config.GetCompositeLogger()));
        }
Пример #6
0
        public void Handle(HostSignal signal, DiagnoserActionParameters parameters)
        {
            var benchmark = parameters.BenchmarkCase;

            switch (signal)
            {
            case HostSignal.AfterAll when ShouldUseWindowsDisassembler(benchmark):
                results.Add(benchmark, windowsDisassembler.Disassemble(parameters));

                break;

            case HostSignal.SeparateLogic when ShouldUseMonoDisassembler(benchmark):
                results.Add(benchmark, monoDisassembler.Disassemble(benchmark, benchmark.Job.Environment.Runtime as MonoRuntime));

                break;
            }
        }
Пример #7
0
 public void BeforeMainRun(DiagnoserActionParameters _)
 {
 }
Пример #8
0
 public void AfterGlobalSetup(DiagnoserActionParameters _)
 {
 }
Пример #9
0
 // the following methods are left empty on purpose
 // the action takes places in other process, and the values are gathered by Engine
 public void BeforeAnythingElse(DiagnoserActionParameters _)
 {
 }
Пример #10
0
 // must be kept in sync with BenchmarkDotNet.Disassembler.Program.Main
 private string BuildArguments(DiagnoserActionParameters parameters, string resultsPath)
 => $"{parameters.Process.Id} \"{parameters.Benchmark.Target.Type.FullName}\" \"{parameters.Benchmark.Target.Method.Name}\""
 + $" {printAsm} {printIL} {printSource} {printPrologAndEpilog}"
 + $" {recursiveDepth}"
 + $" \"{resultsPath}\"";
Пример #11
0
 public void BeforeGlobalCleanup(DiagnoserActionParameters parameters)
 => diagnosers.ForEach(diagnoser => diagnoser.BeforeGlobalCleanup(parameters));
Пример #12
0
 public void BeforeMainRun(DiagnoserActionParameters parameters)
 => diagnosers.ForEach(diagnoser => diagnoser.BeforeMainRun(parameters));
Пример #13
0
 public void AfterGlobalSetup(DiagnoserActionParameters parameters)
 => diagnosers.ForEach(diagnoser => diagnoser.AfterGlobalSetup(parameters));
Пример #14
0
 public void BeforeAnythingElse(DiagnoserActionParameters parameters)
 => diagnosers.ForEach(diagnoser => diagnoser.BeforeAnythingElse(parameters));
Пример #15
0
 public void Handle(HostSignal signal, DiagnoserActionParameters parameters)
 => diagnosers.ForEach(diagnoser => diagnoser.Handle(signal, parameters));
Пример #16
0
 // the following methods are left empty on purpose
 // the action takes places in other process, and the values are gathered by Engine
 public void Handle(HostSignal signal, DiagnoserActionParameters parameters)
 {
 }
Пример #17
0
 public void BeforeGlobalCleanup(DiagnoserActionParameters parameters)
 {
 }