예제 #1
0
        public static bool InstanceReferenceFilesAvailable(int runtmNdx, DumpFileMoniker moniker, out string error)
        {
            error = null;
            try
            {
                string[] fileList = new string[(int)RefFile.Count];
                fileList[0] = moniker.GetFilePath(runtmNdx, Constants.MapRefFwdOffsetsFilePostfix);
                fileList[1] = moniker.GetFilePath(runtmNdx, Constants.MapFwdRefsFilePostfix);
                fileList[2] = moniker.GetFilePath(runtmNdx, Constants.MapRefBwdOffsetsFilePostfix);
                fileList[3] = moniker.GetFilePath(runtmNdx, Constants.MapBwdRefsFilePostfix);

                for (int i = 0, icnt = fileList.Length; i < icnt; ++i)
                {
                    if (!File.Exists(fileList[i]))
                    {
                        return(false);
                    }
                }

                return(true);
            }
            catch (Exception ex)
            {
                error = Utils.GetExceptionErrorString(ex);
                return(false);
            }
        }
예제 #2
0
 public InstanceReferences(ulong[] instances, int runtmNdx, DumpFileMoniker moniker)
 {
     _instances   = instances;
     _fileList    = new string[(int)RefFile.Count];
     _fileList[0] = moniker.GetFilePath(runtmNdx, Constants.MapRefFwdOffsetsFilePostfix);
     _fileList[1] = moniker.GetFilePath(runtmNdx, Constants.MapFwdRefsFilePostfix);
     _fileList[2] = moniker.GetFilePath(runtmNdx, Constants.MapRefBwdOffsetsFilePostfix);
     _fileList[3] = moniker.GetFilePath(runtmNdx, Constants.MapBwdRefsFilePostfix);
     _maps        = new MemoryMappedFile[(int)RefFile.Count];
     _views       = new MemoryMappedViewAccessor[(int)RefFile.Count];
     _readers     = new BinaryReader[(int)RefFile.Count];
     _readers     = new BinaryReader[(int)RefFile.Count];
 }
예제 #3
0
        public static ClrtRootInfo Load(int rtm, DumpFileMoniker fileMoniker, out string error)
        {
            error = null;
            BinaryReader bw = null;

            try
            {
                var path = fileMoniker.GetFilePath(rtm, Constants.MapRootsInfoFilePostfix);
                bw = new BinaryReader(File.Open(path, FileMode.Open));

                // root details
                //
                int          count = bw.ReadInt32();
                ClrtRoot[][] roots = new ClrtRoot[count][];
                for (int i = 0; i < count; ++i)
                {
                    int kindCount = bw.ReadInt32();
                    roots[i] = new ClrtRoot[kindCount];
                    for (int j = 0; j < kindCount; ++j)
                    {
                        roots[i][j] = ClrtRoot.Load(bw);
                    }
                }
                return(new ClrtRootInfo(roots));
            }
            catch (Exception ex)
            {
                error = Utils.GetExceptionErrorString(ex);
                return(null);
            }
            finally
            {
                bw?.Close();
            }
        }
예제 #4
0
        public static bool FinalyzerAddressFixup(int rtm, ulong[] finalyzerAddresses, DumpFileMoniker fileMoniker, out string error)
        {
            error = null;
            FileWriter fw = null;

            try
            {
                var path = fileMoniker.GetFilePath(rtm, Constants.MapRootsInfoFilePostfix);
                fw = new FileWriter(path, FileMode.Open, FileAccess.Write, FileShare.None);
                fw.Seek(sizeof(int), SeekOrigin.Begin);

                for (int i = 0, icnt = finalyzerAddresses.Length; i < icnt; ++i)
                {
                    fw.Write(finalyzerAddresses[i]);
                }
                return(true);
            }
            catch (Exception ex)
            {
                error = Utils.GetExceptionErrorString(ex);
                return(false);
            }
            finally
            {
                fw?.Dispose();
            }
        }
예제 #5
0
        public static bool Save(int rtm, List <ClrtRoot>[] ourRoots, DumpFileMoniker fileMoniker, out string error)
        {
            error = null;
            BinaryWriter bw = null;

            try
            {
                var path = fileMoniker.GetFilePath(rtm, Constants.MapRootsInfoFilePostfix);
                bw = new BinaryWriter(File.Open(path, FileMode.Create));

                // root details by kind
                //
                bw.Write(ourRoots.Length);
                for (int i = 0, icnt = ourRoots.Length; i < icnt; ++i)
                {
                    var kindRoots = ourRoots[i];
                    bw.Write(kindRoots.Count);
                    for (int j = 0, jcnt = kindRoots.Count; j < jcnt; ++j)
                    {
                        kindRoots[j].Dump(bw);
                    }
                }
                return(true);
            }
            catch (Exception ex)
            {
                error = Utils.GetExceptionErrorString(ex);
                return(false);
            }
            finally
            {
                bw?.Close();
            }
        }
예제 #6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="rtmNdx"></param>
        /// <param name="segments"></param>
        /// <param name="instances"></param>
        /// <param name="sizes"></param>
        /// <param name="fileMoniker"></param>
        /// <param name="hasUnrootedInfo"></param>
        /// <returns></returns>
        public static Tuple <int[], ulong[], int[], ulong[], int[], ulong[]> GetTotalGenerationDistributions(int rtmNdx, ClrtSegment[] segments, ulong[] instances, uint[] sizes, DumpFileMoniker fileMoniker, bool hasUnrootedInfo)
        {
            var genTotalCount         = new int[4];
            var genTotalSize          = new ulong[4];
            var genTotalUnrootedCount = new int[4];
            var genTotalUnrootedSize  = new ulong[4];
            var freeTotalGenCount     = new int[4];
            var freeTotalGenSize      = new ulong[4];

            // check unrooted
//			if (!hasUnrootedInfo)
            {
                for (int i = 0, icnt = instances.Length; i < icnt; ++i)
                {
                    if (!Utils.IsRooted(instances[i]))
                    {
                        var addr = instances[i];
                        var seg  = ClrtSegment.FindSegment(segments, addr);
                        if (seg == null)
                        {
                            continue;
                        }
                        var gen = seg.GetGeneration(addr);
                        if (gen == Generation.Uknown)
                        {
                            continue;
                        }
                        seg.IncUnrooted(gen, sizes[i]);
                    }
                }
                string error;
                ClrtSegment.DumpSegments(fileMoniker.GetFilePath(rtmNdx, Constants.MapSegmentInfoFilePostfix), segments,
                                         out error, true);
            }

            for (int i = 0, icnt = segments.Length; i < icnt; ++i)
            {
                var seg = segments[i];
                if (seg.Large)
                {
                    genTotalCount[(int)Generation.Large]         += seg.Gen0Count;
                    genTotalSize[(int)Generation.Large]          += seg.Gen0Size;
                    freeTotalGenCount[(int)Generation.Large]     += seg.Gen0FreeCount;
                    freeTotalGenSize[(int)Generation.Large]      += seg.Gen0FreeSize;
                    genTotalUnrootedCount[(int)Generation.Large] += seg.Gen0UnrootedCount;
                    genTotalSize[(int)Generation.Large]          += seg.Gen0UnrootedSize;
                    continue;
                }
                genTotalCount[(int)Generation.Gen0]         += seg.Gen0Count;
                genTotalSize[(int)Generation.Gen0]          += seg.Gen0Size;
                genTotalUnrootedCount[(int)Generation.Gen0] += seg.Gen0UnrootedCount;
                genTotalUnrootedSize[(int)Generation.Gen0]  += seg.Gen0UnrootedSize;
                freeTotalGenCount[(int)Generation.Gen0]     += seg.Gen0FreeCount;
                freeTotalGenSize[(int)Generation.Gen0]      += seg.Gen0FreeSize;

                genTotalCount[(int)Generation.Gen1]         += seg.Gen1Count;
                genTotalSize[(int)Generation.Gen1]          += seg.Gen1Size;
                genTotalUnrootedCount[(int)Generation.Gen1] += seg.Gen1UnrootedCount;
                genTotalUnrootedSize[(int)Generation.Gen1]  += seg.Gen1UnrootedSize;
                freeTotalGenCount[(int)Generation.Gen1]     += seg.Gen1FreeCount;
                freeTotalGenSize[(int)Generation.Gen1]      += seg.Gen1FreeSize;

                genTotalCount[(int)Generation.Gen2]         += seg.Gen2Count;
                genTotalSize[(int)Generation.Gen2]          += seg.Gen2Size;
                genTotalUnrootedCount[(int)Generation.Gen2] += seg.Gen2UnrootedCount;
                genTotalUnrootedSize[(int)Generation.Gen2]  += seg.Gen2UnrootedSize;
                freeTotalGenCount[(int)Generation.Gen2]     += seg.Gen2FreeCount;
                freeTotalGenSize[(int)Generation.Gen2]      += seg.Gen2FreeSize;
            }

            return(Tuple.Create(genTotalCount, genTotalSize, freeTotalGenCount, freeTotalGenSize, genTotalUnrootedCount, genTotalUnrootedSize));
        }