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); }
public void OnStepComplete(DebuggedThread thread) { StoppingEvent <IDebugStepCompleteEvent2> eventObject = new StoppingEvent <IDebugStepCompleteEvent2>(); Send(eventObject, eventObject.IID.ToString(), (IDebugThread2)thread); }
void InitEngineDependentStuff() { thread = new DebuggedThread(engine, 1); }
// 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"); }
public AD7Thread(AD7Engine engine, DebuggedThread debuggedThread) { m_engine = engine; m_debuggedThread = debuggedThread; }