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); } } } }
public AnalysisSession(MemoryDump dump, TraceLog trace) { Dump = dump; Trace = trace; }