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)); } }
// 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();
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)); } }
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())); }
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; } }
public void BeforeMainRun(DiagnoserActionParameters _) { }
public void AfterGlobalSetup(DiagnoserActionParameters _) { }
// 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 _) { }
// 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}\"";
public void BeforeGlobalCleanup(DiagnoserActionParameters parameters) => diagnosers.ForEach(diagnoser => diagnoser.BeforeGlobalCleanup(parameters));
public void BeforeMainRun(DiagnoserActionParameters parameters) => diagnosers.ForEach(diagnoser => diagnoser.BeforeMainRun(parameters));
public void AfterGlobalSetup(DiagnoserActionParameters parameters) => diagnosers.ForEach(diagnoser => diagnoser.AfterGlobalSetup(parameters));
public void BeforeAnythingElse(DiagnoserActionParameters parameters) => diagnosers.ForEach(diagnoser => diagnoser.BeforeAnythingElse(parameters));
public void Handle(HostSignal signal, DiagnoserActionParameters parameters) => diagnosers.ForEach(diagnoser => diagnoser.Handle(signal, parameters));
// 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) { }
public void BeforeGlobalCleanup(DiagnoserActionParameters parameters) { }