public static void WaitForSuspend() { if (InferiorExecuting) { ResumeEvent.WaitOne(); InferiorExecuting = false; } }
private void Suspend() { lock (Lock) { _state = ThreadState.Suspended; } ResumeEvent.WaitOne(); }
internal static void Run(Version ver, bool batch, bool rc, IEnumerable <string> commands, IEnumerable <string> files) { if (!Configuration.Read()) { Configuration.Defaults(); } Configuration.Apply(); var dbFile = Configuration.Current.DefaultDatabaseFile; if (Configuration.Current.LoadDatabaseAutomatically && !string.IsNullOrWhiteSpace(dbFile)) { FileInfo file; try { file = new FileInfo(dbFile); } catch (Exception ex) { Log.Error("Could not open database file '{0}':", dbFile); Log.Error(ex.ToString()); return; } Debugger.Read(file); } Log.Notice("Welcome to the Mono soft debugger (sdb {0})", ver); Log.Notice("Type 'help' for a list of commands or 'quit' to exit"); Log.Info(string.Empty); Root.AddCommands(Plugins.LoadDefault()); var rcFile = GetFilePath(); if (rc && File.Exists(rcFile)) { RunFile(rcFile, true); } foreach (var file in files) { if (File.Exists(file)) { RunFile(file, true); } } RunCommands(commands); while (!Stop) { // If the command caused the debuggee to start // or resume execution, wait for it to suspend. if (InferiorExecuting) { ResumeEvent.WaitOne(); InferiorExecuting = false; } string cmd; // We use a queue here so that batch commands are // also subject to the suspension check above. It // also makes things easier since everything gets // executed in one thread. if (_queue.TryDequeue(out cmd)) { Process(cmd, true); } else if (batch) { Stop = true; } else { cmd = _lineEditor != null? _lineEditor.Edit(GetPrompt(), string.Empty) : LibEdit.ReadLine(GetPrompt()); // Did we get EOF? if (cmd == null) { Log.Info(string.Empty); if (Debugger.State != State.Exited) { Log.Error("An inferior process is active"); } else { Stop = true; } } else { Process(cmd, false); } } } // Clean up just in case. UnsetControlCHandler(); dbFile = Configuration.Current.DefaultDatabaseFile; if (Configuration.Current.SaveDatabaseAutomatically && !string.IsNullOrWhiteSpace(dbFile)) { FileInfo file; try { file = new FileInfo(dbFile); } catch (Exception ex) { Log.Error("Could not open database file '{0}':", dbFile); Log.Error(ex.ToString()); return; } Debugger.Write(file); } // Let's not leave dead Mono processes behind... Debugger.Pause(); Debugger.Kill(); while (!Debugger.DebuggeeKilled) { Thread.Sleep(10); } Log.Notice("Bye"); }