コード例 #1
0
        public void OnBreakpoint(DebuggedThread thread, IDebugBoundBreakpoint2 bp, uint address)
        {
            IDebugBoundBreakpoint2[] boundBreakpoints = new IDebugBoundBreakpoint2[1];
            boundBreakpoints[0] = bp;

            /*int i = 0;
             * foreach (object objCurrentBreakpoint in clients)
             * {
             *  boundBreakpoints[i] = (IDebugBoundBreakpoint2)objCurrentBreakpoint;
             *  i++;
             * }*/

            // An engine that supports more advanced breakpoint features such as hit counts, conditions and filters
            // should notify each bound breakpoint that it has been hit and evaluate conditions here.
            // The sample engine does not support these features.

            AD7BoundBreakpointsEnum boundBreakpointsEnum = new AD7BoundBreakpointsEnum(boundBreakpoints);

            AD7BreakpointEvent eventObject = new AD7BreakpointEvent(boundBreakpointsEnum);

            //AD7Thread ad7Thread = (AD7Thread)thread.Client;
            Send(eventObject, AD7BreakpointEvent.IID, (IDebugThread2)thread);
        }
コード例 #2
0
        public void OnStepComplete(DebuggedThread thread)
        {
            StoppingEvent <IDebugStepCompleteEvent2> eventObject = new StoppingEvent <IDebugStepCompleteEvent2>();

            Send(eventObject, eventObject.IID.ToString(), (IDebugThread2)thread);
        }
コード例 #3
0
 void InitEngineDependentStuff()
 {
     thread = new DebuggedThread(engine, 1);
 }
コード例 #4
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");
        }
コード例 #5
0
 public AD7Thread(AD7Engine engine, DebuggedThread debuggedThread)
 {
     m_engine         = engine;
     m_debuggedThread = debuggedThread;
 }