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