コード例 #1
0
        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);
                }
            });
        }
コード例 #2
0
        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);
                }
            });
        }
コード例 #3
0
        /// <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."));
                }
            }
        }
コード例 #4
0
        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();
                }
            }
        }
コード例 #5
0
 public override void PrintProcesses(SynchronizedStreamWriter log)
 {
     log.WriteLine("IProcessHelper.PrintProcesses is unimplemented on windows");
 }
コード例 #6
0
        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 {
                }
            }
        }