private void HandleCompositeCommand(JdwpPacket packet)
        {
            var data = packet.Data;
            var suspendPolicy = (Jdwp.SuspendPolicy) data.GetByte();
            var count = data.GetInt();

            for (var i = 0; i < count; i++)
            {
                var eventKind = (Jdwp.EventKind) data.GetByte();
                JdwpEvent evt;
                switch (eventKind)
                {
                    case Jdwp.EventKind.VmInit:
                        evt = new VmStart(data);
                        break;
                    case Jdwp.EventKind.SingleStep:
                        evt = new SingleStep(data);
                        break;
                    case Jdwp.EventKind.BreakPoint:
                        evt = new Breakpoint(data);
                        break;
                    case Jdwp.EventKind.MethodEntry:
                        evt = new MethodEntry(data);
                        break;
                    case Jdwp.EventKind.MethodExit:
                        evt = new MethodExit(data);
                        break;
                    case Jdwp.EventKind.Exception:
                        evt = new Exception(data);
                        break;
                    case Jdwp.EventKind.ThreadStart:
                        evt = new ThreadStart(data);
                        break;
                    case Jdwp.EventKind.ThreadEnd:
                        evt = new ThreadDeath(data);
                        break;
                    case Jdwp.EventKind.ClassPrepare:
                        evt = new ClassPrepare(data);
                        break;
                    case Jdwp.EventKind.ClassUnload:
                        evt = new ClassUnload(data);
                        break;
                    case Jdwp.EventKind.FieldAccess:
                        evt = new FieldAccess(data);
                        break;
                    case Jdwp.EventKind.FieldModification:
                        evt = new FieldModification(data);
                        break;
                    case Jdwp.EventKind.VmDeath:
                        evt = new VmDeath(data);
                        break;
                    default:
                        throw new ArgumentException("Unknown event kind in compositive command " + (int)eventKind);
                }
                DLog.Debug(DContext.DebuggerLibDebugger, "JDWP event {0} {1}", eventKind, evt);
                Task.Factory.StartNew(() => {
                    evt.Accept(compositeCommandProcessor, suspendPolicy);
                });
            }
        }
Example #2
0
        private void OnExceptionClassPrepared(ClassPrepare obj)
        {
            // since a class can be loaded multiple times, keep listening
            // for further prepared events.

            // update the behavior.
            var clrName = Debugger.Process.SignatureToClrName(obj.Signature);

            SetupBehaviors(new[] { _exceptionBehaviorMap[clrName] });
        }
        /// <summary>
        /// A class prepare event is received.
        /// </summary>
        internal void OnClassPrepare(ClassPrepare @event)
        {
            // Log
            var signature = @event.Signature;

            DLog.Debug(DContext.DebuggerLibClassPrepare, "Prepare {0}", signature);

            // Record data
            ProcessClassData(@event.TypeId, @event.Signature, @event.Status);

            // Select class prepare listeners
            var matchingCookies = new List <DalvikClassPrepareCookie>();

            lock (dataLock)
            {
                for (var i = 0; i < classPrepareHandlers.Count;)
                {
                    var entry = classPrepareHandlers[i];
                    if (entry.Signature == signature)
                    {
                        matchingCookies.Add(entry);
                        classPrepareHandlers.RemoveAt(i);
                    }
                    else
                    {
                        i++;
                    }
                }
            }

            // Notify class prepare listeners
            matchingCookies.ForEach(x => x.Handler(@event));

            // Resume execution
            Debugger.VirtualMachine.ResumeAsync();
        }
        private void OnExceptionClassPrepared(ClassPrepare obj)
        {
            // since a class can be loaded multiple times, keep listening
            // for further prepared events.

            // update the behavior.
            var clrName = Debugger.Process.SignatureToClrName(obj.Signature);
            SetupBehaviors(new[]{_exceptionBehaviorMap[clrName]});
        }
Example #5
0
 public virtual TResult Visit(ClassPrepare e, TData data)
 {
     return(Visit((JdwpEvent)e, data));
 }
Example #6
0
 /// <summary>
 /// Handle class prepare
 /// </summary>
 public override bool Visit(ClassPrepare e, Jdwp.SuspendPolicy data)
 {
     // Do not handle suspend policy here because the next will will do so.
     debugger.process.ReferenceTypeManager.OnClassPrepare(e);
     return(true);
 }
        private void HandleCompositeCommand(JdwpPacket packet)
        {
            var data          = packet.Data;
            var suspendPolicy = (Jdwp.SuspendPolicy)data.GetByte();
            var count         = data.GetInt();

            for (var i = 0; i < count; i++)
            {
                var       eventKind = (Jdwp.EventKind)data.GetByte();
                JdwpEvent evt;
                switch (eventKind)
                {
                case Jdwp.EventKind.VmInit:
                    evt = new VmStart(data);
                    break;

                case Jdwp.EventKind.SingleStep:
                    evt = new SingleStep(data);
                    break;

                case Jdwp.EventKind.BreakPoint:
                    evt = new Breakpoint(data);
                    break;

                case Jdwp.EventKind.MethodEntry:
                    evt = new MethodEntry(data);
                    break;

                case Jdwp.EventKind.MethodExit:
                    evt = new MethodExit(data);
                    break;

                case Jdwp.EventKind.Exception:
                    evt = new Exception(data);
                    break;

                case Jdwp.EventKind.ThreadStart:
                    evt = new ThreadStart(data);
                    break;

                case Jdwp.EventKind.ThreadEnd:
                    evt = new ThreadDeath(data);
                    break;

                case Jdwp.EventKind.ClassPrepare:
                    evt = new ClassPrepare(data);
                    break;

                case Jdwp.EventKind.ClassUnload:
                    evt = new ClassUnload(data);
                    break;

                case Jdwp.EventKind.FieldAccess:
                    evt = new FieldAccess(data);
                    break;

                case Jdwp.EventKind.FieldModification:
                    evt = new FieldModification(data);
                    break;

                case Jdwp.EventKind.VmDeath:
                    evt = new VmDeath(data);
                    break;

                default:
                    throw new ArgumentException("Unknown event kind in compositive command " + (int)eventKind);
                }
                DLog.Debug(DContext.DebuggerLibDebugger, "JDWP event {0} {1}", eventKind, evt);
                Task.Factory.StartNew(() => {
                    evt.Accept(compositeCommandProcessor, suspendPolicy);
                });
            }
        }
        /// <summary>
        /// A class prepare event is received.
        /// </summary>
        internal void OnClassPrepare(ClassPrepare @event)
        {
            // Log
            var signature = @event.Signature;
            DLog.Debug(DContext.DebuggerLibClassPrepare, "Prepare {0}", signature);

            // Record data
            ProcessClassData(@event.TypeId, @event.Signature, @event.Status);

            // Select class prepare listeners
            var matchingCookies = new List<DalvikClassPrepareCookie>();
            lock (dataLock)
            {
                for (var i = 0; i < classPrepareHandlers.Count; )
                {
                    var entry = classPrepareHandlers[i];
                    if (entry.Signature == signature)
                    {
                        matchingCookies.Add(entry);
                        classPrepareHandlers.RemoveAt(i);
                    }
                    else
                    {
                        i++;
                    }
                }
            }

            // Notify class prepare listeners
            matchingCookies.ForEach(x => x.Handler(@event));

            // Resume execution
            Debugger.VirtualMachine.ResumeAsync();
        }
        private void HandleCompositeCommand(JdwpPacket packet)
        {
            var data          = packet.Data;
            var suspendPolicy = (Jdwp.SuspendPolicy)data.GetByte();
            var count         = data.GetInt();

            for (var i = 0; i < count; i++)
            {
                var       eventKind = (Jdwp.EventKind)data.GetByte();
                JdwpEvent evt;
                switch (eventKind)
                {
                case Jdwp.EventKind.VmInit:
                    evt = new VmStart(data);
                    break;

                case Jdwp.EventKind.SingleStep:
                    evt = new SingleStep(data);
                    break;

                case Jdwp.EventKind.BreakPoint:
                    evt = new Breakpoint(data);
                    break;

                case Jdwp.EventKind.MethodEntry:
                    evt = new MethodEntry(data);
                    break;

                case Jdwp.EventKind.MethodExit:
                    evt = new MethodExit(data);
                    break;

                case Jdwp.EventKind.Exception:
                    evt = new Exception(data);
                    break;

                case Jdwp.EventKind.ThreadStart:
                    evt = new ThreadStart(data);
                    break;

                case Jdwp.EventKind.ThreadEnd:
                    evt = new ThreadDeath(data);
                    break;

                case Jdwp.EventKind.ClassPrepare:
                    evt = new ClassPrepare(data);
                    break;

                case Jdwp.EventKind.ClassUnload:
                    evt = new ClassUnload(data);
                    break;

                case Jdwp.EventKind.FieldAccess:
                    evt = new FieldAccess(data);
                    break;

                case Jdwp.EventKind.FieldModification:
                    evt = new FieldModification(data);
                    break;

                case Jdwp.EventKind.VmDeath:
                    evt = new VmDeath(data);
                    break;

                default:
                    throw new ArgumentException("Unknown event kind in compositive command " + (int)eventKind);
                }
                DLog.Debug(DContext.DebuggerLibDebugger, "JDWP event {0} {1}", eventKind, evt);
                Task.Factory.StartNew(() => {
                    evt.Accept(compositeCommandProcessor, suspendPolicy);
                }).ContinueWith(task =>
                {
                    DLog.Error(DContext.DebuggerLibJdwpConnection, "HandleCompositeCommand: Internal failure on event processing. SuspendPolicy was {1}; IsCancelled={0}. Exception={1}", suspendPolicy, task.IsCanceled, task.Exception);
                    if (suspendPolicy != Jdwp.SuspendPolicy.None)
                    {
                        // we should better resume the VM, as the command handler may have failed to do so.
                        if (Connected)
                        {
                            VirtualMachine.ResumeAsync();
                        }
                    }
                }, TaskContinuationOptions.NotOnRanToCompletion);
            }
        }
        private void HandleCompositeCommand(JdwpPacket packet)
        {
            var data = packet.Data;
            var suspendPolicy = (Jdwp.SuspendPolicy) data.GetByte();
            var count = data.GetInt();

            for (var i = 0; i < count; i++)
            {
                var eventKind = (Jdwp.EventKind) data.GetByte();
                JdwpEvent evt;
                switch (eventKind)
                {
                    case Jdwp.EventKind.VmInit:
                        evt = new VmStart(data);
                        break;
                    case Jdwp.EventKind.SingleStep:
                        evt = new SingleStep(data);
                        break;
                    case Jdwp.EventKind.BreakPoint:
                        evt = new Breakpoint(data);
                        break;
                    case Jdwp.EventKind.MethodEntry:
                        evt = new MethodEntry(data);
                        break;
                    case Jdwp.EventKind.MethodExit:
                        evt = new MethodExit(data);
                        break;
                    case Jdwp.EventKind.Exception:
                        evt = new Exception(data);
                        break;
                    case Jdwp.EventKind.ThreadStart:
                        evt = new ThreadStart(data);
                        break;
                    case Jdwp.EventKind.ThreadEnd:
                        evt = new ThreadDeath(data);
                        break;
                    case Jdwp.EventKind.ClassPrepare:
                        evt = new ClassPrepare(data);
                        break;
                    case Jdwp.EventKind.ClassUnload:
                        evt = new ClassUnload(data);
                        break;
                    case Jdwp.EventKind.FieldAccess:
                        evt = new FieldAccess(data);
                        break;
                    case Jdwp.EventKind.FieldModification:
                        evt = new FieldModification(data);
                        break;
                    case Jdwp.EventKind.VmDeath:
                        evt = new VmDeath(data);
                        break;
                    default:
                        throw new ArgumentException("Unknown event kind in compositive command " + (int)eventKind);
                }
                DLog.Debug(DContext.DebuggerLibDebugger, "JDWP event {0} {1}", eventKind, evt);
                Task.Factory.StartNew(() => {
                    evt.Accept(compositeCommandProcessor, suspendPolicy);
                }).ContinueWith(task =>
                {
                    DLog.Error(DContext.DebuggerLibJdwpConnection, "HandleCompositeCommand: Internal failure on event processing. SuspendPolicy was {1}; IsCancelled={0}. Exception={1}", suspendPolicy, task.IsCanceled, task.Exception);
                    if (suspendPolicy != Jdwp.SuspendPolicy.None)
                    {
                        // we should better resume the VM, as the command handler may have failed to do so.
                        if(Connected)
                            VirtualMachine.ResumeAsync();
                    }
                }, TaskContinuationOptions.NotOnRanToCompletion);
            }
        }