Example #1
0
        /// <summary>
        /// Is this a primivite value?
        /// If not it is an object reference.
        /// </summary>
        public static bool IsPrimitive(this Jdwp.Tag tag)
        {
            switch (tag)
            {
            case Jdwp.Tag.Array:
            case Jdwp.Tag.Object:
            case Jdwp.Tag.String:
            case Jdwp.Tag.Thread:
            case Jdwp.Tag.ThreadGroup:
            case Jdwp.Tag.ClassLoader:
            case Jdwp.Tag.ClassObject:
                return(false);

            case Jdwp.Tag.Byte:
            case Jdwp.Tag.Char:
            case Jdwp.Tag.Float:
            case Jdwp.Tag.Double:
            case Jdwp.Tag.Int:
            case Jdwp.Tag.Long:
            case Jdwp.Tag.Short:
            case Jdwp.Tag.Void:
            case Jdwp.Tag.Boolean:
                return(true);

            default:
                throw new ArgumentException("Unknown tag " + (int)tag);
            }
        }
Example #2
0
        /// <summary>
        /// Read an untagged value.
        /// </summary>
        private static void WriteValue(JdwpPacket.DataReaderWriter data, Jdwp.Tag tag, object obj)
        {
            switch (tag)
            {
            //case Jdwp.Tag.Array:
            //case Jdwp.Tag.Object:
            //case Jdwp.Tag.String:
            //case Jdwp.Tag.Thread:
            //case Jdwp.Tag.ThreadGroup:
            //case Jdwp.Tag.ClassLoader:
            //case Jdwp.Tag.ClassObject:
            //    return new ObjectId(readerWriter);
            case Jdwp.Tag.Byte:
                data.SetByte((byte)obj);
                break;

            case Jdwp.Tag.Short:
            case Jdwp.Tag.Char:
                data.SetInt16((int)obj);
                break;

            //case Jdwp.Tag.Float:
            //    readerWriter.GetFloat(); //?
            //    break;
            //case Jdwp.Tag.Double:
            //    return readerWriter.SetDouble(); //?
            case Jdwp.Tag.Int:
                data.SetInt((int)obj);
                break;

            case Jdwp.Tag.Long:
                data.SetLong((long)obj);
                break;

            case Jdwp.Tag.Boolean:
                data.SetBoolean((bool)obj);
                break;

            default:
                throw new ArgumentException("unsupported tag " + tag);
            }
        }
Example #3
0
 /// <summary>
 /// Read an value.
 /// </summary>
 public TaggedObjectId(JdwpPacket.DataReaderWriter readerWriter)
 {
     Tag    = (Jdwp.Tag)readerWriter.GetByte();
     Object = new ObjectId(readerWriter);
 }
Example #4
0
        /// <summary>
        /// Read an untagged value.
        /// </summary>
        private static object ReadUntaggedValue(JdwpPacket.DataReaderWriter readerWriter, Jdwp.Tag tag)
        {
            switch (tag)
            {
            case Jdwp.Tag.Array:
            case Jdwp.Tag.Object:
            case Jdwp.Tag.String:
            case Jdwp.Tag.Thread:
            case Jdwp.Tag.ThreadGroup:
            case Jdwp.Tag.ClassLoader:
            case Jdwp.Tag.ClassObject:
                return(new ObjectId(readerWriter));

            case Jdwp.Tag.Byte:
                return(readerWriter.GetByte());

            case Jdwp.Tag.Char:
                return((char)readerWriter.GetInt16());

            case Jdwp.Tag.Float:
                return(readerWriter.GetFloat());

            case Jdwp.Tag.Double:
                return(readerWriter.GetDouble());

            case Jdwp.Tag.Int:
                return(readerWriter.GetInt());

            case Jdwp.Tag.Long:
                return(readerWriter.GetLong());

            case Jdwp.Tag.Short:
                return(readerWriter.GetInt16());

            case Jdwp.Tag.Void:
                return(null);

            case Jdwp.Tag.Boolean:
                return(readerWriter.GetBoolean());

            default:
                throw new ArgumentException("Unknown tag " + (int)tag);
            }
        }
Example #5
0
 /// <summary>
 /// Create from given source.
 /// </summary>
 public Value(TaggedObjectId source)
 {
     Tag         = source.Tag;
     ValueObject = source.Object;
 }
Example #6
0
 /// <summary>
 /// Read an untagged value.
 /// </summary>
 public Value(JdwpPacket.DataReaderWriter readerWriter, Jdwp.Tag tag)
 {
     Tag         = tag;
     ValueObject = ReadUntaggedValue(readerWriter, tag);
 }
Example #7
0
 /// <summary>
 /// Read a tagged value.
 /// </summary>
 public Value(JdwpPacket.DataReaderWriter readerWriter)
 {
     Tag         = (Jdwp.Tag)readerWriter.GetByte();
     ValueObject = ReadUntaggedValue(readerWriter, Tag);
 }
Example #8
0
 /// <summary>
 /// Read a tagged value.
 /// </summary>
 public Value(JdwpPacket.DataReaderWriter readerWriter)
 {
     Tag = (Jdwp.Tag) readerWriter.GetByte();
     ValueObject = ReadUntaggedValue(readerWriter, Tag);
 }
Example #9
0
 public SlotRequest(int slot, Jdwp.Tag tag)
 {
     Slot = slot;
     Tag = tag;
 }
Example #10
0
 /// <summary>
 /// Default ctor
 /// </summary>
 protected DalvikValue(Value value, DalvikProcess process)
 {
     tag        = value.Tag;
     this.value = value.IsPrimitive ? value.ValueObject : new DalvikObjectReference((ObjectId)value.ValueObject, process);
 }
Example #11
0
 public SlotValue(int slot, Jdwp.Tag tag, object value)
 {
     Slot = slot;
     Value = value;
     Tag = tag;
 }
Example #12
0
 public SlotRequest(int slot, Jdwp.Tag tag)
 {
     Slot = slot;
     Tag  = tag;
 }
Example #13
0
 /// <summary>
 /// Create from given source.
 /// </summary>
 public Value(TaggedObjectId source)
 {
     Tag = source.Tag;
     ValueObject = source.Object;
 }
Example #14
0
 /// <summary>
 /// Read an untagged value.
 /// </summary>
 public Value(JdwpPacket.DataReaderWriter readerWriter, Jdwp.Tag tag)
 {
     Tag = tag;
     ValueObject = ReadUntaggedValue(readerWriter, tag);
 }
Example #15
0
 /// <summary>
 /// Default ctor
 /// </summary>
 protected DalvikValue(Value value, DalvikProcess process)
 {
     tag = value.Tag;
     this.value = value.IsPrimitive ? value.ValueObject : new DalvikObjectReference((ObjectId)value.ValueObject, process);
 }
Example #16
0
 public SlotValue(int slot, Jdwp.Tag tag, object value)
 {
     Slot  = slot;
     Value = value;
     Tag   = tag;
 }
Example #17
0
        /// <summary>
        /// Get all local registers for this frame.
        /// </summary>
        /// <returns></returns>
        public Task <List <DalvikStackFrameValue> > GetRegistersAsync(bool parametersOnly = false, Jdwp.Tag type = Jdwp.Tag.Int, params int[] indizes)
        {
            if (parametersOnly && parameters != null)
            {
                return(parameters.AsTask());
            }
            if (!parametersOnly && registers != null && indizes.Length == 0)
            {
                return(registers.AsTask());
            }

            return(Task.Factory.StartNew(() =>
            {
                var ret = new List <DalvikStackFrameValue>();

                var loc = GetDocumentLocationAsync().Await(DalvikProcess.VmTimeout);

                List <Register> regDefs;

                MethodDisassembly methodDiss = thread.Manager.Process.DisassemblyProvider.GetFromLocation(loc);

                registerNames = registerNames ??
                                new RegisterNames(methodDiss == null ? null : methodDiss.Method.Body, HasMethodParametersInLastRegisters);

                if (indizes.Length == 0)
                {
                    if (methodDiss == null)
                    {
                        return ret;
                    }

                    var body = methodDiss.Method.Body;

                    regDefs = (parametersOnly ? body.Registers.Where(r => registerNames.IsParameter(r))
                                              : body.Registers)
                              .Where(p => indizes.Length == 0 || indizes.Contains(p.Index))
                              .OrderBy(p => p.Index)
                              .ToList();
                }
                else
                {
                    regDefs = indizes.Select(i => new Register(i)).ToList();
                }

                var requests = regDefs.Select(reg => new SlotRequest(reg.Index, type)).ToList();

                var regValues = Debugger.StackFrame.GetValuesAsync(thread.Id, Id, requests.ToArray())
                                .Await(DalvikProcess.VmTimeout);

                var process = thread.Manager.Process;
                for (int i = 0; i < regDefs.Count && i < regValues.Count; ++i)
                {
                    var reg = regDefs[i];
                    int numRegs = methodDiss == null ? int.MaxValue : methodDiss.Method.Body.Instructions.Count;
                    bool isParam = registerNames.IsParameter(reg);
                    string regName = registerNames.GetName(reg);

                    var valInfo = new VariableInfo(0, regName, null, null, numRegs, reg.Index);

                    DalvikStackFrameValue val = new DalvikStackFrameValue(regValues[i], valInfo, isParam, process);
                    ret.Add(val);
                }

                if (indizes.Length > 0)
                {
                    return ret;
                }

                if (parametersOnly)
                {
                    parameters = parameters ?? ret;
                }
                else
                {
                    registers = registers ?? ret;
                }
                return ret;
            }));
        }
Example #18
0
        protected object ParsePrimitive(string value, Jdwp.Tag tag, int defaultRadix)
        {
            string parseVal = value;

            if (value.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase))
            {
                parseVal     = value.Substring(2);
                defaultRadix = 16;
            }

            switch (tag)
            {
            case Jdwp.Tag.Byte:
            {
                byte val;
                if (byte.TryParse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture, out val))
                {
                    return(val);
                }
                return(sbyte.Parse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture));
            }

            case Jdwp.Tag.Short:
            {
                short val;
                if (short.TryParse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture, out val))
                {
                    return(val);
                }
                return((short)ushort.Parse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture));
            }

            case Jdwp.Tag.Int:
            {
                int val;
                if (int.TryParse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture, out val))
                {
                    return(val);
                }
                return((int)uint.Parse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture));
            }

            case Jdwp.Tag.Long:
            {
                long val;
                if (long.TryParse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture, out val))
                {
                    return(val);
                }
                return((long)ulong.Parse(parseVal, defaultRadix == 16 ? NumberStyles.HexNumber : NumberStyles.Any, CultureInfo.CurrentCulture));
            }

            case Jdwp.Tag.Char:
            {
                if (value.Length == 1)
                {
                    return(value[0]);
                }
                goto case Jdwp.Tag.Short;
            }

            case Jdwp.Tag.Double:
            {
                return(Convert.ToDouble(value));
            }

            case Jdwp.Tag.Float:
            {
                return(Convert.ToSingle(value));
            }

            case Jdwp.Tag.Boolean:
            {
                return(Convert.ToBoolean(value));
            }

            default:
                throw new NotImplementedException("cannot parse to " + tag);
            }
        }