Esempio n. 1
0
        /// <summary>
        /// return true if regression found
        /// These tests will be affected by other tests running in the same instance of testhost because they share the same memory
        /// </summary>
        private async Task <bool> DoStressSimulation(int nIter, int nArraySize, float RatioThresholdSensitivity, Action action = null)
        {
            var lstPCs = PerfCounterData.GetPerfCountersToUse(Process.GetCurrentProcess(), IsForStress: true);

            foreach (var ctr in lstPCs)
            {
                ctr.IsEnabledForMeasurement = true;
            }
            List <LeakAnalysisResult> lstRegResults;

            using (var measurementHolder = new MeasurementHolder(
                       new TestContextWrapper(TestContext),
                       new StressUtilOptions()
            {
                NumIterations = -1, Sensitivity = RatioThresholdSensitivity, logger = this, lstPerfCountersToUse = lstPCs
            },
                       SampleType.SampleTypeIteration))
            {
                var lstBigStuff = new List <byte[]>();
                LogMessage($"nIter={nIter:n0} ArraySize= {nArraySize:n0}");
                for (int i = 0; i < nIter; i++)
                {
                    if (action != null)
                    {
                        action();
                    }
                    else
                    {
                        lstBigStuff.Add(new byte[nArraySize]);
                    }
                    //                lstBigStuff.Add(new int[10000000]);
                    var res = await measurementHolder.TakeMeasurementAsync($"iter {i}/{nIter}", DoForceGC : true);

                    LogMessage(res);
                }
                var filename = measurementHolder.DumpOutMeasurementsToTxtFile();
                LogMessage($"Results file name = {filename}");
                lstRegResults = (await measurementHolder.CalculateLeaksAsync(showGraph: false, GraphsAsFilePrefix: "Graph")).Where(r => r.IsLeak).ToList();
            }
            return(lstRegResults.Count > 0);
        }
Esempio n. 2
0
        public async Task DoSampleAsync(MeasurementHolder measurementHolder, bool DoForceGC, string descriptionOverride = "")
        {
            var res = string.Empty;

            if (measurementHolder == null)
            {
                measurementHolder = measurementHolderInteractiveUser;
            }
            try
            {
                await TaskScheduler.Default;
                try
                {
                    res = await measurementHolder.TakeMeasurementAsync(descriptionOverride, DoForceGC, IsForInteractiveGraph : UpdateInterval != 0);

                    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
                    await AddDataPointsAsync(measurementHolder);

                    if (AutoDumpIsEnabled)
                    {
                        var lastmeasurements = measurementHolder.GetLastMeasurements();
                        if (lastmeasurements.Count == 1)
                        {
                            var val = lastmeasurements.Values.First();
                            if (val >= AutoDumpThresh)
                            {
                                await AddStatusMsgAsync($"Autodump Threshold triggered: {lastmeasurements.Keys.First()}  {val} > {AutoDumpThresh}");

                                AutoDumpIsEnabled = false;
                                var pathDump = await CreateDumpFileAsync(MemoryAnalysisType.JustCreateDump, "AutoDump", tspanDelayAfterGC : TimeSpan.FromSeconds(0.2));
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    res = ex.ToString();
                }
                AddStatusMsgAsync($"{res}").Forget();
            }
            catch (InvalidOperationException ex)
            {
                if (ex.Message.Contains("Instance 'devenv#")) // user changed # of instance of devenv runnning
                {
                    await AddStatusMsgAsync($"Resetting perf counters due to devenv instances change");

                    lock (measurementHolder.LstPerfCounterData)
                    {
                        foreach (var ctr in measurementHolder.LstPerfCounterData)
                        {
                            ctr.ResetCounter();
                        }
                        _dataPoints.Clear();
                        _bufferIndex = 0;
                    }
                }
            }
            catch (Exception ex)
            {
                await AddStatusMsgAsync($"Exception in {nameof(DoSampleAsync)}" + ex.ToString());

                _dataPoints.Clear();
                _bufferIndex = 0;
            }
        }