From: Pedro Alves <palves@redhat.com>
To: Sergio Durigan Junior <sergiodj@redhat.com>,
GDB Patches <gdb-patches@sourceware.org>
Cc: Luis Machado <lgustavo@codesourcery.com>
Subject: Re: [PATCH v3 5/6] Share fork_inferior et al with gdbserver
Date: Wed, 15 Feb 2017 17:28:00 -0000 [thread overview]
Message-ID: <a8f84e39-cf7f-4778-1e0e-0dfe4f00f3da@redhat.com> (raw)
In-Reply-To: <20170208032257.15443-6-sergiodj@redhat.com>
Hi Sergio,
I think I'll likely have more comments, but this large, so
here's a first pass.
> diff --git a/gdb/common/common-fork-child.c b/gdb/common/common-fork-child.c
> new file mode 100644
> index 0000000..f4d7866
> --- /dev/null
> +++ b/gdb/common/common-fork-child.c
> @@ -0,0 +1,593 @@
> +/* Fork a Unix child process, and set up to debug it, for GDB and GDBserver.
> +
> + Copyright (C) 1990-2017 Free Software Foundation, Inc.
> +
> + Originally contributed by Cygnus Support.
We should just take the opportunity to drop that per recent policy.
Plenty of files added by Cygnus (nowadays Red Hat) don't have that marker,
this won't be missed, IMO.
> +
> + This file is part of GDB.
> +
> + This program is free software; you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> + the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + GNU General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program. If not, see <http://www.gnu.org/licenses/>. */
> +
> +int
> +fork_inferior (char *exec_file_arg, char *allargs, char **env,
> + void (*traceme_fun) (void), void (*init_trace_fun) (int),
> + void (*pre_trace_fun) (void), char *shell_file_arg,
> + void (*exec_fun)(const char *file, char * const *argv,
> + char * const *env))
> +{
> + /* Retain a copy of our environment variables, since the child will
> + replace the value of environ and if we're vforked, we have to
> + restore it. */
> + save_our_env = environ;
> +
> + /* Likewise the current UI. */
> + save_ui = current_ui;
Hmm, making this compile on gdbserver is of course a hack,
since there's not such thing as a "UI" concept on gdbserver...
> +
> + /* Tell the terminal handling subsystem what tty we plan to run on;
> + it will just record the information for later. */
> + new_tty_prefork (inferior_io_terminal);
I wonder about calling here instead a more generalized hook, and
moving the save_ui saving and the new_tty_prefork calls to
that hook's gdb implementation. Might be easier to do that after
the series is in...
> +
> + /* It is generally good practice to flush any possible pending stdio
> + output prior to doing a fork, to avoid the possibility of both
> + the parent and child flushing the same data after the fork. */
> + gdb_flush_out_err ();
> +
> + /* If there's any initialization of the target layers that must
> + happen to prepare to handle the child we're about fork, do it
> + now... */
> + if (pre_trace_fun != NULL)
> + (*pre_trace_fun) ();
> +
> +++ b/gdb/common/common-top.h
> @@ -0,0 +1,31 @@
> +/* Common top level stuff for GDB and GDBserver.
> +
> + Copyright (C) 1986-2017 Free Software Foundation, Inc.
> +
> + This file is part of GDB.
> +
> + This program is free software; you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> + the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + GNU General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program. If not, see <http://www.gnu.org/licenses/>. */
> +
> +#ifndef COMMON_TOP_H
> +#define COMMON_TOP_H
> +
> +/* The main UI. This is the UI that is bound to stdin/stdout/stderr.
> + It always exists and is created automatically when GDB starts
> + up. */
> +extern struct ui *main_ui;
> +
> +/* The current UI. */
> +extern struct ui *current_ui;
> +
Not exactly thrilled with moving this to common.
> +#endif /* ! COMMON_TOP_H */
> /* Implement the "unset exec-wrapper" command. */
> @@ -585,7 +73,7 @@ Show the wrapper for running programs."), NULL,
> &unsetlist);
>
> add_setshow_boolean_cmd ("startup-with-shell", class_support,
> - &startup_with_shell, _("\
> + (int *) &startup_with_shell, _("\
That's invalid C/C++. Don't do that.
> Set use of shell to start subprocesses. The default is on."), _("\
> Show use of shell to start subprocesses."), NULL,
> NULL,
> --- a/gdb/gdbserver/inferiors.c
> +++ b/gdb/gdbserver/inferiors.c
> @@ -29,6 +29,8 @@ struct thread_info *current_thread;
>
> #define get_thread(inf) ((struct thread_info *)(inf))
>
> +ptid_t inferior_ptid;
What do we need this for? gdbserver already has
a "current thread" global. Another one looks like asking
for out-of-sync trouble.
> /* See common/common-gdbthread.h. */
>
> void
> init_thread_list (void)
> {
> - /* To be implemented. */
> + /* Placeholder needed for fork_inferior. No action is needed. */
Pick one of the comments, and move it to the right patch.
> }
>
> -/* Add a process to the common process list, and set its private
> - data. */
> +/* Update process represented by PID with necessary info. */
>
> static struct process_info *
> -linux_add_process (int pid, int attached)
> +linux_update_process (int pid)
I'm not sure I understand the need for this yet. I need
to look deeper. "update what? why?" Or maybe the
comments should be improved. :-)
> {
> - struct process_info *proc;
> + struct process_info *proc = find_process_pid (pid);
>
> - proc = add_process (pid, attached);
> + gdb_assert (proc != NULL);
> proc->priv = XCNEW (struct process_info_private);
>
> if (the_low_target.new_process != NULL)
> @@ -432,6 +433,16 @@ linux_add_process (int pid, int attached)
> return proc;
> }
>
> +/* Update the lwp associated to thread represented by PTID. */
> +
> +static struct lwp_info *
> +update_thread_lwp (ptid_t ptid)
Ditto.
> /* Start an inferior process and returns its pid.
> ALLARGS is a vector of program-name and args. */
>
> static int
> -linux_create_inferior (char *program, char **allargs)
> +linux_create_inferior (std::vector<char *> &program_argv)
"const std::vector<char *> &" ? Same comment for the whole
call chain, of course.
> {
> struct lwp_info *new_lwp;
> int pid;
> ptid_t ptid;
> struct cleanup *restore_personality
> = maybe_disable_address_space_randomization (disable_randomization);
> + std::string program_args = stringify_argv (program_argv);
>
> -#if defined(__UCLIBC__) && defined(HAS_NOMMU)
> - pid = vfork ();
> -#else
> - pid = fork ();
> -#endif
> - if (pid < 0)
> - perror_with_name ("fork");
> + pre_fork_inferior (program_argv);
>
> - if (pid == 0)
> - {
> - close_most_fds ();
> - ptrace (PTRACE_TRACEME, 0, (PTRACE_TYPE_ARG3) 0, (PTRACE_TYPE_ARG4) 0);
> -
> - setpgid (0, 0);
> -
> - /* If gdbserver is connected to gdb via stdio, redirect the inferior's
> - stdout to stderr so that inferior i/o doesn't corrupt the connection.
> - Also, redirect stdin to /dev/null. */
> - if (remote_connection_is_stdio ())
> - {
> - close (0);
> - open ("/dev/null", O_RDONLY);
> - dup2 (2, 1);
> - if (write (2, "stdin/stdout redirected\n",
> - sizeof ("stdin/stdout redirected\n") - 1) < 0)
> - {
> - /* Errors ignored. */;
> - }
> - }
> -
> - restore_original_signals_state ();
> -
> - execv (program, allargs);
> - if (errno == ENOENT)
> - execvp (program, allargs);
> -
> - fprintf (stderr, "Cannot exec %s: %s.\n", program,
> - strerror (errno));
> - fflush (stderr);
> - _exit (0177);
> - }
> + pid = fork_inferior (program_argv[0],
> + (char *) program_args.c_str (),
Can we constify fork_inferior's parameters to avoid such
cast hacks ?
> + environ_vector (get_environ ()), linux_ptrace_fun,
> + NULL, NULL, NULL, NULL);
>
> do_cleanups (restore_personality);
>
> - linux_add_process (pid, 0);
> + linux_update_process (pid);
>
> ptid = ptid_build (pid, pid, 0);
> - new_lwp = add_lwp (ptid);
> + new_lwp = update_thread_lwp (ptid);
> new_lwp->must_set_ptrace_flags = 1;
>
> + post_fork_inferior (pid, program_argv);
> +
> return pid;
> }
>
> +/* See common/common-inferior.h. */
> +
> +char *
> +get_exec_wrapper (void)
> {
> - char **new_argv = argv;
> + static std::string ret;
> + static int initialized_p = 0;
bool.
> +
> + if (wrapper_argv.empty ())
> + return NULL;
>
> - if (wrapper_argv != NULL)
> + if (!initialized_p)
> {
> - int i, count = 1;
> -
> - for (i = 0; wrapper_argv[i] != NULL; i++)
> - count++;
> - for (i = 0; argv[i] != NULL; i++)
> - count++;
> - new_argv = XALLOCAVEC (char *, count);
> - count = 0;
> - for (i = 0; wrapper_argv[i] != NULL; i++)
> - new_argv[count++] = wrapper_argv[i];
> - for (i = 0; argv[i] != NULL; i++)
> - new_argv[count++] = argv[i];
> - new_argv[count] = NULL;
> + for (std::vector<char *>::iterator i = wrapper_argv.begin ();
> + i != wrapper_argv.end ();
> + ++i)
> + ret += *i + std::string (" ");
for (auto arg : wrapper_argv)
ret += arg + " ";
> +
> + /* Erasing the last whitespace. */
"Erase".
> + ret.erase (ret.end () - 1);
> +
> + initialized_p = 1;
> }
>
> + return (char *) ret.c_str ();
Can the function return const instead?
> +}
> +
> +/* See common/common-inferior.h. */
> +
> +char *
> +get_exec_file (int err)
> +{
> + if (err && program_argv.empty ())
> + error (_("Could not get the exec file."));
I think this error message could be improved. If I see
that on the gdbserver terminal, I'll have no clue what
it means. "get from where??" How about just saying
the same thing gdb says, sans the "Use the ..." part?
> + return program_argv[0];
> +}
> +
> +/* See server.h. */
> +
> +struct gdb_environ *
> +get_environ (void)
> +{
> + return our_environ;
> +}
> +
> +/* See server.h. */
> +
> +void
> +pre_fork_inferior (std::vector<char *> &argv)
> +{
> if (debug_threads)
> {
> - int i;
> - for (i = 0; new_argv[i]; ++i)
> - debug_printf ("new_argv[%d] = \"%s\"\n", i, new_argv[i]);
> + int idx = 0;
> +
> + for (char *&i : argv)
Reference to pointer is pointless, it's like pointer to
pointer. This should be fine:
for (char *i : argv)
I'd suggest naming the variable something else, since
it's not really an iterator. Like e.g.,:
for (char *str : argv)
for (char *arg : argv)
> + {
> + debug_printf ("new_argv[%d] = \"%s\"\n", idx, i);
> + ++idx;
OTOH, if you're needing/maintaining an index anyway,
this ends up clearer IMO:
for (int idx = 0; idx < argv.size(); idx++)
debug_printf ("new_argv[%d] = \"%s\"\n", idx, argv[idx]);
> + }
> debug_flush ();
> }
>
> handle_v_run (char *own_buf)
> {
> - char *p, *next_p, **new_argv;
> - int i, new_argc;
> + char *p, *next_p;
> + std::vector<char *> new_argv;
> + int new_argc;
> + int i;
>
> new_argc = 0;
> for (p = own_buf + strlen ("vRun;"); p && *p; p = strchr (p, ';'))
> @@ -2870,62 +2893,91 @@ handle_v_run (char *own_buf)
> new_argc++;
> }
>
> - new_argv = (char **) calloc (new_argc + 2, sizeof (char *));
> - if (new_argv == NULL)
> - {
> - write_enn (own_buf);
> - return 0;
> - }
> -
> - i = 0;
> - for (p = own_buf + strlen ("vRun;"); *p; p = next_p)
> + for (i = 0, p = own_buf + strlen ("vRun;"); *p; p = next_p, ++i)
> {
> next_p = strchr (p, ';');
> if (next_p == NULL)
> next_p = p + strlen (p);
>
> - if (i == 0 && p == next_p)
> - new_argv[i] = NULL;
> + if (p == next_p)
> + new_argv.push_back ("''");
> else
> {
> /* FIXME: Fail request if out of memory instead of dying. */
> - new_argv[i] = (char *) xmalloc (1 + (next_p - p) / 2);
> - hex2bin (p, (gdb_byte *) new_argv[i], (next_p - p) / 2);
> - new_argv[i][(next_p - p) / 2] = '\0';
> + size_t len = 1 + (next_p - p) / 2;
> + char *s = (char *) xmalloc (len);
> + char *ss = (char *) xmalloc (len * 2);
> + char *tmp_s, *tmp_ss;
> + int need_quote;
> +
> + hex2bin (p, (gdb_byte *) s, (next_p - p) / 2);
> + s[(next_p - p) / 2] = '\0';
> +
> + tmp_s = s;
> + tmp_ss = ss;
> + need_quote = 0;
> + while (*tmp_s != '\0')
> + {
> + switch (*tmp_s)
> + {
> + case '\n':
> + *tmp_ss = '\'';
> + ++tmp_ss;
> + need_quote = 1;
> + break;
> +
> + case '\'':
> + *tmp_ss = '\\';
> + ++tmp_ss;
> + break;
> +
> + default:
> + break;
> + }
> +
> + *tmp_ss = *tmp_s;
> + ++tmp_ss;
> + ++tmp_s;
> + }
> +
> + if (need_quote)
> + *tmp_ss++ = '\'';
Hmm, is this quoting stuff being moved from somewhere,
or it is new?
> +
> + *tmp_ss = '\0';
> + new_argv.push_back (ss);
> + xfree (s);
> }
>
> if (*next_p)
> next_p++;
> - i++;
> }
> - new_argv[i] = NULL;
>
> + /* Gather information about the environment. */
> + our_environ = make_environ ();
> + init_environ (our_environ);
> +
> initialize_async_io ();
> initialize_low ();
> + /* This is called when initializing inflow on GDB. */
What is this comment supposed be to telling?
> + have_job_control ();
> initialize_event_loop ();
> if (target_supports_tracepoints ())
> initialize_tracepoint ();
> @@ -3695,13 +3758,11 @@ captured_main (int argc, char *argv[])
> int i, n;
>
> n = argc - (next_arg - argv);
> - program_argv = XNEWVEC (char *, n + 1);
> for (i = 0; i < n; i++)
> - program_argv[i] = xstrdup (next_arg[i]);
> - program_argv[i] = NULL;
> + program_argv.push_back (xstrdup (next_arg[i]));
>
> -#define create_inferior(program, args) \
> - (*the_target->create_inferior) (program, args)
> +#define create_inferior(program) \
> + (*the_target->create_inferior) (program)
program_argv, I suppose.
> +/* See common/common-utils.h. */
> +
> +std::string
> +stringify_argv (std::vector<char *> &argv)
> +{
> + std::string ret ("");
std::string ret;
> +
> + for (std::vector<char *>::iterator i = argv.begin () + 1;
> + i != argv.end ();
> + ++i)
> + ret += *i + std::string (" ");
Should we remove the last empty space?
> +
> + return ret;
> +}
> diff --git a/gdb/gdbserver/utils.h b/gdb/gdbserver/utils.h
> index b4ded31..a30d99a 100644
> --- a/gdb/gdbserver/utils.h
> +++ b/gdb/gdbserver/utils.h
> @@ -19,7 +19,17 @@
> #ifndef UTILS_H
> #define UTILS_H
>
> +#include <vector>
> +
> char *paddress (CORE_ADDR addr);
> char *pfildes (gdb_fildes_t fd);
>
> +/* Works like FREEARGV, but with std::vector. */
> +extern void free_vector_argv (std::vector<char *> &v);
At some point, freeargv is eliminated, and this comment will
stay behind. Can we expand it a bit?
> +
> +/* Given a vector of arguments ARGV, return a string equivalent to
> + joining all the arguments (starting from ARGV + 1) with a
> + whitespace separating them. */
> +extern std::string stringify_argv (std::vector<char *> &argv);
const ?
This "starting from ARGV + 1" contract was surprising to me.
I only noticed this when I saw the implementation.
Does it really make sense to put the program name inside the
vector instead of on a separate argument if we're always going
to treat argv[0] differently?
I.e., would:
- ...create_inferior (char *program, char **program_args)
+ ...create_inferior (char *program, std::vector<char *> &program_args)
make more sense?
> static int
> -win32_create_inferior (char *program, char **program_args)
> +win32_create_inferior (std::vector<char *> &program_argv)
> {
> #ifndef USE_WIN32API
> char real_path[PATH_MAX];
> @@ -627,6 +625,9 @@ win32_create_inferior (char *program, char **program_args)
> int argc;
> PROCESS_INFORMATION pi;
> DWORD err;
> + char *program = program_argv[0];
> + std::string program_args = stringify_argv (program_argv);
> + char *args = (char *) program_args.c_str ();
>
> /* win32_wait needs to know we're not attaching. */
> attaching = 0;
> @@ -636,6 +637,8 @@ win32_create_inferior (char *program, char **program_args)
>
> flags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS;
>
> + pre_fork_inferior (program, argv);
Hmm, fork on Windows?
> +
> #ifndef USE_WIN32API
> orig_path = NULL;
> path_ptr = getenv ("PATH");
> @@ -652,18 +655,6 @@ win32_create_inferior (char *program, char **program_args)
> program = real_path;
> #endif
>
> - argslen = 1;
> - for (argc = 1; program_args[argc]; argc++)
> - argslen += strlen (program_args[argc]) + 1;
> - args = (char *) alloca (argslen);
> - args[0] = '\0';
> - for (argc = 1; program_args[argc]; argc++)
> - {
> - /* FIXME: Can we do better about quoting? How does Cygwin
> - handle this? */
> - strcat (args, " ");
> - strcat (args, program_args[argc]);
> - }
> OUTMSG2 (("Command line is \"%s\"\n", args));
>
> #ifdef CREATE_NEW_PROCESS_GROUP
> @@ -704,6 +695,8 @@ win32_create_inferior (char *program, char **program_args)
>
> do_initial_child_stuff (pi.hProcess, pi.dwProcessId, 0);
>
> + post_fork_inferior (current_process_id, program_argv);
> +
> return current_process_id;
> }
>
> @@ -39,8 +39,14 @@ set spawn_id [remote_spawn target "$gdbserver stdio non-existing-program"]
> set msg "gdbserver exits cleanly"
> set saw_exiting 0
> expect {
> - # This is what we get on ptrace-based targets.
> - -re "stdin/stdout redirected.*No program to debug\r\nExiting\r\n$" {
> + # This is what we get on ptrace-based targets with
> + # startup-with-shell disabled.
> + -re "stdin/stdout redirected.*gdbserver: Cannot exec non-existing-program\r\ngdbserver: Error: No such file or directory\r\n\r\nDuring startup program exited with code 127\.\r\nExiting\r\n$" {
> + set saw_exiting 1
> + exp_continue
Shouldn't this be a part of the next patch?
> + }
> + # Likewise, but with startup-with-shell enabled.
> + -re "stdin/stdout redirected.*exec: non-existing-program: not found\r\nDuring startup program exited with code 127\.\r\nExiting\r\n$" {
> set saw_exiting 1
> exp_continue
> }
Thanks,
Pedro Alves
next prev parent reply other threads:[~2017-02-15 17:28 UTC|newest]
Thread overview: 155+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-23 3:39 [PATCH 0/6] Implement the ability to start inferiors with a shell on gdbserver Sergio Durigan Junior
2016-12-23 3:39 ` [PATCH 3/6] Share parts of gdb/inflow.c with gdbserver Sergio Durigan Junior
2016-12-26 21:34 ` Luis Machado
2017-01-03 21:16 ` Sergio Durigan Junior
2016-12-23 3:39 ` [PATCH 2/6] Share parts of gdb/terminal.h " Sergio Durigan Junior
2016-12-26 21:35 ` Luis Machado
2017-01-03 21:14 ` Sergio Durigan Junior
2017-01-03 21:27 ` Luis Machado
2017-01-03 21:38 ` Sergio Durigan Junior
2016-12-23 3:39 ` [PATCH 1/6] Share gdb/environ.[ch] " Sergio Durigan Junior
2016-12-26 21:34 ` Luis Machado
2016-12-23 3:45 ` [PATCH 5/6] Share fork_inferior et al " Sergio Durigan Junior
2017-01-03 23:32 ` Luis Machado
2017-01-05 20:11 ` Sergio Durigan Junior
2018-02-21 3:58 ` [RFC] "gdbserver ... BASENAME_EXE" no longer works (was: "[PATCH 5/6] Share fork_inferior et al with gdbserver") Joel Brobecker
2018-02-21 6:15 ` [RFC] "gdbserver ... BASENAME_EXE" no longer works Sergio Durigan Junior
2018-02-21 7:37 ` Joel Brobecker
2016-12-23 3:45 ` [PATCH 4/6] Share parts of gdb/gdbthread.h with gdbserver Sergio Durigan Junior
2016-12-26 21:35 ` Luis Machado
2017-01-03 21:31 ` Sergio Durigan Junior
2016-12-23 3:49 ` [PATCH 6/6] Implement proper "startup-with-shell" support on gdbserver Sergio Durigan Junior
2016-12-23 8:07 ` Eli Zaretskii
2017-01-03 20:48 ` Sergio Durigan Junior
2017-01-04 16:08 ` Eli Zaretskii
2017-01-05 20:12 ` Sergio Durigan Junior
2016-12-26 21:34 ` Luis Machado
2017-01-03 21:35 ` Sergio Durigan Junior
2016-12-27 0:26 ` Tom Tromey
2017-01-03 21:32 ` Sergio Durigan Junior
2016-12-23 7:50 ` [PATCH 0/6] Implement the ability to start inferiors with a shell " Eli Zaretskii
2017-01-03 20:23 ` Sergio Durigan Junior
2017-01-18 15:36 ` [PATCH v2] " Sergio Durigan Junior
2017-01-18 15:36 ` [PATCH v2 2/6] Share parts of gdb/terminal.h with gdbserver Sergio Durigan Junior
2017-02-01 18:37 ` Luis Machado
2017-02-07 22:39 ` Sergio Durigan Junior
2017-01-18 15:36 ` [PATCH v2 3/6] Share parts of gdb/inflow.c " Sergio Durigan Junior
2017-02-01 18:41 ` Luis Machado
2017-01-18 15:36 ` [PATCH v2 6/6] Implement proper "startup-with-shell" support on gdbserver Sergio Durigan Junior
2017-01-18 16:43 ` Eli Zaretskii
2017-02-01 19:07 ` Luis Machado
2017-01-18 15:36 ` [PATCH v2 1/6] Share gdb/environ.[ch] with gdbserver Sergio Durigan Junior
2017-02-01 20:35 ` Luis Machado
2017-01-18 15:42 ` [PATCH v2 4/6] Share parts of gdb/gdbthread.h " Sergio Durigan Junior
2017-02-01 18:54 ` Luis Machado
2017-02-07 22:42 ` Sergio Durigan Junior
2017-02-08 9:07 ` Luis Machado
2017-01-18 15:44 ` [PATCH v2 5/6] Share fork_inferior et al " Sergio Durigan Junior
2017-02-01 21:39 ` Luis Machado
2017-02-07 22:23 ` Sergio Durigan Junior
2017-01-26 22:47 ` [PATCH v2] Implement the ability to start inferiors with a shell on gdbserver Sergio Durigan Junior
2017-01-27 7:45 ` Eli Zaretskii
2017-01-27 17:59 ` Sergio Durigan Junior
2017-02-08 3:25 ` [PATCH v3 0/6] " Sergio Durigan Junior
2017-02-08 3:25 ` [PATCH v3 2/6] Share parts of gdb/terminal.h with gdbserver Sergio Durigan Junior
2017-02-15 15:54 ` Pedro Alves
2017-02-16 21:37 ` Sergio Durigan Junior
2017-02-08 3:25 ` [PATCH v3 1/6] Share gdb/environ.[ch] " Sergio Durigan Junior
2017-02-15 15:36 ` Pedro Alves
2017-03-07 20:50 ` Sergio Durigan Junior
2017-02-08 3:25 ` [PATCH v3 3/6] Share parts of gdb/inflow.c " Sergio Durigan Junior
2017-02-15 16:02 ` Pedro Alves
2017-02-16 22:06 ` Sergio Durigan Junior
2017-02-08 3:32 ` [PATCH v3 5/6] Share fork_inferior et al " Sergio Durigan Junior
2017-02-15 17:28 ` Pedro Alves [this message]
2017-02-16 12:23 ` Philipp Rudo
2017-02-16 12:26 ` Pedro Alves
2017-02-16 12:37 ` Philipp Rudo
[not found] ` <87bmtcg91v.fsf@redhat.com>
2017-03-13 15:34 ` Pedro Alves
2017-02-08 3:33 ` [PATCH v3 4/6] Share parts of gdb/gdbthread.h " Sergio Durigan Junior
2017-02-15 16:15 ` Pedro Alves
2017-02-21 21:27 ` Sergio Durigan Junior
2017-02-08 3:33 ` [PATCH v3 6/6] Implement proper "startup-with-shell" support on gdbserver Sergio Durigan Junior
2017-02-08 17:34 ` Eli Zaretskii
2017-02-09 0:02 ` Sergio Durigan Junior
2017-02-17 16:05 ` Pedro Alves
2017-02-17 16:27 ` Eli Zaretskii
2017-03-07 20:59 ` Sergio Durigan Junior
2017-03-13 15:12 ` Pedro Alves
2017-02-13 19:50 ` [PATCH v3 0/6] Implement the ability to start inferiors with a shell " Sergio Durigan Junior
2017-03-08 5:29 ` [PATCH v4 0/5] " Sergio Durigan Junior
2017-03-08 5:29 ` [PATCH v4 1/5] Share parts of gdb/terminal.h with gdbserver Sergio Durigan Junior
2017-03-08 5:29 ` [PATCH v4 3/5] Share parts of gdb/gdbthread.h " Sergio Durigan Junior
2017-03-08 5:29 ` [PATCH v4 5/5] Implement proper "startup-with-shell" support on gdbserver Sergio Durigan Junior
2017-03-08 15:49 ` Eli Zaretskii
2017-03-13 17:26 ` Pedro Alves
2017-03-08 5:29 ` [PATCH v4 4/5] Share fork_inferior et al with gdbserver Sergio Durigan Junior
2017-03-13 17:04 ` Pedro Alves
2017-03-17 1:02 ` Sergio Durigan Junior
2017-03-17 10:27 ` Pedro Alves
2017-03-08 5:29 ` [PATCH v4 2/5] Share parts of gdb/inflow.c " Sergio Durigan Junior
2017-03-30 1:50 ` [PATCH v5 0/5] Implement the ability to start inferiors with a shell on gdbserver Sergio Durigan Junior
2017-03-30 1:50 ` [PATCH v5 2/5] Share parts of gdb/gdbthread.h with gdbserver Sergio Durigan Junior
2017-03-31 17:15 ` Pedro Alves
2017-04-07 2:53 ` Sergio Durigan Junior
2017-03-30 1:50 ` [PATCH v5 3/5] C++-fy and prepare for sharing fork_inferior Sergio Durigan Junior
2017-04-07 18:30 ` Pedro Alves
2017-04-12 0:24 ` Sergio Durigan Junior
2017-04-12 5:04 ` Sergio Durigan Junior
2017-04-12 5:19 ` [obv/commit] Fix build breakage from last commit (window-nat.c:windows_create_inferior) Sergio Durigan Junior
2017-04-12 10:14 ` [PATCH] fork-child.c: Avoid unnecessary heap-allocation / string copying (Re: [PATCH v5 3/5] C++-fy and prepare for sharing fork_inferior) Pedro Alves
2017-04-12 22:26 ` Sergio Durigan Junior
2017-04-13 3:42 ` Pedro Alves
2017-04-13 4:33 ` Sergio Durigan Junior
2017-04-13 10:51 ` Pedro Alves
2017-04-13 18:30 ` Sergio Durigan Junior
2017-04-14 1:03 ` [obv/commit] Fix build breakage on Cygwin (PR gdb/21385) Sergio Durigan Junior
2017-03-30 1:50 ` [PATCH v5 1/5] Move parts of inferior job control to common/ Sergio Durigan Junior
2017-03-31 17:11 ` Pedro Alves
2017-03-31 17:31 ` Sergio Durigan Junior
2017-03-31 18:21 ` Pedro Alves
2017-03-31 21:20 ` Sergio Durigan Junior
2017-04-07 17:51 ` Pedro Alves
2017-04-12 0:25 ` Sergio Durigan Junior
2017-04-12 1:17 ` [PATCH] Create gdb_termios.h (and cleanup gdb/{,gdbserver/}terminal.h) Sergio Durigan Junior
2017-04-12 10:28 ` Pedro Alves
2017-04-12 22:00 ` Sergio Durigan Junior
2017-03-30 1:55 ` [PATCH v5 4/5] Share fork_inferior et al with gdbserver Sergio Durigan Junior
2017-03-30 1:55 ` [PATCH v5 5/5] Implement proper "startup-with-shell" support on gdbserver Sergio Durigan Junior
2017-05-04 5:31 ` [PATCH v6 0/4] Implement the ability to start inferiors with a shell " Sergio Durigan Junior
2017-05-04 5:32 ` [PATCH v6 3/4] Share fork_inferior et al with gdbserver Sergio Durigan Junior
2017-05-05 19:05 ` Pedro Alves
2017-05-31 3:43 ` Sergio Durigan Junior
2017-06-07 10:16 ` Pedro Alves
2017-06-07 12:23 ` Pedro Alves
2017-06-07 21:01 ` Sergio Durigan Junior
2017-06-07 21:06 ` Pedro Alves
2017-06-07 21:00 ` Sergio Durigan Junior
2017-05-04 5:32 ` [PATCH v6 1/4] Move parts of inferior job control to common/ Sergio Durigan Junior
2017-05-04 5:32 ` [PATCH v6 2/4] Share parts of gdb/gdbthread.h with gdbserver Sergio Durigan Junior
2017-05-05 19:04 ` Pedro Alves
2017-05-06 14:15 ` Sergio Durigan Junior
2017-05-04 5:38 ` [PATCH v6 4/4] Implement proper "startup-with-shell" support on gdbserver Sergio Durigan Junior
2017-05-05 19:21 ` Pedro Alves
2017-06-04 22:18 ` [PATCH v7 0/4] Implement the ability to start inferiors with a shell " Sergio Durigan Junior
2017-06-04 22:18 ` [PATCH v7 4/4] Implement proper "startup-with-shell" support " Sergio Durigan Junior
2017-06-05 2:31 ` Eli Zaretskii
2017-06-04 22:18 ` [PATCH v7 2/4] Share parts of gdb/gdbthread.h with gdbserver Sergio Durigan Junior
2017-06-04 22:18 ` [PATCH v7 3/4] Share fork_inferior et al " Sergio Durigan Junior
2017-06-07 12:29 ` Pedro Alves
2017-06-07 21:06 ` Sergio Durigan Junior
2017-06-07 21:41 ` Sergio Durigan Junior
2017-06-07 22:05 ` Pedro Alves
2017-06-07 22:08 ` Sergio Durigan Junior
2017-06-07 22:14 ` Pedro Alves
2017-06-07 22:15 ` Sergio Durigan Junior
2017-06-07 22:29 ` Pedro Alves
2017-06-08 0:00 ` Sergio Durigan Junior
2019-02-14 15:38 ` Thomas Schwinge
2017-06-08 16:40 ` Yao Qi
2017-06-08 18:49 ` Sergio Durigan Junior
2017-06-08 21:02 ` [commit/obvious] Fix possible bug when no args have been provided to the executable Sergio Durigan Junior
2017-06-09 22:19 ` [commit/obvious] Include <signal.h> on gdbserver/fork-child.c (and fix regressions) Sergio Durigan Junior
2017-06-21 17:01 ` [PATCH v7 3/4] Share fork_inferior et al with gdbserver Simon Marchi
2017-06-21 17:19 ` Sergio Durigan Junior
2017-06-04 22:18 ` [PATCH v7 1/4] Move parts of inferior job control to common/ Sergio Durigan Junior
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a8f84e39-cf7f-4778-1e0e-0dfe4f00f3da@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=lgustavo@codesourcery.com \
--cc=sergiodj@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox