public void Setup(Job p) { p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardError = true; p.StartInfo.RedirectStandardOutput = true; stdout_thread = new Thread(delegate() { try { string line; while (null != (line = p.StandardOutput.ReadLine())) { log.WriteLine(line); } } catch (Exception ex) { Logger.Log("? Stdin reader thread got exception: {0}", ex.Message); } }); stderr_thread = new Thread(delegate() { try { string line; while (null != (line = p.StandardError.ReadLine())) { log.WriteLine(line); } } catch (Exception ex) { Logger.Log("? Stderr reader thread got exception: {0}", ex.Message); } }); }
public void Setup(Job p, bool timestamp = false) { p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardError = true; p.StartInfo.RedirectStandardOutput = true; stdout_thread = new Thread(delegate() { try { string line; while (null != (line = p.StandardOutput.ReadLine())) { if (timestamp && !line.StartsWith("@MonkeyWrench:") && !line.StartsWith("@Moonbuilder:")) { line = "[" + DateTime.Now.ToString("h:mm:ss") + "] " + line; } logstream.WriteLine(line); } } catch (Exception ex) { log.ErrorFormat("Stdin reader thread got exception: {0}", ex); } }); stderr_thread = new Thread(delegate() { try { string line; while (null != (line = p.StandardError.ReadLine())) { if (timestamp && !line.StartsWith("@MonkeyWrench:") && !line.StartsWith("@Moonbuilder:")) { line = "[" + DateTime.Now.ToString("h:mm:ss") + "] " + line; } logstream.WriteLine(line); } } catch (Exception ex) { log.ErrorFormat("Stderr reader thread got exception: {0}", ex); } }); }
/// <summary> /// Implementation using kill /// </summary> /// <param name="pids"></param> internal static void KillImpl(IEnumerable <int> pids, SynchronizedStreamWriter log) { using (Process kill = new Process()) { kill.StartInfo.FileName = "kill"; kill.StartInfo.Arguments = "-9 "; foreach (int pid in pids) { kill.StartInfo.Arguments += pid.ToString() + " "; } log.WriteLine(string.Format("\n * Killing the processes {0} * ", kill.StartInfo.Arguments.Substring(3))); kill.StartInfo.UseShellExecute = false; kill.Start(); if (!kill.WaitForExit(1000 * 15 /* 15 seconds */)) { throw new ApplicationException(string.Format("The 'kill' process didn't exit in 15 seconds.")); } } }
internal static void RenderStackTraceWithGdb(int pid, SynchronizedStreamWriter log) { log.WriteLine(string.Format("\n * Fetching stack trace for process {0} * \n", pid)); using (var gdb = new Job()) { gdb.StartInfo.FileName = "gdb"; gdb.StartInfo.Arguments = string.Format("-ex attach {0} --ex \"info target\" --ex \"info threads\" --ex \"thread apply all bt\" --batch", pid); var reader = new ProcessReader(log); reader.Setup(gdb); gdb.Start(); reader.Start(); try { if (!gdb.WaitForExit(1000 * 30 /* 30 seconds */)) { throw new ApplicationException(string.Format("The 'gdb' process didn't exit in 30 seconds.")); } } finally { reader.Join(); } } }
public override void PrintProcesses(SynchronizedStreamWriter log) { log.WriteLine("IProcessHelper.PrintProcesses is unimplemented on windows"); }
internal static void RenderStackTraceWithGdb(int pid, SynchronizedStreamWriter log) { log.WriteLine(string.Format("\n * Fetching stack trace for process {0} * \n", pid)); var template = Path.GetTempFileName(); try { bool using_lldb = false; string debugger; if (File.Exists("/usr/bin/gdb")) { using_lldb = false; debugger = "/usr/bin/gdb"; } else if (File.Exists("/usr/bin/lldb")) { using_lldb = true; debugger = "/usr/bin/lldb"; } else { using_lldb = false; // lets hope "gdb" is somewhere. debugger = "gdb"; } var commands = new StringBuilder(); using (var dbg = new Job()) { dbg.StartInfo.UseShellExecute = false; dbg.StartInfo.FileName = debugger; if (using_lldb) { commands.AppendFormat("process attach --pid {0}\n", pid); commands.Append("script lldb.debugger.HandleCommand (\"thread list\")\n"); commands.Append("script lldb.debugger.HandleCommand (\"thread backtrace all\")\n"); commands.Append("detach\n"); commands.Append("quit\n"); dbg.StartInfo.Arguments = "--source \"" + template + "\""; } else { commands.AppendFormat("attach {0}\n", pid); commands.Append("info target\n"); commands.Append("info threads\n"); commands.Append("thread apply all bt\n"); dbg.StartInfo.Arguments = "-batch -x \"" + template + "\""; } File.WriteAllText(template, commands.ToString()); var reader = new ProcessReader(log); reader.Setup(dbg); dbg.Start(); reader.Start(); try { if (!dbg.WaitForExit(1000 * 30 /* 30 seconds */)) { throw new ApplicationException(string.Format("The 'gdb' process didn't exit in 30 seconds.", dbg.StartInfo.FileName)); } } finally { reader.Join(); } } } finally { try { File.Delete(template); } catch { } } }