Example #1
0
        internal static IEnumerable <ClrObject> EnumerateHandlers(ClrObject clrObject)
        {
            ClrObject target        = clrObject[TargetFieldName];
            ulong     targetAddress = target.Address;

            if (targetAddress != clrObject.Address)
            {
                yield return(clrObject);
            }
            else
            {
                var invocCount      = clrObject[InvocationCountFieldName];
                var v               = invocCount.SimpleValue;
                var invocCountValue = (long)v;
                var invocList       = clrObject[InvocationListFieldName];
                if (!invocList.IsNull)
                {
                    for (int i = 0; i < invocCountValue; i++)
                    {
                        var targetObject = invocList[i];
                        yield return(targetObject);
                    }
                }
            }
        }
 public LoneTargetInformation(ClrDump clrDump, ClrObject target, ClrMethod methInfo, ClrObject owner)
 {
     this.clrDump = clrDump;
     this.target = target;
     this.methInfo = methInfo;
     this.owner = owner;
 }
 public LoneTargetInformation(ClrDump clrDump, ClrObject target, ClrMethod methInfo, ClrObject owner)
 {
     this.clrDump  = clrDump;
     this.target   = target;
     this.methInfo = methInfo;
     this.owner    = owner;
 }
Example #4
0
        public static object GetFieldValueImpl(ulong address, ClrType type, ClrInstanceField field)
        {
            ClrObject obj        = new ClrObject(address, type);
            var       fieldValue = obj[field];

            return(fieldValue.IsNull ? null : fieldValue.HasSimpleValue?fieldValue.SimpleValue : fieldValue.Address);
        }
        private static ClrMethod GetDelegateMethod(ClrDump clrDump, ClrObject handler, ClrObject target)
        {
            var targetType  = target.Type;
            var methPtrObj  = handler[MethodPtrFieldName];
            var methPtrLong = (long)methPtrObj.SimpleValue;
            var methPtr     = (ulong)methPtrLong;

            return(GetDelegateMethod(methPtr, clrDump));
        }
Example #6
0
 public ArrayElementsAddressContainer(ClrDumpObject clrDumpObject)
 {
     this.clrDumpObject = clrDumpObject;
     if (!clrDumpObject.ClrType.IsArray)
     {
         throw new ArgumentException($"{clrDumpObject.TypeName} is not an array !");
     }
     clrObject = new ClrObject(clrDumpObject.Address, clrDumpObject.ClrType, clrDumpObject.IsInterior);
     Count     = clrDumpObject.ArrayLength;
 }
 public ArrayElementsAddressContainer(ClrDumpObject clrDumpObject)
 {
     this.clrDumpObject = clrDumpObject;
     if (!clrDumpObject.ClrType.IsArray)
     {
         throw new ArgumentException($"{clrDumpObject.TypeName} is not an array !");
     }
     clrObject = new ClrObject(clrDumpObject.Address, clrDumpObject.ClrType, clrDumpObject.IsInterior);
     Count = clrDumpObject.ArrayLength;
 }
Example #8
0
        private object GetValue()
        {
            var clrObject = new ClrObject(Address, ClrType, IsInterior);
            if (clrObject.HasSimpleValue && ! clrObject.IsNull)
            {
                return clrObject.SimpleValue;
            }
            else
            {
                return null;
            }

        }
Example #9
0
        private object GetValue()
        {
            var clrObject = new ClrObject(Address, ClrType, IsInterior);

            if (clrObject.HasSimpleValue && !clrObject.IsNull)
            {
                return(clrObject.SimpleValue);
            }
            else
            {
                return(null);
            }
        }
 internal static List <FieldValueInformation> GetElements(ClrDumpObject clrDumpObject) => clrDumpObject.ClrDump.Eval(() =>
 {
     var clrObject = new ClrObject(clrDumpObject.Address, clrDumpObject.ClrType, clrDumpObject.IsInterior);
     var l         = new List <FieldValueInformation>();
     int length    = clrDumpObject.ClrType.GetArrayLength(clrDumpObject.Address);
     var n         = Math.Min(length, 1024);
     for (int i = 0; i < n; i++)
     {
         var fieldValue     = clrObject[i];
         var fieldValueInfo = new FieldValueInformation($"[{i}]", new ClrDumpObject(clrDumpObject.ClrDump, fieldValue.Type, fieldValue.Address, fieldValue.IsInterior));
         l.Add(fieldValueInfo);
     }
     return(l);
 });
Example #11
0
        public string GetFieldNameReferenceImpl(ulong refAddress, ulong address, bool prefixWithType)
        {
            ClrType type = GetObjectTypeImpl(address);

            if (type == null)
            {
                return("Unknown");
            }
            string    fieldName = "???";
            ClrObject obj       = new ClrObject(address, type);

            if (type.IsArray)
            {
                fieldName = "[ ? ]";
                var length = type.GetArrayLength(address);
                for (int i = 0; i < length; i++)
                {
                    if (obj[i].Address == refAddress)
                    {
                        fieldName = $"[ {i} ]";
                    }
                }
            }
            else
            {
                foreach (var field in type.Fields)
                {
                    switch (field.ElementType)
                    {
                    case ClrElementType.Struct:
                    case ClrElementType.String:
                    case ClrElementType.Array:
                    case ClrElementType.SZArray:
                    case ClrElementType.Object:
                        var fieldValue = obj[field];
                        if (fieldValue.Address == refAddress)
                        {
                            fieldName = field.Name;
                        }
                        break;
                    }
                }
            }
            if (prefixWithType)
            {
                fieldName = $"{fieldName}@{type.Name}";
            }

            return(fieldName);
        }
        public static long CountTargets(ulong address, ClrType clrType, ClrInstanceField targetField, ClrInstanceField invocCountField)
        {
            ClrObject clrObject = new ClrObject(address, clrType);
            ClrObject target    = clrObject[targetField];

            if (target.Address != address)
            {
                return(1);
            }

            var invocCount = clrObject[invocCountField];
            var value      = invocCount.SimpleValue;

            return((long)value);
        }
 internal static List <FieldValueInformation> GetValues(ClrDumpObject clrDumpObject) => clrDumpObject.ClrDump.Eval(() =>
 {
     var clrObject = new ClrObject(clrDumpObject.Address, clrDumpObject.ClrType, clrDumpObject.IsInterior);
     var l         = new List <FieldValueInformation>();
     if (clrDumpObject.ClrType != null)
     {
         foreach (var field in clrDumpObject.ClrType.Fields)
         {
             var fieldValue     = clrObject[field];
             var fieldValueInfo = new FieldValueInformation(field.RealName(), new ClrDumpObject(clrDumpObject.ClrDump, fieldValue.Type, fieldValue.Address, fieldValue.IsInterior));
             l.Add(fieldValueInfo);
         }
     }
     return(l);
 });
        internal static List <DelegateTargetInformation> GetDelegateTargetInformations(ClrDumpObject clrDumpObject)
        {
            var       targetInformations = new List <DelegateTargetInformation>();
            ClrObject clrObject          = clrDumpObject.ClrObject;
            ClrDump   clrDump            = clrDumpObject.ClrDump;

            foreach (var handlerObject in EnumerateHandlers(clrObject))
            {
                var target     = handlerObject[TargetFieldName];
                var methInfo   = GetDelegateMethod(clrDump, handlerObject, target);
                var targetInfo = new DelegateTargetInformation(target.Address, new ClrDumpType(clrDump, target.Type), methInfo);
                targetInformations.Add(targetInfo);
            }

            return(targetInformations);
        }
Example #15
0
        public static object GetFieldValueImpl(ulong address, ClrType type, List <ClrInstanceField> fields)
        {
            ClrObject obj = new ClrObject(address, type);

            for (int i = 0; i < fields.Count; i++)
            {
                var field = fields[i];
                obj = obj[field];
                if (obj.IsNull)
                {
                    return(null);
                }
            }

            return(obj.HasSimpleValue ? obj.SimpleValue : obj.Address);
        }
Example #16
0
        public static string GetSimpleValueString(ClrObject obj)
        {
            object value = obj.SimpleValue;

            if (value == null)
            {
                return("null");
            }

            ClrType type = obj.Type;

            if (type?.IsEnum == true)
            {
                return(type.GetEnumName(value) ?? value.ToString());
            }

            DateTime?dateTime = value as DateTime?;

            return(dateTime != null?GetDateTimeString(dateTime.Value) : value.ToString());
        }
Example #17
0
        public object GetFieldValueImpl(ulong address, ClrType type, List <string> fieldNames)
        {
            ClrObject obj = new ClrObject(address, type);

            for (int i = 0; i < fieldNames.Count; i++)
            {
                var fieldName          = fieldNames[i];
                ClrInstanceField field = obj.GetField(fieldName);
                if (field == null)
                {
                    return(null);
                }

                obj = obj[field];
                if (obj.IsNull)
                {
                    return(null);
                }
            }

            return(obj.HasSimpleValue ? obj.SimpleValue : obj.Address);
        }
Example #18
0
        internal static IEnumerable<ClrObject> EnumerateHandlers(ClrObject clrObject)
        {
            ClrObject target = clrObject[TargetFieldName];
            ulong targetAddress = target.Address;

            if (targetAddress != clrObject.Address)
            {
                yield return clrObject;
            }
            else
            {
                var invocCount = clrObject[InvocationCountFieldName];
                var v = invocCount.SimpleValue;
                var invocCountValue = (long)v;
                var invocList = clrObject[InvocationListFieldName];
                for (int i = 0; i < invocCountValue; i++)
                {
                    var targetObject = invocList[i];
                    yield return targetObject;
                }
            }
        }
Example #19
0
        private static IPAddress GetIPAddress(ClrObject ipAddress)
        {
            const int AddressFamilyInterNetworkV6 = 23;
            const int IPv4AddressBytes            = 4;
            const int IPv6AddressBytes            = 16;
            const int NumberOfLabels = IPv6AddressBytes / 2;

            byte[] bytes;
            int    family = (int)ipAddress["m_Family"].SimpleValue;

            if (family == AddressFamilyInterNetworkV6)
            {
                bytes = new byte[IPv6AddressBytes];
                int j = 0;

                var numbers = ipAddress["m_Numbers"];

                for (int i = 0; i < NumberOfLabels; i++)
                {
                    ushort number = (ushort)numbers[i].SimpleValue;
                    bytes[j++] = (byte)((number >> 8) & 0xFF);
                    bytes[j++] = (byte)(number & 0xFF);
                }
            }
            else
            {
                long address = (long)ipAddress["m_Address"].SimpleValue;
                bytes    = new byte[IPv4AddressBytes];
                bytes[0] = (byte)(address);
                bytes[1] = (byte)(address >> 8);
                bytes[2] = (byte)(address >> 16);
                bytes[3] = (byte)(address >> 24);
            }

            return(new IPAddress(bytes));
        }
Example #20
0
        public static List<LoneTargetInformation> GetLoneTargetInformations(ClrDump clrDump)
        {
            CancellationTokenSource token = new CancellationTokenSource();
            clrDump.MessageBus.BeginTask("Analyzing lone targets...", token);

            Dictionary<ClrObject, ClrObject> loneTargetAddresses = new Dictionary<ClrObject, ClrObject>();
            // For each instance of every delegate types 
            // let's find all the target objects
            // and select those with only referenced once
            var types = GetDelegateTypes(clrDump);
            foreach(var type in types)
            {
                clrDump.MessageBus.Status($"Analyzing delegate type: {type.Name}");
                if (token.IsCancellationRequested)
                {
                    break;
                }
                int n = 0;
                foreach (var address in clrDump.EnumerateInstances(type)) {
                    if (n++ % 128 == 0)
                    {
                        clrDump.MessageBus.Status($"Analyzing delegate type: {type.Name}, instance #{n:###,###,###,##0}");
                    }
                    var handlerObject = new ClrObject(address, type);
                    foreach(var subHandlerObject in EnumerateHandlers(handlerObject))
                    {
                        if (token.IsCancellationRequested)
                        {
                            break;
                        }
                        var target = subHandlerObject[TargetFieldName];
                        int count = clrDump.CountReferers(target.Address);
                        if( count == 1)
                        {
                            loneTargetAddresses[target] = subHandlerObject;
                        }
                    }
                }
            }

            List<LoneTargetInformation> loneTargets = new List<LoneTargetInformation>();

            // foreach lone target, in its reference tree, we try to find the first 
            // object that is not a delegate type or an array of object (ie invocationList)
            var delegateType = clrDump.GetClrType(typeof(MulticastDelegate).FullName);
            var arrayObjType = clrDump.GetClrType(typeof(object[]).FullName);
            HashSet<ulong> visited = new HashSet<ulong>();
            foreach (var kvp in loneTargetAddresses)
            {
                var loneTarget = kvp.Key;
                var handler = kvp.Value;
                var methInfo = GetDelegateMethod(clrDump, handler, loneTarget);
                visited.Clear();
                ulong ownerAddress = FindOwner(handler.Address, clrDump, delegateType, arrayObjType, visited);
                ClrObject owner = new ClrObject(ownerAddress, clrDump.GetObjectType(ownerAddress));
                var loneTargetInformation = new LoneTargetInformation(clrDump, loneTarget, methInfo, owner);
                loneTargets.Add(loneTargetInformation);
            }
            string status = token.IsCancellationRequested ? "cancelled" : "done";
            clrDump.MessageBus.EndTask($"Analyzing lone targets: {status}. Found: {loneTargets.Count}");
            return loneTargets;
        }
        private object GetValue()
        {
            var clrObject = new ClrObject(Address, ClrType, IsInterior);

            return(clrObject.HasSimpleValue && !clrObject.IsNull ? clrObject.SimpleValue : null);
        }
Example #22
0
        public static long CountTargets(ulong address, ClrType clrType, ClrInstanceField targetField, ClrInstanceField invocCountField)
        {
            ClrObject clrObject = new ClrObject(address, clrType);
            ClrObject target = clrObject[targetField];
            if (target.Address != address)
            {
                return 1;
            }

            var invocCount = clrObject[invocCountField];
            var value = invocCount.SimpleValue;
            return (long)value;
        }
Example #23
0
        private static IPAddress GetIPAddress(ClrObject ipAddress)
        {
            const int AddressFamilyInterNetworkV6 = 23;
            const int IPv4AddressBytes = 4;
            const int IPv6AddressBytes = 16;
            const int NumberOfLabels = IPv6AddressBytes / 2;

            byte[] bytes;
            int family = (int)ipAddress["m_Family"].SimpleValue;

            if (family == AddressFamilyInterNetworkV6)
            {
                bytes = new byte[IPv6AddressBytes];
                int j = 0;

                var numbers = ipAddress["m_Numbers"];

                for (int i = 0; i < NumberOfLabels; i++)
                {
                    ushort number = (ushort)numbers[i].SimpleValue;
                    bytes[j++] = (byte)((number >> 8) & 0xFF);
                    bytes[j++] = (byte)(number & 0xFF);
                }
            }
            else
            {
                long address = (long)ipAddress["m_Address"].SimpleValue;
                bytes = new byte[IPv4AddressBytes];
                bytes[0] = (byte)(address);
                bytes[1] = (byte)(address >> 8);
                bytes[2] = (byte)(address >> 16);
                bytes[3] = (byte)(address >> 24);
            }

            return new IPAddress(bytes);
        }
        public static List <LoneTargetInformation> GetLoneTargetInformations(ClrDump clrDump)
        {
            CancellationTokenSource token = new CancellationTokenSource();

            clrDump.MessageBus.BeginTask("Analyzing lone targets...", token);

            Dictionary <ClrObject, ClrObject> loneTargetAddresses = new Dictionary <ClrObject, ClrObject>();

            // For each instance of every delegate types
            // let's find all the target objects
            // and select those with only referenced once
            foreach (var type in GetDelegateTypes(clrDump))
            {
                clrDump.MessageBus.Status($"Analyzing delegate type: {type.Name}");
                if (token.IsCancellationRequested)
                {
                    break;
                }
                int n = 0;
                foreach (var address in clrDump.EnumerateInstances(type))
                {
                    if (n++ % 128 == 0)
                    {
                        clrDump.MessageBus.Status($"Analyzing delegate type: {type.Name}, instance #{n:###,###,###,##0}");
                    }
                    var handlerObject = new ClrObject(address, type);
                    foreach (var subHandlerObject in EnumerateHandlers(handlerObject))
                    {
                        if (token.IsCancellationRequested)
                        {
                            break;
                        }
                        var target = subHandlerObject[TargetFieldName];
                        int count  = clrDump.CountReferers(target.Address);
                        if (count == 1)
                        {
                            loneTargetAddresses[target] = subHandlerObject;
                        }
                    }
                }
            }

            List <LoneTargetInformation> loneTargets = new List <LoneTargetInformation>();

            // foreach lone target, in its reference tree, we try to find the first
            // object that is not a delegate type or an array of object (ie invocationList)
            var             delegateType = clrDump.GetClrType(typeof(MulticastDelegate).FullName);
            var             arrayObjType = clrDump.GetClrType(typeof(object[]).FullName);
            HashSet <ulong> visited      = new HashSet <ulong>();

            foreach (var kvp in loneTargetAddresses)
            {
                var loneTarget = kvp.Key;
                var handler    = kvp.Value;
                var methInfo   = GetDelegateMethod(clrDump, handler, loneTarget);
                visited.Clear();
                ulong     ownerAddress          = FindOwner(handler.Address, clrDump, delegateType, arrayObjType, visited);
                ClrObject owner                 = new ClrObject(ownerAddress, clrDump.GetObjectType(ownerAddress));
                var       loneTargetInformation = new LoneTargetInformation(clrDump, loneTarget, methInfo, owner);
                loneTargets.Add(loneTargetInformation);
            }
            string status = token.IsCancellationRequested ? "cancelled" : "done";

            clrDump.MessageBus.EndTask($"Analyzing lone targets: {status}. Found: {loneTargets.Count}");
            return(loneTargets);
        }
Example #25
0
 public static object GetSimpleValue(ClrObject obj)
 {
     return GetSimpleValue(obj.Address, obj.Type, obj.IsInterior);
 }
Example #26
0
        public static string GetSimpleValueString(ClrObject obj)
        {
            object value = obj.SimpleValue;

            if (value == null)
                return "null";

            ClrType type = obj.Type;
            if (type != null && type.IsEnum)
                return type.GetEnumName(value) ?? value.ToString();

            DateTime? dateTime = value as DateTime?;
            if (dateTime != null)
                return GetDateTimeString(dateTime.Value);

            return value.ToString();
        }
Example #27
0
 public static object GetSimpleValue(ClrObject obj) => GetSimpleValue(obj.Address, obj.Type, obj.IsInterior);
Example #28
0
 private static ClrMethod GetDelegateMethod(ClrDump clrDump, ClrObject handler, ClrObject target)
 {
     var targetType = target.Type;
     var methPtrObj = handler[MethodPtrFieldName];
     var methPtrLong = (long)methPtrObj.SimpleValue;
     var methPtr = (ulong)methPtrLong;
     var methInfo = GetDelegateMethod(methPtr, clrDump);
     return methInfo;
 }
Example #29
0
 public static object GetSimpleValue(ClrObject obj)
 {
     return(GetSimpleValue(obj.Address, obj.Type, obj.IsInterior));
 }