/// <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); }
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; } }