+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.
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
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.
+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):
(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
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
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)
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
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;
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);
}
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
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
int stopped_by_random_signal;
+/* See inferior.h. */
+
+int startup_with_shell = 1;
+
\f
/* Accessor routines. */
{
char *result;
- if (STARTUP_WITH_SHELL)
+ if (startup_with_shell)
{
#ifdef __MINGW32__
/* This holds all the characters considered special to the
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;
#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;
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