Example #1
0
        private int Run()
        {
            if (_options.TimeLimit <= 0)
            {
                ConsoleUtils.LogError(ErrorCode.InvalidTimeLimit, Resources.ErrorInvalidTimeLimit, _options.TimeLimit);
                return(1);
            }

            _timeLimit = TimeSpan.FromSeconds(_options.TimeLimit);

            if (_options.PollingInterval <= 0)
            {
                ConsoleUtils.LogError(ErrorCode.InvalidPollingInterval, Resources.ErrorInvalidPollingInterval, _options.PollingInterval);
                return(1);
            }

            if (!File.Exists(_options.ProcDumpPath))
            {
                ConsoleUtils.LogError(ErrorCode.ProcDumpNotFound, Resources.ErrorProcDumpNotFound, _options.ProcDumpPath);
                return(1);
            }

            var processStartInfo = new ProcessStartInfo
            {
                FileName        = _options.Executable,
                Arguments       = _options.Arguments,
                CreateNoWindow  = true,
                UseShellExecute = false
            };

            Process  parentProcess = Process.Start(processStartInfo);
            ProcDump procDump      = new ProcDump(_options.ProcDumpPath, _options.OutputFolder);

            using (ProcessTracker processTracker = new ProcessTracker(parentProcess, procDump))
            {
                while (!processTracker.AllFinished)
                {
                    if (DateTime.Now - parentProcess.StartTime > _timeLimit)
                    {
                        ConsoleUtils.LogError(
                            ErrorCode.ProcessTimedOut,
                            Resources.ErrorProcessTimedOut,
                            _options.Executable,
                            parentProcess.Id,
                            _options.TimeLimit);

                        if (_options.Screenshot)
                        {
                            string description = Path.GetFileNameWithoutExtension(_options.Executable);
                            ScreenshotSaver.SaveScreen(description, _options.OutputFolder);
                        }

                        processTracker.TerminateAll();
                        return(1);
                    }

                    Thread.Sleep(_options.PollingInterval);

                    processTracker.Update();
                }

                ConsoleUtils.LogMessage(
                    Resources.ProcessExited,
                    _options.Executable,
                    parentProcess.ExitTime - parentProcess.StartTime);
            }

            return(0);
        }