private void DetermineNeededRegions() { if (_dumpType == DumpType.Minimal) { return; } var readerType = typeof(DataTarget).Assembly.GetType("Microsoft.Diagnostics.Runtime.LiveDataReader"); var reader = (IDataReader)Activator.CreateInstance(readerType, _pid); var readerLogger = new DumpReaderLogger(reader); var target = DataTarget.CreateFromDataReader(readerLogger); foreach (var clrVersion in target.ClrVersions) { var runtime = clrVersion.CreateRuntime(); AddCLRRegions(runtime); TouchOtherRegions(readerLogger, runtime); _logger.WriteLine("{0} ranges requested by the DAC, total size {1:N0}", _otherClrRegions.Count, _otherClrRegions.Sum(r => (long)(r.Key - r.Value)) ); _logger.WriteLine("{0} CLR regions, total size {1:N0}", _majorClrRegions.Count, _majorClrRegions.Sum(r => (long)(r.Key - r.Value)) ); } }
private Tuple <int, int, int, int, int>[] GetClrRuntimes(uint processId) { DkmProcess process = GetProcess(processId); ClrMdDataReader dataReader = new ClrMdDataReader(process); DataTarget dataTarget = DataTarget.CreateFromDataReader(dataReader); ClrRuntime[] clrRuntimes = dataTarget.ClrVersions.Select(clrInfo => clrInfo.CreateRuntime()).ToArray(); if (clrRuntimes.Length > 0) { Tuple <int, int, int, int, int>[] runtimes = new Tuple <int, int, int, int, int> [clrRuntimes.Length]; lock (runtimesCache) { for (int i = 0; i < clrRuntimes.Length; i++) { runtimes[i] = Tuple.Create( nextRuntimeId++, clrRuntimes[i].ClrInfo.Version.Major, clrRuntimes[i].ClrInfo.Version.Minor, clrRuntimes[i].ClrInfo.Version.Revision, clrRuntimes[i].ClrInfo.Version.Patch); runtimesCache.TryAdd(runtimes[i].Item1, clrRuntimes[i]); } } return(runtimes); } return(new Tuple <int, int, int, int, int> [0]); }