예제 #1
0
        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]}");
                }
            }
        }
예제 #2
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);
        }
예제 #3
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);
                    }
                }
            }
        }