// Start a new debugger process if the debugger is not already // running. public void Start(string cmdline) { if (debug != null) { return; } string path = settings.MSPDebugPath; string args = "--embed " + cmdline; if (settings.UseBundledDebugger) { string self = Assembly.GetExecutingAssembly().Location; path = Path.Combine (Path.GetDirectoryName(self), "mspdebug.exe"); } isReady = false; try { debug = new Debugger(path, args); } catch (Exception ex) { MessageDialog dlg = new MessageDialog (null, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, "Can't start debugger: {0}", ex.Message); dlg.Title = "Olishell"; dlg.Run(); dlg.Hide(); return; } messageEvent = new ITC.GtkListener(debug.Output); messageEvent.Signalled += OnMessage; readyEvent = new ITC.GtkListener(debug.Ready); readyEvent.Signalled += OnReady; if (DebuggerStarted != null) { DebuggerStarted(this, null); } }
// A message has been received from the debugger, or it has // exited. void OnMessage(object sender, EventArgs args) { Debugger.Message msg; while (debug.Output.TryReceive(out msg)) { switch (msg.Type) { case Debugger.MessageType.Normal: case Debugger.MessageType.Debug: Console.Out.WriteLine(stripANSI(msg.Text)); break; case Debugger.MessageType.Error: Console.Error.WriteLine(stripANSI(msg.Text)); break; case Debugger.MessageType.Shell: break; } if (msg.Type == Debugger.MessageType.Shell) { HandleShell(msg); } else if (MessageReceived != null) { MessageReceived(this, new MessageEventArgs(msg)); } } if (debug.Output.IsClosed) { messageEvent.Disable(); readyEvent.Disable(); debug = null; messageEvent = null; readyEvent = null; if (DebuggerExited != null) { DebuggerExited(this, null); } } }