Ejemplo n.º 1
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);
                    }
                }
            }
        }
Ejemplo n.º 2
0
 public AnalysisSession(MemoryDump dump, TraceLog trace)
 {
     Dump  = dump;
     Trace = trace;
 }