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); } }
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; } }
// 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"); }