public async Task RunAsync(IConsole console, AnalysisSession session, CancellationToken cancellationToken = default) { await console.Out.WriteLineAsync("Ready to process analysis commands. Type 'help' to list available commands or 'help [command]' to get detailed help on a command."); await console.Out.WriteLineAsync("Type 'quit' or 'exit' to exit the analysis session."); while (!cancellationToken.IsCancellationRequested) { await console.Out.WriteAsync("> "); var line = await console.In.ReadLineAsync(); cancellationToken.ThrowIfCancellationRequested(); // Naive arg parsing var args = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (string.Equals(args[0], "quit", StringComparison.OrdinalIgnoreCase) || string.Equals(args[0], "q", StringComparison.OrdinalIgnoreCase) || string.Equals(args[0], "exit", StringComparison.OrdinalIgnoreCase)) { return; } if (string.Equals(args[0], "help", StringComparison.OrdinalIgnoreCase)) { await ShowHelpAsync(console, args.AsMemory().Slice(1)); } else if (_commandNames.TryGetValue(args[0], out var command)) { await command.RunAsync(console, args.Skip(1).ToArray(), session); } else { console.Error.WriteLine($"Unknown command: {args[0]}"); } } }
public async Task <int> OnExecuteAsync(IConsole console, CommandLineApplication app) { // Load the dump console.WriteLine($"Loading crash dump {DumpPath}..."); using (var target = DataTarget.LoadCrashDump(DumpPath)) { // Assume there's only one if (target.ClrVersions.Count > 1) { console.Error.WriteLine("Multiple CLR versions are present!"); return(1); } var runtime = target.ClrVersions[0].CreateRuntime(); var session = new AnalysisSession(target, runtime); await CommandProcessor.RunAsync(console, session); } return(0); }
public async Task <int> OnExecuteAsync(IConsole console, CommandLineApplication app) { var cleanupFiles = new List <string>(); MemoryDump dump = null; TraceLog trace = null; if (Files == null || Files.Count == 0) { console.Error.WriteLine("No files were provided!"); return(1); } try { foreach (var file in Files) { if (file.EndsWith(".netperf")) { console.WriteLine($"Loading trace: {file} ..."); var etlx = TraceLog.CreateFromEventPipeDataFile(file); console.WriteLine($"Convert trace to: {etlx}."); cleanupFiles.Add(etlx); trace = TraceLog.OpenOrConvert(etlx); } else { console.WriteLine($"Loading crash dump: {file} ..."); var target = DataTarget.LoadCrashDump(file); // Assume there's only one if (target.ClrVersions.Count > 1) { console.Error.WriteLine("Multiple CLR versions are present!"); return(1); } var runtime = target.ClrVersions[0].CreateRuntime(); dump = new MemoryDump(target, runtime); } } if (dump == null && trace == null) { console.Error.WriteLine("A dump or trace could not be loaded from the provided files"); return(1); } var session = new AnalysisSession(dump, trace); await(new CommandProcessor()).RunAsync(console, session, console.GetCtrlCToken()); return(0); } finally { dump?.Dispose(); trace?.Dispose(); foreach (var file in cleanupFiles) { if (File.Exists(file)) { File.Delete(file); } } } }