Beispiel #1
0
        private void InitIfPointer()
        {
            if (_isPointer)
            {
                Debugger.Current.OutputDebugInfo("Reading pointer of CLRObject's {2} with name: {1} and offset:{0}\n", _offset,Type,Name); 
                _address = new Address(Debugger.Current.ReadPointer(_offset));
                _isPointer = false;
            }

        }
Beispiel #2
0
 public CLRObject(UInt64 address)
 {
     _address = new Address(address);
 }
Beispiel #3
0
 public CLRObject(string address)
 {
     _address = new Address(address);
     Debugger.Current.OutputDebugInfo("created CLRObject with address:{0}\n", address); 
 }
Beispiel #4
0
 public CLRObject(Address address)
 {
     _address = address;
     Debugger.Current.OutputDebugInfo("created CLRObject from address object ,address:{0}\n", address.ToHex()); 
 }
Beispiel #5
0
        private void InitFields()
        {
            

            if (_Fields!=null)
            {
                return;
            }

            

            _Fields = new Dictionary<string, CLRObject>(_properties.Length);

            //chose to do string split instead of regular expressions.
            //this may be faster than regular expressions
            //regular expression has lot of edge cases when i comes to matching geneic's notation
            //containing special charcters
            

            //name can be populated from the feild property.so this is not necessary
            if (string.IsNullOrEmpty(Name)&&_properties[0].Contains("Name:"))
                Name = _properties[0].Substring(13);
            //getting the method table from the substring.
            if (string.IsNullOrEmpty(this.MT)&&_properties[1].Contains("MethodTable:"))
                MT = _properties[1].Substring(13);
            if (_properties[2].Contains("EEClass:"))
                EEclass = _properties[2].Substring(13);

            Debugger.Current.OutputDebugInfo("Initializing fields of CLR Object Name:{0} and Type {1}\n", Name, Type);
            EmitParentInfo();

            Debugger.Current.OutputDebugInfo("MT \t\t Type \t\t valueType \t\t Name\n");
            for (int i = 7; i < _properties.Length; i++)
            {
                var strCurrentLine = _properties[i];
                //only if the filed contains instance,try to parse it.
                //we are skipping shared and static variable instances.
                if (strCurrentLine.Contains("instance"))
                {
                    string[] arrFields = strCurrentLine.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    //saw that some times the type field is empty string
                    //we are skipping that field as well b taking more thn or equal to 8 strings.
                    //0-MT
                    //1-Field
                    //2-offset
                    //3-Type
                    //4-VT
                    //5-Attr
                    //6-Value
                    //7 =>Name
                    if (arrFields.Length >= 8)
                    {
                       
                        CLRObject ObjCLR;
                        //indexing from back to avoid problems when the type contains spaces.
                        //if type contains spaces,it will cause length to be changed
                        if (arrFields[arrFields.Length - 4].Trim() == "1")
                        {
                            
                            //instantiaing value type.
                            //no need to check for address and values.
                            ObjCLR = new CLRObject(true, arrFields[3].Trim(), arrFields[arrFields.Length - 2].Trim());
                            ObjCLR.Name = arrFields[arrFields.Length-1];
                            ObjCLR.Parent = this;
                            ObjCLR.MT = arrFields[0].Trim();
                            ObjCLR.Type = arrFields[3].Trim();
                           
                        }
                        else
                        {
                            string fieldAddress = new Address(_address.ToHex(), arrFields[2]).ToHex();
                            //var pointer = Debugger.Current.ReadPointer(fieldAddress);
                            ObjCLR = new CLRObject(true, fieldAddress);
                            ObjCLR.Name = arrFields[arrFields.Length - 1];
                            ObjCLR.Parent = this;
                            //ObjCLR.MT = arrFields[0];
                            ObjCLR.MT = arrFields[0].Trim();
                            ObjCLR.Type = arrFields[3].Trim();


                        }
                        Debugger.Current.OutputDebugInfo("{0} \t\t {1} \t\t {2} \t\t {3} \n", ObjCLR.MT, ObjCLR.Type, ObjCLR.IsValueType, ObjCLR.Name);
                        _Fields.Add(arrFields[arrFields.Length-1].Trim().ToUpperInvariant(), ObjCLR);
                    }
                }

            }
        }