* [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option.
@ 2013-10-23 12:40 Pedro Alves
2013-10-23 13:38 ` Gary Benson
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: Pedro Alves @ 2013-10-23 12:40 UTC (permalink / raw)
To: gdb-patches
Occasionaly we hear about people having problems with GDB not being
able to start programs (with "run"/"start"). GDB spawns a shell to
start the program, and most often, it'll be the case that the problem
is actually with the user's shell setup.
GDB has code to disable the use of the shell to start programs.
That's the STARTUP_WITH_SHELL macro that native targets could set to 0
in their nm.h file (though no target actually uses it nowadays).
This patch makes that setting a run-time knob instead. This will be
useful to quickly diagnose such shell issues, and might also come in
handy at other times (such as when debugging the shell itself, if you
don't have a different shell handy).
Comments? Are the docs OK?
gdb/
2013-10-23 Pedro Alves <palves@redhat.com>
* NEWS (New options): Mention set/show startup-with-shell.
* config/alpha/nm-osf3.h (START_INFERIOR_TRAPS_EXPECTED): Set to 2
instead of 3.
* fork-child.c (fork_inferior, startup_inferior): Handle 'set
startup-with-shell'.
(show_startup_with_shell): New function.
(_initialize_fork_child): Register the set/show startup-with-shell
commands.
* inf-ptrace.c (inf_ptrace_create_inferior): Remove comment.
* inf-ttrace.c (inf_ttrace_him): Remove comment.
* procfs.c (procfs_init_inferior): Remove comment.
* infcmd.c (startup_with_shell): New global.
* inferior.h (startup_with_shell): Declare global.
(STARTUP_WITH_SHELL): Delete.
(START_INFERIOR_TRAPS_EXPECTED): Set to 1 by default instead of 2.
gdb/doc/
2013-10-23 Pedro Alves <palves@redhat.com>
* gdb.texinfo (Starting): Document set/show startup-with-shell.
---
gdb/NEWS | 5 +++++
gdb/config/alpha/nm-osf3.h | 9 +++++----
gdb/doc/gdb.texinfo | 31 +++++++++++++++++++++++++++++--
gdb/fork-child.c | 31 +++++++++++++++++++++++++++----
gdb/inf-ptrace.c | 3 ---
gdb/inf-ttrace.c | 3 ---
gdb/infcmd.c | 6 +++++-
gdb/inferior.h | 42 ++++++++++++++++++++++++------------------
gdb/procfs.c | 2 --
9 files changed, 95 insertions(+), 37 deletions(-)
diff --git a/gdb/NEWS b/gdb/NEWS
index 10834df..6eb5090 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -98,6 +98,11 @@ set range-stepping
show range-stepping
Control whether target-assisted range stepping is enabled.
+set startup-with-shell
+show startup-with-shell
+ Specifies whether Unix child processes are started via a shell or
+ directly.
+
* You can now use a literal value 'unlimited' for options that
interpret 0 or -1 as meaning "unlimited". E.g., "set
trace-buffer-size unlimited" is now an alias for "set
diff --git a/gdb/config/alpha/nm-osf3.h b/gdb/config/alpha/nm-osf3.h
index b3a082d..7dd278a 100644
--- a/gdb/config/alpha/nm-osf3.h
+++ b/gdb/config/alpha/nm-osf3.h
@@ -16,10 +16,11 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-/* Number of traps that happen between exec'ing the shell
- to run an inferior, and when we finally get to
- the inferior code. This is 2 on most implementations. */
-#define START_INFERIOR_TRAPS_EXPECTED 3
+/* Number of traps that happen between exec'ing the shell to run an
+ inferior, and when we finally get to the inferior code, not
+ counting the exec for the shell. This is 1 on most
+ implementations. */
+#define START_INFERIOR_TRAPS_EXPECTED 2
/* Don't trace faults under OSF/1, rely on the posting of the appropriate
signal if fault tracing is disabled.
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 44fb174..cf4a7c4 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -2011,8 +2011,10 @@ is used to pass the arguments, so that you may use normal conventions
(such as wildcard expansion or variable substitution) in describing
the arguments.
In Unix systems, you can control which shell is used with the
-@code{SHELL} environment variable.
-@xref{Arguments, ,Your Program's Arguments}.
+@code{SHELL} environment variable. If you do not define @code{SHELL},
+@value{GDBN} uses the default shell (@file{/bin/sh}). You can disable
+use of any shell with the @code{set startup-with-shell} command (see
+below for details).
@item The @emph{environment.}
Your program normally inherits its environment from @value{GDBN}, but you can
@@ -2115,6 +2117,31 @@ environment:
This command is available when debugging locally on most targets, excluding
@sc{djgpp}, Cygwin, MS Windows, and QNX Neutrino.
+@kindex set startup-with-shell
+@item set startup-with-shell
+@itemx set startup-with-shell on
+@itemx set startup-with-shell off
+@itemx show set startup-with-shell
+On Unix systems, by default, if a shell is available on your target,
+it is used to pass the arguments of the @code{run} commands to your
+program, so that you may use normal conventions (such as wildcard
+expansion or variable substitution) in describing the arguments.
+However, in some circunstances, it may be useful to disable such use
+of a shell. For example, if you're debugging the shell itself. Or,
+to help diagnose program startup failures such as:
+
+@smallexample
+(@value{GDBP}) During startup program terminated with signal SIGSEGV, Segmentation fault.
+@end smallexample
+
+@noindent
+which indicates the shell or the wrapper specified with
+@samp{exec-wrapper} crashed, not your program. Most often, this is
+caused by something odd in your shell's initialization file---such as
+@file{.cshrc} for C-shell, or @file{.bashrc} for BASH. To help
+diagnose such issues, you can disable use of a shell with @kbd{set
+startup-with-shell off}.
+
@kindex set disable-randomization
@item set disable-randomization
@itemx set disable-randomization on
diff --git a/gdb/fork-child.c b/gdb/fork-child.c
index 6820872..ea78ce0 100644
--- a/gdb/fork-child.c
+++ b/gdb/fork-child.c
@@ -150,11 +150,11 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env,
if (exec_file == 0)
exec_file = get_exec_file (1);
- /* STARTUP_WITH_SHELL is defined in inferior.h. If 0,e we'll just
- do a fork/exec, no shell, so don't bother figuring out what
- shell. */
+ /* 'startup_with_shell' is declared in inferior.h, and bound to the
+ "set startup-with-shell" option. If 0, we'll just do a
+ fork/exec, no shell, so don't bother figuring out what shell. */
shell_file = shell_file_arg;
- if (STARTUP_WITH_SHELL)
+ if (startup_with_shell)
{
/* Figure out what shell to start up the user program under. */
if (shell_file == NULL)
@@ -419,6 +419,12 @@ startup_inferior (int ntraps)
int terminal_initted = 0;
ptid_t resume_ptid;
+ if (startup_with_shell)
+ {
+ /* One trap extra for exec'ing the shell. */
+ pending_execs++;
+ }
+
if (target_supports_multi_process ())
resume_ptid = pid_to_ptid (ptid_get_pid (inferior_ptid));
else
@@ -533,6 +539,15 @@ unset_exec_wrapper_command (char *args, int from_tty)
exec_wrapper = NULL;
}
+static void
+show_startup_with_shell (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ fprintf_filtered (file,
+ _("Use of shell to start subprocesses is %s.\n"),
+ value);
+}
+
/* Provide a prototype to silence -Wmissing-prototypes. */
extern initialize_file_ftype _initialize_fork_child;
@@ -550,4 +565,12 @@ Show the wrapper for running programs."), NULL,
add_cmd ("exec-wrapper", class_run, unset_exec_wrapper_command,
_("Disable use of an execution wrapper."),
&unsetlist);
+
+ add_setshow_boolean_cmd ("startup-with-shell", class_support,
+ &startup_with_shell, _("\
+Set use of shell to start subprocesses. The default is on."), _("\
+Show use of shell to start subprocesses."), NULL,
+ NULL,
+ show_startup_with_shell,
+ &setlist, &showlist);
}
diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c
index 9e6e980..bdebe65 100644
--- a/gdb/inf-ptrace.c
+++ b/gdb/inf-ptrace.c
@@ -137,9 +137,6 @@ inf_ptrace_create_inferior (struct target_ops *ops,
discard_cleanups (back_to);
- /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h, and will
- be 1 or 2 depending on whether we're starting without or with a
- shell. */
startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
/* On some targets, there must be some explicit actions taken after
diff --git a/gdb/inf-ttrace.c b/gdb/inf-ttrace.c
index 3ba830f..36bf4cb 100644
--- a/gdb/inf-ttrace.c
+++ b/gdb/inf-ttrace.c
@@ -642,9 +642,6 @@ inf_ttrace_him (struct target_ops *ops, int pid)
push_target (ops);
- /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h, and will
- be 1 or 2 depending on whether we're starting without or with a
- shell. */
startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
/* On some targets, there must be some explicit actions taken after
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 20f8857..4ad8ad3 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -147,6 +147,10 @@ enum stop_stack_kind stop_stack_dummy;
int stopped_by_random_signal;
+/* See inferior.h. */
+
+int startup_with_shell = 1;
+
\f
/* Accessor routines. */
@@ -255,7 +259,7 @@ construct_inferior_arguments (int argc, char **argv)
{
char *result;
- if (STARTUP_WITH_SHELL)
+ if (startup_with_shell)
{
#ifdef __MINGW32__
/* This holds all the characters considered special to the
diff --git a/gdb/inferior.h b/gdb/inferior.h
index fff072b..cf26844 100644
--- a/gdb/inferior.h
+++ b/gdb/inferior.h
@@ -257,6 +257,25 @@ extern void notice_new_inferior (ptid_t, int, int);
extern struct value *get_return_value (struct value *function,
struct type *value_type);
+/* Whether to start up the debuggee under a shell.
+
+ If startup-with-shell is set, GDB's "run" will attempt to start up
+ the debuggee under a shell.
+
+ This is in order for argument-expansion to occur. E.g.,
+
+ (gdb) run *
+
+ The "*" gets expanded by the shell into a list of files.
+
+ While this is a nice feature, it may be handy to bypass the shell
+ in some cases. To disable this feature, do "set startup-with-shell
+ false".
+
+ The catch-exec traps expected during start-up will be one more if
+ the target is started up with a shell. */
+extern int startup_with_shell;
+
/* Address at which inferior stopped. */
extern CORE_ADDR stop_pc;
@@ -346,25 +365,12 @@ struct displaced_step_closure *get_displaced_step_closure_by_addr (CORE_ADDR add
#define ON_STACK 1
#define AT_ENTRY_POINT 4
-/* If STARTUP_WITH_SHELL is set, GDB's "run"
- will attempts to start up the debugee under a shell.
- This is in order for argument-expansion to occur. E.g.,
- (gdb) run *
- The "*" gets expanded by the shell into a list of files.
- While this is a nice feature, it turns out to interact badly
- with some of the catch-fork/catch-exec features we have added.
- In particular, if the shell does any fork/exec's before
- the exec of the target program, that can confuse GDB.
- To disable this feature, set STARTUP_WITH_SHELL to 0.
- To enable this feature, set STARTUP_WITH_SHELL to 1.
- The catch-exec traps expected during start-up will
- be 1 if target is not started up with a shell, 2 if it is.
- - RT
- If you disable this, you need to decrement
- START_INFERIOR_TRAPS_EXPECTED in tm.h. */
-#define STARTUP_WITH_SHELL 1
+/* Number of traps that happen between exec'ing the shell to run an
+ inferior, and when we finally get to the inferior code, not
+ counting the exec for the shell. This is 1 on most
+ implementations. Overridden in nm.h files. */
#if !defined(START_INFERIOR_TRAPS_EXPECTED)
-#define START_INFERIOR_TRAPS_EXPECTED 2
+#define START_INFERIOR_TRAPS_EXPECTED 1
#endif
struct private_inferior;
diff --git a/gdb/procfs.c b/gdb/procfs.c
index 5a425ed..e013096 100644
--- a/gdb/procfs.c
+++ b/gdb/procfs.c
@@ -4451,8 +4451,6 @@ procfs_init_inferior (struct target_ops *ops, int pid)
thread_change_ptid (pid_to_ptid (pid),
ptid_build (pid, lwpid, 0));
- /* Typically two, one trap to exec the shell, one to exec the
- program being debugged. Defined by "inferior.h". */
startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
#ifdef SYS_syssgi
--
1.7.11.7
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option.
2013-10-23 12:40 [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option Pedro Alves
@ 2013-10-23 13:38 ` Gary Benson
2013-10-23 13:41 ` Andreas Schwab
2013-10-23 15:38 ` [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option Eli Zaretskii
2 siblings, 0 replies; 12+ messages in thread
From: Gary Benson @ 2013-10-23 13:38 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
Pedro Alves wrote:
> Occasionaly we hear about people having problems with GDB not being
> able to start programs (with "run"/"start"). GDB spawns a shell to
> start the program, and most often, it'll be the case that the problem
> is actually with the user's shell setup.
>
> GDB has code to disable the use of the shell to start programs.
> That's the STARTUP_WITH_SHELL macro that native targets could set to 0
> in their nm.h file (though no target actually uses it nowadays).
>
> This patch makes that setting a run-time knob instead. This will be
> useful to quickly diagnose such shell issues, and might also come in
> handy at other times (such as when debugging the shell itself, if you
> don't have a different shell handy).
>
> Comments? Are the docs OK?
It's a good idea. And the docs seem fine to me.
Cheers,
Gary
--
http://gbenson.net/
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option.
2013-10-23 12:40 [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option Pedro Alves
2013-10-23 13:38 ` Gary Benson
@ 2013-10-23 13:41 ` Andreas Schwab
2013-10-23 14:49 ` Pedro Alves
2013-10-23 15:38 ` [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option Eli Zaretskii
2 siblings, 1 reply; 12+ messages in thread
From: Andreas Schwab @ 2013-10-23 13:41 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
Pedro Alves <palves@redhat.com> writes:
> +which indicates the shell or the wrapper specified with
> +@samp{exec-wrapper} crashed, not your program. Most often, this is
> +caused by something odd in your shell's initialization file---such as
> +@file{.cshrc} for C-shell, or @file{.bashrc} for BASH. To help
FWIW, when started non-interactively, bash does not read .bashrc.
Andreas.
--
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option.
2013-10-23 13:41 ` Andreas Schwab
@ 2013-10-23 14:49 ` Pedro Alves
2013-10-25 11:11 ` [PATCH] [DOC] shell startup files, clarifications and fixes. (was: Re: [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option.) Pedro Alves
0 siblings, 1 reply; 12+ messages in thread
From: Pedro Alves @ 2013-10-23 14:49 UTC (permalink / raw)
To: Andreas Schwab; +Cc: gdb-patches
On 10/23/2013 02:41 PM, Andreas Schwab wrote:
> Pedro Alves <palves@redhat.com> writes:
>
>> +which indicates the shell or the wrapper specified with
>> +@samp{exec-wrapper} crashed, not your program. Most often, this is
>> +caused by something odd in your shell's initialization file---such as
>> +@file{.cshrc} for C-shell, or @file{.bashrc} for BASH. To help
>
> FWIW, when started non-interactively, bash does not read .bashrc.
Eh, yeah, thanks for noticing. I copied that from further below without
thinking about that:
@emph{Warning:} On Unix systems, @value{GDBN} runs your program using
the shell indicated
by your @code{SHELL} environment variable if it exists (or
@code{/bin/sh} if not). If your @code{SHELL} variable names a shell
that runs an initialization file---such as @file{.cshrc} for C-shell, or
@file{.bashrc} for BASH---any variables you set in that file affect
your program. You may wish to move setting of environment variables to
files that are only run when you sign on, such as @file{.login} or
@file{.profile}.
So that's wrong too. I'll fix it as a follow up if the change below
is OK.
(Now that I think about it, I think whenever people report
issues like these, they're not using bash.)
I've added this change on top:
diff --git i/gdb/doc/gdb.texinfo w/gdb/doc/gdb.texinfo
index cf4a7c4..d7a1318 100644
--- i/gdb/doc/gdb.texinfo
+++ w/gdb/doc/gdb.texinfo
@@ -2138,9 +2138,10 @@ to help diagnose program startup failures such as:
which indicates the shell or the wrapper specified with
@samp{exec-wrapper} crashed, not your program. Most often, this is
caused by something odd in your shell's initialization file---such as
-@file{.cshrc} for C-shell, or @file{.bashrc} for BASH. To help
-diagnose such issues, you can disable use of a shell with @kbd{set
-startup-with-shell off}.
+@file{.cshrc} for C-shell, $@file{.zshenv} for the Z shell, or the
+file specified in the @samp{BASH_ENV} environment variable for BASH.
+To help diagnose such issues, you can disable use of a shell with
+@kbd{set startup-with-shell off}.
Below's the full updated patch.
---
Subject: [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new
"set/show startup-with-shell" option.
Occasionaly we hear about people having problems with GDB not being
able to start programs (with "run"/"start"). GDB spawns a shell to
start the program, and most often, it'll be the case that the problem
is actually with the user's shell setup.
GDB has code to disable the use of the shell to start programs.
That's the STARTUP_WITH_SHELL macro that native targets could set to 0
in their nm.h file (though no target actually uses it nowadays).
This patch makes that setting a run-time knob instead. This will be
useful to quickly diagnose such shell issues, and might also come in
handy at other times (such as when debugging the shell itself, if you
don't have a different shell handy).
gdb/
2013-10-23 Pedro Alves <palves@redhat.com>
* NEWS (New options): Mention set/show startup-with-shell.
* config/alpha/nm-osf3.h (START_INFERIOR_TRAPS_EXPECTED): Set to 2
instead of 3.
* fork-child.c (fork_inferior, startup_inferior): Handle 'set
startup-with-shell'.
(show_startup_with_shell): New function.
(_initialize_fork_child): Register the set/show startup-with-shell
commands.
* inf-ptrace.c (inf_ptrace_create_inferior): Remove comment.
* inf-ttrace.c (inf_ttrace_him): Remove comment.
* procfs.c (procfs_init_inferior): Remove comment.
* infcmd.c (startup_with_shell): New global.
* inferior.h (startup_with_shell): Declare global.
(STARTUP_WITH_SHELL): Delete.
(START_INFERIOR_TRAPS_EXPECTED): Set to 1 by default instead of 2.
gdb/doc/
2013-10-23 Pedro Alves <palves@redhat.com>
* gdb.texinfo (Starting): Document set/show startup-with-shell.
---
gdb/NEWS | 5 +++++
gdb/config/alpha/nm-osf3.h | 9 +++++----
gdb/doc/gdb.texinfo | 32 ++++++++++++++++++++++++++++++--
gdb/fork-child.c | 31 +++++++++++++++++++++++++++----
gdb/inf-ptrace.c | 3 ---
gdb/inf-ttrace.c | 3 ---
gdb/infcmd.c | 6 +++++-
gdb/inferior.h | 42 ++++++++++++++++++++++++------------------
gdb/procfs.c | 2 --
9 files changed, 96 insertions(+), 37 deletions(-)
diff --git a/gdb/NEWS b/gdb/NEWS
index 10834df..6eb5090 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -98,6 +98,11 @@ set range-stepping
show range-stepping
Control whether target-assisted range stepping is enabled.
+set startup-with-shell
+show startup-with-shell
+ Specifies whether Unix child processes are started via a shell or
+ directly.
+
* You can now use a literal value 'unlimited' for options that
interpret 0 or -1 as meaning "unlimited". E.g., "set
trace-buffer-size unlimited" is now an alias for "set
diff --git a/gdb/config/alpha/nm-osf3.h b/gdb/config/alpha/nm-osf3.h
index b3a082d..7dd278a 100644
--- a/gdb/config/alpha/nm-osf3.h
+++ b/gdb/config/alpha/nm-osf3.h
@@ -16,10 +16,11 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-/* Number of traps that happen between exec'ing the shell
- to run an inferior, and when we finally get to
- the inferior code. This is 2 on most implementations. */
-#define START_INFERIOR_TRAPS_EXPECTED 3
+/* Number of traps that happen between exec'ing the shell to run an
+ inferior, and when we finally get to the inferior code, not
+ counting the exec for the shell. This is 1 on most
+ implementations. */
+#define START_INFERIOR_TRAPS_EXPECTED 2
/* Don't trace faults under OSF/1, rely on the posting of the appropriate
signal if fault tracing is disabled.
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 44fb174..e3dc706 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -2011,8 +2011,10 @@ is used to pass the arguments, so that you may use normal conventions
(such as wildcard expansion or variable substitution) in describing
the arguments.
In Unix systems, you can control which shell is used with the
-@code{SHELL} environment variable.
-@xref{Arguments, ,Your Program's Arguments}.
+@code{SHELL} environment variable. If you do not define @code{SHELL},
+@value{GDBN} uses the default shell (@file{/bin/sh}). You can disable
+use of any shell with the @code{set startup-with-shell} command (see
+below for details).
@item The @emph{environment.}
Your program normally inherits its environment from @value{GDBN}, but you can
@@ -2115,6 +2117,32 @@ environment:
This command is available when debugging locally on most targets, excluding
@sc{djgpp}, Cygwin, MS Windows, and QNX Neutrino.
+@kindex set startup-with-shell
+@item set startup-with-shell
+@itemx set startup-with-shell on
+@itemx set startup-with-shell off
+@itemx show set startup-with-shell
+On Unix systems, by default, if a shell is available on your target,
+it is used to pass the arguments of the @code{run} commands to your
+program, so that you may use normal conventions (such as wildcard
+expansion or variable substitution) in describing the arguments.
+However, in some circunstances, it may be useful to disable such use
+of a shell. For example, if you're debugging the shell itself. Or,
+to help diagnose program startup failures such as:
+
+@smallexample
+(@value{GDBP}) During startup program terminated with signal SIGSEGV, Segmentation fault.
+@end smallexample
+
+@noindent
+which indicates the shell or the wrapper specified with
+@samp{exec-wrapper} crashed, not your program. Most often, this is
+caused by something odd in your shell's initialization file---such as
+@file{.cshrc} for C-shell, $@file{.zshenv} for the Z shell, or the
+file specified in the @samp{BASH_ENV} environment variable for BASH.
+To help diagnose such issues, you can disable use of a shell with
+@kbd{set startup-with-shell off}.
+
@kindex set disable-randomization
@item set disable-randomization
@itemx set disable-randomization on
diff --git a/gdb/fork-child.c b/gdb/fork-child.c
index 6820872..ea78ce0 100644
--- a/gdb/fork-child.c
+++ b/gdb/fork-child.c
@@ -150,11 +150,11 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env,
if (exec_file == 0)
exec_file = get_exec_file (1);
- /* STARTUP_WITH_SHELL is defined in inferior.h. If 0,e we'll just
- do a fork/exec, no shell, so don't bother figuring out what
- shell. */
+ /* 'startup_with_shell' is declared in inferior.h, and bound to the
+ "set startup-with-shell" option. If 0, we'll just do a
+ fork/exec, no shell, so don't bother figuring out what shell. */
shell_file = shell_file_arg;
- if (STARTUP_WITH_SHELL)
+ if (startup_with_shell)
{
/* Figure out what shell to start up the user program under. */
if (shell_file == NULL)
@@ -419,6 +419,12 @@ startup_inferior (int ntraps)
int terminal_initted = 0;
ptid_t resume_ptid;
+ if (startup_with_shell)
+ {
+ /* One trap extra for exec'ing the shell. */
+ pending_execs++;
+ }
+
if (target_supports_multi_process ())
resume_ptid = pid_to_ptid (ptid_get_pid (inferior_ptid));
else
@@ -533,6 +539,15 @@ unset_exec_wrapper_command (char *args, int from_tty)
exec_wrapper = NULL;
}
+static void
+show_startup_with_shell (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ fprintf_filtered (file,
+ _("Use of shell to start subprocesses is %s.\n"),
+ value);
+}
+
/* Provide a prototype to silence -Wmissing-prototypes. */
extern initialize_file_ftype _initialize_fork_child;
@@ -550,4 +565,12 @@ Show the wrapper for running programs."), NULL,
add_cmd ("exec-wrapper", class_run, unset_exec_wrapper_command,
_("Disable use of an execution wrapper."),
&unsetlist);
+
+ add_setshow_boolean_cmd ("startup-with-shell", class_support,
+ &startup_with_shell, _("\
+Set use of shell to start subprocesses. The default is on."), _("\
+Show use of shell to start subprocesses."), NULL,
+ NULL,
+ show_startup_with_shell,
+ &setlist, &showlist);
}
diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c
index 9e6e980..bdebe65 100644
--- a/gdb/inf-ptrace.c
+++ b/gdb/inf-ptrace.c
@@ -137,9 +137,6 @@ inf_ptrace_create_inferior (struct target_ops *ops,
discard_cleanups (back_to);
- /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h, and will
- be 1 or 2 depending on whether we're starting without or with a
- shell. */
startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
/* On some targets, there must be some explicit actions taken after
diff --git a/gdb/inf-ttrace.c b/gdb/inf-ttrace.c
index 3ba830f..36bf4cb 100644
--- a/gdb/inf-ttrace.c
+++ b/gdb/inf-ttrace.c
@@ -642,9 +642,6 @@ inf_ttrace_him (struct target_ops *ops, int pid)
push_target (ops);
- /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h, and will
- be 1 or 2 depending on whether we're starting without or with a
- shell. */
startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
/* On some targets, there must be some explicit actions taken after
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 20f8857..4ad8ad3 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -147,6 +147,10 @@ enum stop_stack_kind stop_stack_dummy;
int stopped_by_random_signal;
+/* See inferior.h. */
+
+int startup_with_shell = 1;
+
\f
/* Accessor routines. */
@@ -255,7 +259,7 @@ construct_inferior_arguments (int argc, char **argv)
{
char *result;
- if (STARTUP_WITH_SHELL)
+ if (startup_with_shell)
{
#ifdef __MINGW32__
/* This holds all the characters considered special to the
diff --git a/gdb/inferior.h b/gdb/inferior.h
index fff072b..cf26844 100644
--- a/gdb/inferior.h
+++ b/gdb/inferior.h
@@ -257,6 +257,25 @@ extern void notice_new_inferior (ptid_t, int, int);
extern struct value *get_return_value (struct value *function,
struct type *value_type);
+/* Whether to start up the debuggee under a shell.
+
+ If startup-with-shell is set, GDB's "run" will attempt to start up
+ the debuggee under a shell.
+
+ This is in order for argument-expansion to occur. E.g.,
+
+ (gdb) run *
+
+ The "*" gets expanded by the shell into a list of files.
+
+ While this is a nice feature, it may be handy to bypass the shell
+ in some cases. To disable this feature, do "set startup-with-shell
+ false".
+
+ The catch-exec traps expected during start-up will be one more if
+ the target is started up with a shell. */
+extern int startup_with_shell;
+
/* Address at which inferior stopped. */
extern CORE_ADDR stop_pc;
@@ -346,25 +365,12 @@ struct displaced_step_closure *get_displaced_step_closure_by_addr (CORE_ADDR add
#define ON_STACK 1
#define AT_ENTRY_POINT 4
-/* If STARTUP_WITH_SHELL is set, GDB's "run"
- will attempts to start up the debugee under a shell.
- This is in order for argument-expansion to occur. E.g.,
- (gdb) run *
- The "*" gets expanded by the shell into a list of files.
- While this is a nice feature, it turns out to interact badly
- with some of the catch-fork/catch-exec features we have added.
- In particular, if the shell does any fork/exec's before
- the exec of the target program, that can confuse GDB.
- To disable this feature, set STARTUP_WITH_SHELL to 0.
- To enable this feature, set STARTUP_WITH_SHELL to 1.
- The catch-exec traps expected during start-up will
- be 1 if target is not started up with a shell, 2 if it is.
- - RT
- If you disable this, you need to decrement
- START_INFERIOR_TRAPS_EXPECTED in tm.h. */
-#define STARTUP_WITH_SHELL 1
+/* Number of traps that happen between exec'ing the shell to run an
+ inferior, and when we finally get to the inferior code, not
+ counting the exec for the shell. This is 1 on most
+ implementations. Overridden in nm.h files. */
#if !defined(START_INFERIOR_TRAPS_EXPECTED)
-#define START_INFERIOR_TRAPS_EXPECTED 2
+#define START_INFERIOR_TRAPS_EXPECTED 1
#endif
struct private_inferior;
diff --git a/gdb/procfs.c b/gdb/procfs.c
index 5a425ed..e013096 100644
--- a/gdb/procfs.c
+++ b/gdb/procfs.c
@@ -4451,8 +4451,6 @@ procfs_init_inferior (struct target_ops *ops, int pid)
thread_change_ptid (pid_to_ptid (pid),
ptid_build (pid, lwpid, 0));
- /* Typically two, one trap to exec the shell, one to exec the
- program being debugged. Defined by "inferior.h". */
startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
#ifdef SYS_syssgi
--
1.7.11.7
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option.
2013-10-23 12:40 [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option Pedro Alves
2013-10-23 13:38 ` Gary Benson
2013-10-23 13:41 ` Andreas Schwab
@ 2013-10-23 15:38 ` Eli Zaretskii
2013-10-24 15:17 ` Pedro Alves
2 siblings, 1 reply; 12+ messages in thread
From: Eli Zaretskii @ 2013-10-23 15:38 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
> From: Pedro Alves <palves@redhat.com>
> Date: Wed, 23 Oct 2013 13:40:24 +0100
>
> Occasionaly we hear about people having problems with GDB not being
> able to start programs (with "run"/"start"). GDB spawns a shell to
> start the program, and most often, it'll be the case that the problem
> is actually with the user's shell setup.
>
> GDB has code to disable the use of the shell to start programs.
> That's the STARTUP_WITH_SHELL macro that native targets could set to 0
> in their nm.h file (though no target actually uses it nowadays).
>
> This patch makes that setting a run-time knob instead. This will be
> useful to quickly diagnose such shell issues, and might also come in
> handy at other times (such as when debugging the shell itself, if you
> don't have a different shell handy).
Thanks.
> Comments? Are the docs OK?
The docs are OK with a few comments.
> +@smallexample
> +(@value{GDBP}) During startup program terminated with signal SIGSEGV, Segmentation fault.
> +@end smallexample
This line is too long, it will cause overflow of the page boundaries.
> +which indicates the shell or the wrapper specified with
> +@samp{exec-wrapper} crashed, not your program. Most often, this is
> +caused by something odd in your shell's initialization file---such as
> +@file{.cshrc} for C-shell, or @file{.bashrc} for BASH. To help
> +diagnose such issues, you can disable use of a shell with @kbd{set
> +startup-with-shell off}.
There should be a prominent note here to the effect that invoking the
inferior bypassing the shell disables command-line redirection.
OK with those changes.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option.
2013-10-23 15:38 ` [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option Eli Zaretskii
@ 2013-10-24 15:17 ` Pedro Alves
2014-01-08 21:21 ` Thomas Schwinge
0 siblings, 1 reply; 12+ messages in thread
From: Pedro Alves @ 2013-10-24 15:17 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: gdb-patches
On 10/23/2013 04:38 PM, Eli Zaretskii wrote:
>> From: Pedro Alves <palves@redhat.com>
> The docs are OK with a few comments.
Thanks.
>> +@smallexample
>> +(@value{GDBP}) During startup program terminated with signal SIGSEGV, Segmentation fault.
>> +@end smallexample
>
> This line is too long, it will cause overflow of the page boundaries.
Whoops, thanks for noticing.
Hmm, actually, the prompt is misplaced. The error will appear on
its own line. Fixing that thankfully avoids having to break
the line.
>> +which indicates the shell or the wrapper specified with
>> +@samp{exec-wrapper} crashed, not your program. Most often, this is
>> +caused by something odd in your shell's initialization file---such as
>> +@file{.cshrc} for C-shell, or @file{.bashrc} for BASH. To help
>> +diagnose such issues, you can disable use of a shell with @kbd{set
>> +startup-with-shell off}.
>
> There should be a prominent note here to the effect that invoking the
> inferior bypassing the shell disables command-line redirection.
Ack. As above we explain what the shell is used for, it
should then be obvious that disabling the shell, well,
disables what it's used for. But indeed I hadn't mentioned
redirection there. I added that.
Keith was kind enough to point out a couple grammar mistakes
and typos, and suggest some clarifications. Here's what I pushed
in.
----
Subject: [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new
"set/show startup-with-shell" option.
Occasionaly we hear about people having problems with GDB not being
able to start programs (with "run"/"start"). GDB spawns a shell to
start the program, and most often, it'll be the case that the problem
is actually with the user's shell setup.
GDB has code to disable the use of the shell to start programs.
That's the STARTUP_WITH_SHELL macro that native targets could set to 0
in their nm.h file (though no target actually uses it nowadays).
This patch makes that setting a run-time knob instead. This will be
useful to quickly diagnose such shell issues, and might also come in
handy at other times (such as when debugging the shell itself, if you
don't have a different shell handy).
gdb/
2013-10-24 Pedro Alves <palves@redhat.com>
* NEWS (New options): Mention set/show startup-with-shell.
* config/alpha/nm-osf3.h (START_INFERIOR_TRAPS_EXPECTED): Set to 2
instead of 3.
* fork-child.c (fork_inferior, startup_inferior): Handle 'set
startup-with-shell'.
(show_startup_with_shell): New function.
(_initialize_fork_child): Register the set/show startup-with-shell
commands.
* inf-ptrace.c (inf_ptrace_create_inferior): Remove comment.
* inf-ttrace.c (inf_ttrace_him): Remove comment.
* procfs.c (procfs_init_inferior): Remove comment.
* infcmd.c (startup_with_shell): New global.
* inferior.h (startup_with_shell): Declare global.
(STARTUP_WITH_SHELL): Delete.
(START_INFERIOR_TRAPS_EXPECTED): Set to 1 by default instead of 2.
gdb/doc/
2013-10-24 Pedro Alves <palves@redhat.com>
* gdb.texinfo (Starting): Document set/show startup-with-shell.
---
gdb/ChangeLog | 18 ++++++++++++++++++
gdb/NEWS | 5 +++++
gdb/config/alpha/nm-osf3.h | 9 +++++----
gdb/doc/ChangeLog | 4 ++++
gdb/doc/gdb.texinfo | 32 ++++++++++++++++++++++++++++++--
gdb/fork-child.c | 31 +++++++++++++++++++++++++++----
gdb/inf-ptrace.c | 3 ---
gdb/inf-ttrace.c | 3 ---
gdb/infcmd.c | 6 +++++-
gdb/inferior.h | 42 ++++++++++++++++++++++++------------------
gdb/procfs.c | 2 --
11 files changed, 118 insertions(+), 37 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0c61c89..5d17998 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,21 @@
+2013-10-24 Pedro Alves <palves@redhat.com>
+
+ * NEWS (New options): Mention set/show startup-with-shell.
+ * config/alpha/nm-osf3.h (START_INFERIOR_TRAPS_EXPECTED): Set to 2
+ instead of 3.
+ * fork-child.c (fork_inferior, startup_inferior): Handle 'set
+ startup-with-shell'.
+ (show_startup_with_shell): New function.
+ (_initialize_fork_child): Register the set/show startup-with-shell
+ commands.
+ * inf-ptrace.c (inf_ptrace_create_inferior): Remove comment.
+ * inf-ttrace.c (inf_ttrace_him): Remove comment.
+ * procfs.c (procfs_init_inferior): Remove comment.
+ * infcmd.c (startup_with_shell): New global.
+ * inferior.h (startup_with_shell): Declare global.
+ (STARTUP_WITH_SHELL): Delete.
+ (START_INFERIOR_TRAPS_EXPECTED): Set to 1 by default instead of 2.
+
2013-10-23 Pedro Alves <palves@redhat.com>
* common/gdb_signals.h (gdb_signal_to_symbol_string): Declare.
diff --git a/gdb/NEWS b/gdb/NEWS
index 10834df..6eb5090 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -98,6 +98,11 @@ set range-stepping
show range-stepping
Control whether target-assisted range stepping is enabled.
+set startup-with-shell
+show startup-with-shell
+ Specifies whether Unix child processes are started via a shell or
+ directly.
+
* You can now use a literal value 'unlimited' for options that
interpret 0 or -1 as meaning "unlimited". E.g., "set
trace-buffer-size unlimited" is now an alias for "set
diff --git a/gdb/config/alpha/nm-osf3.h b/gdb/config/alpha/nm-osf3.h
index b3a082d..7dd278a 100644
--- a/gdb/config/alpha/nm-osf3.h
+++ b/gdb/config/alpha/nm-osf3.h
@@ -16,10 +16,11 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-/* Number of traps that happen between exec'ing the shell
- to run an inferior, and when we finally get to
- the inferior code. This is 2 on most implementations. */
-#define START_INFERIOR_TRAPS_EXPECTED 3
+/* Number of traps that happen between exec'ing the shell to run an
+ inferior, and when we finally get to the inferior code, not
+ counting the exec for the shell. This is 1 on most
+ implementations. */
+#define START_INFERIOR_TRAPS_EXPECTED 2
/* Don't trace faults under OSF/1, rely on the posting of the appropriate
signal if fault tracing is disabled.
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index eb69fdd..c66a152 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,7 @@
+2013-10-24 Pedro Alves <palves@redhat.com>
+
+ * gdb.texinfo (Starting): Document set/show startup-with-shell.
+
2013-10-11 Joel Brobecker <brobecker@adacore.com>
* gdb.texinfo (Shared Library GDB/MI Catchpoint Commands):
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 44fb174..32516ae 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -2011,8 +2011,10 @@ is used to pass the arguments, so that you may use normal conventions
(such as wildcard expansion or variable substitution) in describing
the arguments.
In Unix systems, you can control which shell is used with the
-@code{SHELL} environment variable.
-@xref{Arguments, ,Your Program's Arguments}.
+@code{SHELL} environment variable. If you do not define @code{SHELL},
+@value{GDBN} uses the default shell (@file{/bin/sh}). You can disable
+use of any shell with the @code{set startup-with-shell} command (see
+below for details).
@item The @emph{environment.}
Your program normally inherits its environment from @value{GDBN}, but you can
@@ -2115,6 +2117,32 @@ environment:
This command is available when debugging locally on most targets, excluding
@sc{djgpp}, Cygwin, MS Windows, and QNX Neutrino.
+@kindex set startup-with-shell
+@item set startup-with-shell
+@itemx set startup-with-shell on
+@itemx set startup-with-shell off
+@itemx show set startup-with-shell
+On Unix systems, by default, if a shell is available on your target,
+@value{GDBN}) uses it to start your program. Arguments of the
+@code{run} command are passed to the shell, which does variable
+substitution, expands wildcard characters and performs redirection of
+I/O. In some circumstances, it may be useful to disable such use of a
+shell, for example, when debugging the shell itself or diagnosing
+startup failures such as:
+
+@smallexample
+(@value{GDBP}) run
+Starting program: ./a.out
+During startup program terminated with signal SIGSEGV, Segmentation fault.
+@end smallexample
+
+@noindent
+which indicates the shell or the wrapper specified with
+@samp{exec-wrapper} crashed, not your program. Most often, this is
+caused by something odd in your shell's initialization file---such as
+@file{.cshrc} for C-shell, $@file{.zshenv} for the Z shell, or the
+file specified in the @samp{BASH_ENV} environment variable for BASH.
+
@kindex set disable-randomization
@item set disable-randomization
@itemx set disable-randomization on
diff --git a/gdb/fork-child.c b/gdb/fork-child.c
index 6820872..a1e4902 100644
--- a/gdb/fork-child.c
+++ b/gdb/fork-child.c
@@ -150,11 +150,11 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env,
if (exec_file == 0)
exec_file = get_exec_file (1);
- /* STARTUP_WITH_SHELL is defined in inferior.h. If 0,e we'll just
- do a fork/exec, no shell, so don't bother figuring out what
- shell. */
+ /* 'startup_with_shell' is declared in inferior.h and bound to the
+ "set startup-with-shell" option. If 0, we'll just do a
+ fork/exec, no shell, so don't bother figuring out what shell. */
shell_file = shell_file_arg;
- if (STARTUP_WITH_SHELL)
+ if (startup_with_shell)
{
/* Figure out what shell to start up the user program under. */
if (shell_file == NULL)
@@ -419,6 +419,12 @@ startup_inferior (int ntraps)
int terminal_initted = 0;
ptid_t resume_ptid;
+ if (startup_with_shell)
+ {
+ /* One trap extra for exec'ing the shell. */
+ pending_execs++;
+ }
+
if (target_supports_multi_process ())
resume_ptid = pid_to_ptid (ptid_get_pid (inferior_ptid));
else
@@ -533,6 +539,15 @@ unset_exec_wrapper_command (char *args, int from_tty)
exec_wrapper = NULL;
}
+static void
+show_startup_with_shell (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ fprintf_filtered (file,
+ _("Use of shell to start subprocesses is %s.\n"),
+ value);
+}
+
/* Provide a prototype to silence -Wmissing-prototypes. */
extern initialize_file_ftype _initialize_fork_child;
@@ -550,4 +565,12 @@ Show the wrapper for running programs."), NULL,
add_cmd ("exec-wrapper", class_run, unset_exec_wrapper_command,
_("Disable use of an execution wrapper."),
&unsetlist);
+
+ add_setshow_boolean_cmd ("startup-with-shell", class_support,
+ &startup_with_shell, _("\
+Set use of shell to start subprocesses. The default is on."), _("\
+Show use of shell to start subprocesses."), NULL,
+ NULL,
+ show_startup_with_shell,
+ &setlist, &showlist);
}
diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c
index 9e6e980..bdebe65 100644
--- a/gdb/inf-ptrace.c
+++ b/gdb/inf-ptrace.c
@@ -137,9 +137,6 @@ inf_ptrace_create_inferior (struct target_ops *ops,
discard_cleanups (back_to);
- /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h, and will
- be 1 or 2 depending on whether we're starting without or with a
- shell. */
startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
/* On some targets, there must be some explicit actions taken after
diff --git a/gdb/inf-ttrace.c b/gdb/inf-ttrace.c
index 3ba830f..36bf4cb 100644
--- a/gdb/inf-ttrace.c
+++ b/gdb/inf-ttrace.c
@@ -642,9 +642,6 @@ inf_ttrace_him (struct target_ops *ops, int pid)
push_target (ops);
- /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h, and will
- be 1 or 2 depending on whether we're starting without or with a
- shell. */
startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
/* On some targets, there must be some explicit actions taken after
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 20f8857..4ad8ad3 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -147,6 +147,10 @@ enum stop_stack_kind stop_stack_dummy;
int stopped_by_random_signal;
+/* See inferior.h. */
+
+int startup_with_shell = 1;
+
\f
/* Accessor routines. */
@@ -255,7 +259,7 @@ construct_inferior_arguments (int argc, char **argv)
{
char *result;
- if (STARTUP_WITH_SHELL)
+ if (startup_with_shell)
{
#ifdef __MINGW32__
/* This holds all the characters considered special to the
diff --git a/gdb/inferior.h b/gdb/inferior.h
index fff072b..d33a01a 100644
--- a/gdb/inferior.h
+++ b/gdb/inferior.h
@@ -257,6 +257,25 @@ extern void notice_new_inferior (ptid_t, int, int);
extern struct value *get_return_value (struct value *function,
struct type *value_type);
+/* Whether to start up the debuggee under a shell.
+
+ If startup-with-shell is set, GDB's "run" will attempt to start up
+ the debuggee under a shell.
+
+ This is in order for argument-expansion to occur. E.g.,
+
+ (gdb) run *
+
+ The "*" gets expanded by the shell into a list of files.
+
+ While this is a nice feature, it may be handy to bypass the shell
+ in some cases. To disable this feature, do "set startup-with-shell
+ false".
+
+ The catch-exec traps expected during start-up will be one more if
+ the target is started up with a shell. */
+extern int startup_with_shell;
+
/* Address at which inferior stopped. */
extern CORE_ADDR stop_pc;
@@ -346,25 +365,12 @@ struct displaced_step_closure *get_displaced_step_closure_by_addr (CORE_ADDR add
#define ON_STACK 1
#define AT_ENTRY_POINT 4
-/* If STARTUP_WITH_SHELL is set, GDB's "run"
- will attempts to start up the debugee under a shell.
- This is in order for argument-expansion to occur. E.g.,
- (gdb) run *
- The "*" gets expanded by the shell into a list of files.
- While this is a nice feature, it turns out to interact badly
- with some of the catch-fork/catch-exec features we have added.
- In particular, if the shell does any fork/exec's before
- the exec of the target program, that can confuse GDB.
- To disable this feature, set STARTUP_WITH_SHELL to 0.
- To enable this feature, set STARTUP_WITH_SHELL to 1.
- The catch-exec traps expected during start-up will
- be 1 if target is not started up with a shell, 2 if it is.
- - RT
- If you disable this, you need to decrement
- START_INFERIOR_TRAPS_EXPECTED in tm.h. */
-#define STARTUP_WITH_SHELL 1
+/* Number of traps that happen between exec'ing the shell to run an
+ inferior and when we finally get to the inferior code, not counting
+ the exec for the shell. This is 1 on most implementations.
+ Overridden in nm.h files. */
#if !defined(START_INFERIOR_TRAPS_EXPECTED)
-#define START_INFERIOR_TRAPS_EXPECTED 2
+#define START_INFERIOR_TRAPS_EXPECTED 1
#endif
struct private_inferior;
diff --git a/gdb/procfs.c b/gdb/procfs.c
index 5a425ed..e013096 100644
--- a/gdb/procfs.c
+++ b/gdb/procfs.c
@@ -4451,8 +4451,6 @@ procfs_init_inferior (struct target_ops *ops, int pid)
thread_change_ptid (pid_to_ptid (pid),
ptid_build (pid, lwpid, 0));
- /* Typically two, one trap to exec the shell, one to exec the
- program being debugged. Defined by "inferior.h". */
startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
#ifdef SYS_syssgi
--
1.7.11.7
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH] [DOC] shell startup files, clarifications and fixes. (was: Re: [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option.)
2013-10-23 14:49 ` Pedro Alves
@ 2013-10-25 11:11 ` Pedro Alves
2013-11-05 17:56 ` [PATCH] [DOC] shell startup files, clarifications and fixes Pedro Alves
0 siblings, 1 reply; 12+ messages in thread
From: Pedro Alves @ 2013-10-25 11:11 UTC (permalink / raw)
To: gdb-patches; +Cc: Andreas Schwab
On 10/23/2013 03:49 PM, Pedro Alves wrote:
>
> @emph{Warning:} On Unix systems, @value{GDBN} runs your program using
> the shell indicated
> by your @code{SHELL} environment variable if it exists (or
> @code{/bin/sh} if not). If your @code{SHELL} variable names a shell
> that runs an initialization file---such as @file{.cshrc} for C-shell, or
> @file{.bashrc} for BASH---any variables you set in that file affect
> your program. You may wish to move setting of environment variables to
> files that are only run when you sign on, such as @file{.login} or
> @file{.profile}.
>
> So that's wrong too. I'll fix it as a follow up if the change below
> is OK.
Like so. OK?
-------
Subject: [DOC] shell startup files, clarifications and fixes.
When Bash is started non-interactively, it runs the script pointed by
the BASH_ENV environment variable, not .bashrc. While at it, mention
Z shell in the warning too, and mention non-interactive mode
explicitly.
gdb/doc/
2013-10-25 Pedro Alves <palves@redhat.com>
* gdb.texinfo (Starting) <set/show startup-with-shell>: Mention
non-interactive mode.
(Environment) <shell startup files warning>: Mention
non-interactive mode. Mention .zshenv for Z shell, and talk about
BASH_ENV instead of .bashrc for BASH.
---
gdb/doc/gdb.texinfo | 24 +++++++++++++-----------
1 file changed, 13 insertions(+), 11 deletions(-)
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 32516ae..d6b29d1 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -2139,9 +2139,10 @@ During startup program terminated with signal SIGSEGV, Segmentation fault.
@noindent
which indicates the shell or the wrapper specified with
@samp{exec-wrapper} crashed, not your program. Most often, this is
-caused by something odd in your shell's initialization file---such as
-@file{.cshrc} for C-shell, $@file{.zshenv} for the Z shell, or the
-file specified in the @samp{BASH_ENV} environment variable for BASH.
+caused by something odd in your shell's non-interactive mode
+initialization file---such as @file{.cshrc} for C-shell,
+$@file{.zshenv} for the Z shell, or the file specified in the
+@samp{BASH_ENV} environment variable for BASH.
@kindex set disable-randomization
@item set disable-randomization
@@ -2305,14 +2306,15 @@ rather than assigning it an empty value.
@end table
@emph{Warning:} On Unix systems, @value{GDBN} runs your program using
-the shell indicated
-by your @code{SHELL} environment variable if it exists (or
-@code{/bin/sh} if not). If your @code{SHELL} variable names a shell
-that runs an initialization file---such as @file{.cshrc} for C-shell, or
-@file{.bashrc} for BASH---any variables you set in that file affect
-your program. You may wish to move setting of environment variables to
-files that are only run when you sign on, such as @file{.login} or
-@file{.profile}.
+the shell indicated by your @code{SHELL} environment variable if it
+exists (or @code{/bin/sh} if not). If your @code{SHELL} variable
+names a shell that runs an initialization file when started
+non-interactively---such as @file{.cshrc} for C-shell, $@file{.zshenv}
+for the Z shell, or the file specified in the @samp{BASH_ENV}
+environment variable for BASH---any variables you set in that file
+affect your program. You may wish to move setting of environment
+variables to files that are only run when you sign on, such as
+@file{.login} or @file{.profile}.
@node Working Directory
@section Your Program's Working Directory
--
1.7.11.7
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] [DOC] shell startup files, clarifications and fixes.
2013-10-25 11:11 ` [PATCH] [DOC] shell startup files, clarifications and fixes. (was: Re: [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option.) Pedro Alves
@ 2013-11-05 17:56 ` Pedro Alves
2013-11-05 18:06 ` Eli Zaretskii
0 siblings, 1 reply; 12+ messages in thread
From: Pedro Alves @ 2013-11-05 17:56 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: gdb-patches
Hi Eli,
I notice I had forgotten to CC you on this patch, and since
it's buried in another thread, it most likely fell through
the cracks.
Do you think it's OK?
--
Pedro Alves
On 10/25/2013 12:11 PM, Pedro Alves wrote:
> On 10/23/2013 03:49 PM, Pedro Alves wrote:
>>
>> @emph{Warning:} On Unix systems, @value{GDBN} runs your program using
>> the shell indicated
>> by your @code{SHELL} environment variable if it exists (or
>> @code{/bin/sh} if not). If your @code{SHELL} variable names a shell
>> that runs an initialization file---such as @file{.cshrc} for C-shell, or
>> @file{.bashrc} for BASH---any variables you set in that file affect
>> your program. You may wish to move setting of environment variables to
>> files that are only run when you sign on, such as @file{.login} or
>> @file{.profile}.
>>
>> So that's wrong too. I'll fix it as a follow up if the change below
>> is OK.
>
> Like so. OK?
>
> -------
> Subject: [DOC] shell startup files, clarifications and fixes.
>
> When Bash is started non-interactively, it runs the script pointed by
> the BASH_ENV environment variable, not .bashrc. While at it, mention
> Z shell in the warning too, and mention non-interactive mode
> explicitly.
>
> gdb/doc/
> 2013-10-25 Pedro Alves <palves@redhat.com>
>
> * gdb.texinfo (Starting) <set/show startup-with-shell>: Mention
> non-interactive mode.
> (Environment) <shell startup files warning>: Mention
> non-interactive mode. Mention .zshenv for Z shell, and talk about
> BASH_ENV instead of .bashrc for BASH.
> ---
> gdb/doc/gdb.texinfo | 24 +++++++++++++-----------
> 1 file changed, 13 insertions(+), 11 deletions(-)
>
> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
> index 32516ae..d6b29d1 100644
> --- a/gdb/doc/gdb.texinfo
> +++ b/gdb/doc/gdb.texinfo
> @@ -2139,9 +2139,10 @@ During startup program terminated with signal SIGSEGV, Segmentation fault.
> @noindent
> which indicates the shell or the wrapper specified with
> @samp{exec-wrapper} crashed, not your program. Most often, this is
> -caused by something odd in your shell's initialization file---such as
> -@file{.cshrc} for C-shell, $@file{.zshenv} for the Z shell, or the
> -file specified in the @samp{BASH_ENV} environment variable for BASH.
> +caused by something odd in your shell's non-interactive mode
> +initialization file---such as @file{.cshrc} for C-shell,
> +$@file{.zshenv} for the Z shell, or the file specified in the
> +@samp{BASH_ENV} environment variable for BASH.
>
> @kindex set disable-randomization
> @item set disable-randomization
> @@ -2305,14 +2306,15 @@ rather than assigning it an empty value.
> @end table
>
> @emph{Warning:} On Unix systems, @value{GDBN} runs your program using
> -the shell indicated
> -by your @code{SHELL} environment variable if it exists (or
> -@code{/bin/sh} if not). If your @code{SHELL} variable names a shell
> -that runs an initialization file---such as @file{.cshrc} for C-shell, or
> -@file{.bashrc} for BASH---any variables you set in that file affect
> -your program. You may wish to move setting of environment variables to
> -files that are only run when you sign on, such as @file{.login} or
> -@file{.profile}.
> +the shell indicated by your @code{SHELL} environment variable if it
> +exists (or @code{/bin/sh} if not). If your @code{SHELL} variable
> +names a shell that runs an initialization file when started
> +non-interactively---such as @file{.cshrc} for C-shell, $@file{.zshenv}
> +for the Z shell, or the file specified in the @samp{BASH_ENV}
> +environment variable for BASH---any variables you set in that file
> +affect your program. You may wish to move setting of environment
> +variables to files that are only run when you sign on, such as
> +@file{.login} or @file{.profile}.
>
> @node Working Directory
> @section Your Program's Working Directory
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] [DOC] shell startup files, clarifications and fixes.
2013-11-05 17:56 ` [PATCH] [DOC] shell startup files, clarifications and fixes Pedro Alves
@ 2013-11-05 18:06 ` Eli Zaretskii
2013-11-06 12:30 ` Pedro Alves
0 siblings, 1 reply; 12+ messages in thread
From: Eli Zaretskii @ 2013-11-05 18:06 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
> Date: Tue, 05 Nov 2013 17:46:22 +0000
> From: Pedro Alves <palves@redhat.com>
> CC: gdb-patches@sourceware.org
>
> Hi Eli,
>
> I notice I had forgotten to CC you on this patch, and since
> it's buried in another thread, it most likely fell through
> the cracks.
>
> Do you think it's OK?
It's OK. (I did see it, and even reviewed the previous version of it,
I just failed to respond when you posted an update.)
Thanks.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] [DOC] shell startup files, clarifications and fixes.
2013-11-05 18:06 ` Eli Zaretskii
@ 2013-11-06 12:30 ` Pedro Alves
0 siblings, 0 replies; 12+ messages in thread
From: Pedro Alves @ 2013-11-06 12:30 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: gdb-patches
On 11/05/2013 06:01 PM, Eli Zaretskii wrote:
>> Date: Tue, 05 Nov 2013 17:46:22 +0000
>> From: Pedro Alves <palves@redhat.com>
>> CC: gdb-patches@sourceware.org
>>
>> Hi Eli,
>>
>> I notice I had forgotten to CC you on this patch, and since
>> it's buried in another thread, it most likely fell through
>> the cracks.
>>
>> Do you think it's OK?
>
> It's OK. (I did see it, and even reviewed the previous version of it,
> I just failed to respond when you posted an update.)
Thanks, pushed now.
--
Pedro Alves
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option.
2013-10-24 15:17 ` Pedro Alves
@ 2014-01-08 21:21 ` Thomas Schwinge
2014-01-09 12:10 ` Pedro Alves
0 siblings, 1 reply; 12+ messages in thread
From: Thomas Schwinge @ 2014-01-08 21:21 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches, bug-hurd
[-- Attachment #1: Type: text/plain, Size: 5884 bytes --]
Hi!
On Thu, 24 Oct 2013 16:17:21 +0100, Pedro Alves <palves@redhat.com> wrote:
> Here's what I pushed
..., and what made the Hurd port pretty unhappy. ;-)
> gdb/
> 2013-10-24 Pedro Alves <palves@redhat.com>
>
> * NEWS (New options): Mention set/show startup-with-shell.
> * config/alpha/nm-osf3.h (START_INFERIOR_TRAPS_EXPECTED): Set to 2
> instead of 3.
> * fork-child.c (fork_inferior, startup_inferior): Handle 'set
> startup-with-shell'.
> (show_startup_with_shell): New function.
> (_initialize_fork_child): Register the set/show startup-with-shell
> commands.
> * inf-ptrace.c (inf_ptrace_create_inferior): Remove comment.
> * inf-ttrace.c (inf_ttrace_him): Remove comment.
> * procfs.c (procfs_init_inferior): Remove comment.
> * infcmd.c (startup_with_shell): New global.
> * inferior.h (startup_with_shell): Declare global.
> (STARTUP_WITH_SHELL): Delete.
> (START_INFERIOR_TRAPS_EXPECTED): Set to 1 by default instead of 2.
> --- a/gdb/fork-child.c
> +++ b/gdb/fork-child.c
> @@ -419,6 +419,12 @@ startup_inferior (int ntraps)
> int terminal_initted = 0;
> ptid_t resume_ptid;
>
> + if (startup_with_shell)
> + {
> + /* One trap extra for exec'ing the shell. */
> + pending_execs++;
> + }
> +
> --- a/gdb/inferior.h
> +++ b/gdb/inferior.h
> @@ -346,25 +365,12 @@ struct displaced_step_closure *get_displaced_step_closure_by_addr (CORE_ADDR add
> +/* Number of traps that happen between exec'ing the shell to run an
> + inferior and when we finally get to the inferior code, not counting
> + the exec for the shell. This is 1 on most implementations.
> + Overridden in nm.h files. */
> #if !defined(START_INFERIOR_TRAPS_EXPECTED)
> -#define START_INFERIOR_TRAPS_EXPECTED 2
> +#define START_INFERIOR_TRAPS_EXPECTED 1
> #endif
I'd like to push the following, to get the Hurd port functional again.
In the thread around
<http://news.gmane.org/find-root.php?message_id=%3C200810110047.39807.pedro%40codesourcery.com%3E>,
and
<http://news.gmane.org/find-root.php?message_id=%3C200810131935.35253.pedro%40codesourcery.com%3E>,
we had already (very) briefly been discussing gnu-nat's local
pending_execs handling.
Is the new approach that I'm posting below (flag instead of counting;
saves us from repeating in gnu_create_inferior the increment in the
startup_with_shell case) OK until we get a clear understanding if and how
we can get rid of it for good? Or should indeed the current value of
fork-child.c:startup_inferior's pending_execs be made available, say by
moving that variable into inferior.h:struct inferior, and using that in
gnu-nat.c instead of gnu-nat.c:struct inf's local pending_execs
"replica"? (But apparently there are no other users of this.)
commit 57c9fb3afadab5813d7463dc2393d5affe78849e
Author: Thomas Schwinge <thomas@codesourcery.com>
Date: Wed Jan 8 21:42:07 2014 +0100
Hurd: Adjust to startup-with-shell changes.
In commit 98882a26513e25b2161b41dfd4bed97b59b2c01a, STARTUP_WITH_SHELL was made
a runtime toggle, startup-with-shell. The Hurd code not adjusted, which had a
value hard-coded instead of using START_INFERIOR_TRAPS_EXPECTED. Fix that, and
also simplify gnu-nat's pending_execs handling from counting to just a flag.
gdb/
* gnu-nat.c (struct inf): Change pending_execs member to a 1-bit
flag. Adjust all users; in particular...
(gnu_wait): ..., don't decrement its value in here...
(gnu_create_inferior): ..., and instead set the flag in here,
around the startup_inferior call, and call that one with
START_INFERIOR_TRAPS_EXPECTED.
diff --git gdb/gnu-nat.c gdb/gnu-nat.c
index 26db81a..5538af5 100644
--- gdb/gnu-nat.c
+++ gdb/gnu-nat.c
@@ -210,9 +210,9 @@ struct inf
unsigned int no_wait:1;
/* When starting a new inferior, we don't try to validate threads until all
- the proper execs have been done. This is a count of how many execs we
+ the proper execs have been done, which this flag states we still
expect to happen. */
- unsigned pending_execs;
+ unsigned int pending_execs:1;
/* Fields describing global state. */
@@ -1568,26 +1568,14 @@ rewait:
while execing. */
{
w->suppress = 1;
- inf_debug (inf, "pending_execs = %d, ignoring minor event",
- inf->pending_execs);
+ inf_debug (inf, "pending_execs, ignoring minor event");
}
else if (kind == TARGET_WAITKIND_STOPPED
&& w->status.value.sig == GDB_SIGNAL_TRAP)
/* Ah hah! A SIGTRAP from the inferior while starting up probably
means we've succesfully completed an exec! */
{
- if (--inf->pending_execs == 0)
- /* We're done! */
- {
-#if 0 /* do we need this? */
- prune_threads (1); /* Get rid of the old shell
- threads. */
- renumber_threads (0); /* Give our threads reasonable
- names. */
-#endif
- }
- inf_debug (inf, "pending exec completed, pending_execs => %d",
- inf->pending_execs);
+ inf_debug (inf, "one pending exec completed");
}
else if (kind == TARGET_WAITKIND_STOPPED)
/* It's possible that this signal is because of a crashed process
@@ -2146,7 +2134,7 @@ gnu_create_inferior (struct target_ops *ops,
push_target (ops);
- inf->pending_execs = 2;
+ inf->pending_execs = 1;
inf->nomsg = 1;
inf->traced = 1;
@@ -2158,7 +2146,8 @@ gnu_create_inferior (struct target_ops *ops,
thread_change_ptid (inferior_ptid,
ptid_build (inf->pid, inf_pick_first_thread (), 0));
- startup_inferior (inf->pending_execs);
+ startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
+ inf->pending_execs = 0;
inf_validate_procinfo (inf);
inf_update_signal_thread (inf);
Grüße,
Thomas
[-- Attachment #2: Type: application/pgp-signature, Size: 489 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option.
2014-01-08 21:21 ` Thomas Schwinge
@ 2014-01-09 12:10 ` Pedro Alves
0 siblings, 0 replies; 12+ messages in thread
From: Pedro Alves @ 2014-01-09 12:10 UTC (permalink / raw)
To: Thomas Schwinge; +Cc: gdb-patches, bug-hurd
On 01/08/2014 09:20 PM, Thomas Schwinge wrote:
> Hi!
>
> On Thu, 24 Oct 2013 16:17:21 +0100, Pedro Alves <palves@redhat.com> wrote:
>> Here's what I pushed
>
> ..., and what made the Hurd port pretty unhappy. ;-)
Whoops. ;-) Thanks for fixing.
> In the thread around
> <http://news.gmane.org/find-root.php?message_id=%3C200810110047.39807.pedro%40codesourcery.com%3E>,
> and
> <http://news.gmane.org/find-root.php?message_id=%3C200810131935.35253.pedro%40codesourcery.com%3E>,
> we had already (very) briefly been discussing gnu-nat's local
> pending_execs handling.
Ah, these things do have a tendency to byte back.
> Is the new approach that I'm posting below (flag instead of counting;
> saves us from repeating in gnu_create_inferior the increment in the
> startup_with_shell case) OK until we get a clear understanding if and how
> we can get rid of it for good?
It's fine with me.
> commit 57c9fb3afadab5813d7463dc2393d5affe78849e
> Author: Thomas Schwinge <thomas@codesourcery.com>
> Date: Wed Jan 8 21:42:07 2014 +0100
>
> Hurd: Adjust to startup-with-shell changes.
>
> In commit 98882a26513e25b2161b41dfd4bed97b59b2c01a, STARTUP_WITH_SHELL was made
> a runtime toggle, startup-with-shell. The Hurd code not adjusted, which had a
"... code was not ..."
> value hard-coded instead of using START_INFERIOR_TRAPS_EXPECTED. Fix that, and
> also simplify gnu-nat's pending_execs handling from counting to just a flag.
--
Pedro Alves
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2014-01-09 12:10 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-10-23 12:40 [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option Pedro Alves
2013-10-23 13:38 ` Gary Benson
2013-10-23 13:41 ` Andreas Schwab
2013-10-23 14:49 ` Pedro Alves
2013-10-25 11:11 ` [PATCH] [DOC] shell startup files, clarifications and fixes. (was: Re: [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option.) Pedro Alves
2013-11-05 17:56 ` [PATCH] [DOC] shell startup files, clarifications and fixes Pedro Alves
2013-11-05 18:06 ` Eli Zaretskii
2013-11-06 12:30 ` Pedro Alves
2013-10-23 15:38 ` [PATCH] Make STARTUP_WITH_SHELL a runtime toggle -- add new "set/show startup-with-shell" option Eli Zaretskii
2013-10-24 15:17 ` Pedro Alves
2014-01-08 21:21 ` Thomas Schwinge
2014-01-09 12:10 ` Pedro Alves
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).