示例#1
0
        public void AsyncCallbackImpl(IAsyncResult ar)
        {
            try
            {
                if (ar.IsCompleted)
                {
                    bool success = false;
                    if (clientStream.CanRead)
                    {
                        int received = clientStream.EndRead(ar);
                        if (received > 0)
                        {
                            int n = 0;

                            while (n < received)
                            {
                                byte val = buffer[n];
                                if (val != '\n')
                                {
                                    packet.Add(val);
                                }
                                else
                                {
                                    if (packet.Count > 0)
                                    {
                                        byte[] data = packet.ToArray();
                                        string str  = Encoding.UTF8.GetString(data, 0, data.Length);
                                        OnPacket(str);
                                        packet.Clear();
                                    }
                                }
                                n++;
                            }
                            success = true;
                        }
                    }
                    if (!success)
                    {
                        DebuggerEventDesc ed = new DebuggerEventDesc();
                        ed.EventType = "disconnected";
                        ed.Error     = "Connection Lost";
                        DebuggerEvent(this, ed);
                    }
                    else
                    {
                        clientStream.BeginRead(buffer, 0, buffer.Length, AsyncCallbackImpl, this);
                    }
                }
            }
            catch (IOException e)
            {
                DebuggerEventDesc ed = new DebuggerEventDesc();
                ed.EventType = "disconnected";
                ed.Error     = e.Message;
                DebuggerEvent(this, ed);
            }
            catch (ObjectDisposedException e)
            {
                DebuggerEventDesc ed = new DebuggerEventDesc();
                ed.EventType = "disconnected";
                ed.Error     = e.Message;
                DebuggerEvent(this, ed);
            }
            catch (Exception e)
            {
                DebuggerEventDesc ed = new DebuggerEventDesc();
                ed.EventType = "disconnected";
                ed.Error     = e.Message;
                DebuggerEvent(this, ed);
            }
        }
示例#2
0
        void OnPacket(string packet)
        {
            XmlDocument doc = new XmlDocument();

            doc.LoadXml(packet);
            switch (doc.DocumentElement.Name)
            {
            case "break":
            case "error":
            {
                CollectWatches();
                snapshotid++;
                //Console.Out.WriteLine("Break event");
                DebuggerEventDesc ed = new DebuggerEventDesc();
                ed.Line      = Convert.ToInt32(doc.DocumentElement.GetAttribute("line"));
                ed.Source    = doc.DocumentElement.GetAttribute("src");
                ed.Source    = ed.Source.Replace('/', Path.DirectorySeparatorChar);
                ed.Source    = UnFixupPath(ed.Source);
                ed.EventType = doc.DocumentElement.GetAttribute("type");
                ed.ThreadId  = 1;
                string thread = doc.DocumentElement.GetAttribute("thread");
                if (thread != null && thread != string.Empty)
                {
                    Int32.TryParse(thread, NumberStyles.HexNumber, null, out ed.ThreadId);
                }
                if (ed.EventType == "error")
                {
                    ed.Error = doc.DocumentElement.GetAttribute("error");
                }
                ParseVMSnapshot(doc);
                if (DebuggerEvent != null)
                {
                    DebuggerEvent(this, ed);

                    /*foreach (System.Delegate d in DebuggerEvent.GetInvocationList())
                     * {
                     *  object[] ps = new object[] { this, ed };
                     *  mainForm.Invoke(d, ps);
                     * }*/
                }
            }
            break;

            case "addbreakpoint":
                if (DebuggerEvent != null)
                {
                    DebuggerEventDesc ed = new DebuggerEventDesc();
                    ed.EventType = "addbreakpoint";
                    DebuggerEvent(this, ed);
                }
                break;

            case "removebreakpoint":
                if (DebuggerEvent != null)
                {
                    DebuggerEventDesc ed = new DebuggerEventDesc();
                    ed.EventType = "removebreakpoint";
                    DebuggerEvent(this, ed);
                }
                break;

            case "terminated":
                if (DebuggerEvent != null)
                {
                    Console.Out.WriteLine("terminated");
                    DebuggerEventDesc ed = new DebuggerEventDesc();
                    ed.EventType = "terminated";
                    ed.Error     = "program terminated";

                    if (DebuggerEvent != null)
                    {
                        DebuggerEvent(this, ed);
                    }
                }
                break;

            case "resumed":
                if (DebuggerEvent != null)
                {
                    DebuggerEventDesc ed = new DebuggerEventDesc();
                    ed.EventType = "resumed";
                    DebuggerEvent(this, ed);
                }
                break;

            case "ready":
                if (DebuggerEvent != null)
                {
                    DebuggerEventDesc ed = new DebuggerEventDesc();
                    ed.EventType = "ready";
                    DebuggerEvent(this, ed);
                }
                break;

            default:
                if (DebuggerEvent != null)
                {
                    DebuggerEventDesc ed = new DebuggerEventDesc();
                    ed.EventType = "unknown";
                    DebuggerEvent(this, ed);
                }
                break;
            }
        }
示例#3
0
        // Initiate an x86 stack walk on this thread.

        /* public void DoStackWalk(DebuggedThread thread)
         * {
         *   //throw new NotImplementedException();
         * }
         *
         * public void WaitForAndDispatchDebugEvent(ResumeEventPumpFlags flags)
         * {
         *   throw new NotImplementedException();
         * }*/

        /* public int PollThreadId
         * {
         *   get { return 1; }
         * }
         *
         * public bool IsStopped
         * {
         *   get
         *   {
         *       return false;
         *   }
         * }
         *
         * public bool IsPumpingDebugEvents
         * {
         *   get
         *   {
         *       return true;
         *   }
         * }*/

        #endregion

        void DebugContextHandler(SquirrelDebugContext ctx, DebuggerEventDesc ed)
        {
            switch (ed.EventType)
            {
            case "error":
            case "breakpoint":
            case "step":
                if (ed.EventType != "step")
                {
                    engineCallback.OnOutputString("DEBUGGER EVENT : " + ed.EventType + "\n");
                }


                if (thread.Id != ed.ThreadId)
                {
                    DebuggedThread oldthread = thread;
                    thread = new DebuggedThread(engine, ed.ThreadId);
                    thread.SetContext(ctx);
                    engineCallback.OnThreadExit(oldthread, 0);
                }
                thread.SetStackFrames(ctx.StackFrames);

                processState = (uint)enum_PROCESS_INFO_FLAGS.PIFLAG_PROCESS_STOPPED | (uint)enum_PROCESS_INFO_FLAGS.PIFLAG_DEBUGGER_ATTACHED;
                switch (ed.EventType)
                {
                case "error":
                    //engineCallback.OnError(thread,"Unhandled exception [{0}] line = {1} source = {2} ThreadId = {3}", ed.Error, ed.Line, ed.Source, ed.ThreadId);
                    engineCallback.OnException(thread, ed.Error, ed.Line, ed.Source);
                    break;

                case "breakpoint":
                {
                    BreakPointAddress bpa = FindBreakpoint((uint)ed.Line, ed.Source);
                    if (bpa != null)
                    {
                        engineCallback.OnOutputString("BP " + ed.Line + " : " + ed.Source + "\n");
                        engineCallback.OnBreakpoint(thread, bpa.boundbp, bpa.id);
                    }
                    else
                    {
                        engineCallback.OnOutputString("DEBUGGER ERROR : Could not find breakpoint " + ed.Line + " : " + ed.Source + "\n");
                        Continue(thread);
                    }
                }
                break;

                case "step":
                    engineCallback.OnStepComplete(thread);
                    break;
                }

                break;

            case "resumed":
                engineCallback.OnOutputString("DEBUGGER EVENT : resumed\n");
                processState = (uint)enum_PROCESS_INFO_FLAGS.PIFLAG_PROCESS_RUNNING | (uint)enum_PROCESS_INFO_FLAGS.PIFLAG_DEBUGGER_ATTACHED;
                break;

            case "suspended":
                engineCallback.OnOutputString("DEBUGGER EVENT : suspended\n");
                engineCallback.OnAsyncBreakComplete(thread);
                processState = (uint)enum_PROCESS_INFO_FLAGS.PIFLAG_PROCESS_STOPPED | (uint)enum_PROCESS_INFO_FLAGS.PIFLAG_DEBUGGER_ATTACHED;
                break;

            case "disconnected":
                engineCallback.OnOutputString("DEBUGGER EVENT : disconnected\n");
                Terminate();
                processState = (uint)enum_PROCESS_INFO_FLAGS.PIFLAG_PROCESS_STOPPED;
                break;

            case "addbreakpoint":
                engineCallback.OnOutputString(String.Format("DEBUGGER EVENT : {0}\n", ed.EventType));
                break;

            default:
                engineCallback.OnOutputString("DEBUGGER EVENT : " + ed.EventType + "<UNHANDLED>\n");
                break;
            }

            //Console.WriteLine("do things here");
        }