2003-04-08 Elena Zannoni <ezannoni@redhat.com>

* infrun.c (stop_soon_quietly): Make it an enum, to better
	override the default behavior of handle_inferior_event.
	(clear_proceed_status): Update uses of stop_soon_quietly to
	reflect that it is now an enum.
	(start_remote): Ditto.
	(handle_inferior_event): Change logic a bit if stop_soon_quietly
	is set to handle the new GNU/Linux kernel behavior for
	attach/sigstop.  Update uses of stop_soon_quietly.
	* inferior.h (enum stop_kind): New enum.
	* infcmd.c (attach_command): Use STOP_QUIETLY_NO_SIGSTOP.
	Reset normal handle_inferior_event behavior, afterwards.
	* fork-child.c (startup_inferior): Update.
	* alpha-tdep.c (heuristic_proc_start): Update.
	* solib-svr4.c (svr4_solib_create_inferior_hook): Update.
	* solib-sunos.c (sunos_solib_create_inferior_hook): Update.
	* solib-osf.c (osf_solib_create_inferior_hook): Update.
	* solib-irix.c (irix_solib_create_inferior_hook): Update.
	* remote-vx.c (vx_create_inferior): Update.
	* mips-tdep.c (heuristic_proc_start): Update.
This commit is contained in:
Elena Zannoni
2003-04-08 18:52:04 +00:00
parent 9cc92a36ed
commit c54cfec8d4
11 changed files with 75 additions and 27 deletions

View File

@ -557,7 +557,7 @@ heuristic_proc_start (CORE_ADDR pc)
stop_soon_quietly, but with this test, at least we stop_soon_quietly, but with this test, at least we
don't print out warnings for every child forked (eg, on don't print out warnings for every child forked (eg, on
decstation). 22apr93 rich@cygnus.com. */ decstation). 22apr93 rich@cygnus.com. */
if (!stop_soon_quietly) if (stop_soon_quietly == NO_STOP_QUIETLY)
{ {
static int blurb_printed = 0; static int blurb_printed = 0;

View File

@ -409,7 +409,8 @@ startup_inferior (int ntraps)
#else #else
while (1) while (1)
{ {
stop_soon_quietly = 1; /* Make wait_for_inferior be quiet */ /* Make wait_for_inferior be quiet */
stop_soon_quietly = STOP_QUIETLY;
wait_for_inferior (); wait_for_inferior ();
if (stop_signal != TARGET_SIGNAL_TRAP) if (stop_signal != TARGET_SIGNAL_TRAP)
{ {
@ -444,5 +445,5 @@ startup_inferior (int ntraps)
} }
} }
#endif /* STARTUP_INFERIOR */ #endif /* STARTUP_INFERIOR */
stop_soon_quietly = 0; stop_soon_quietly = NO_STOP_QUIETLY;
} }

View File

@ -1910,8 +1910,13 @@ attach_command (char *args, int from_tty)
/* No traps are generated when attaching to inferior under Mach 3 /* No traps are generated when attaching to inferior under Mach 3
or GNU hurd. */ or GNU hurd. */
#ifndef ATTACH_NO_WAIT #ifndef ATTACH_NO_WAIT
stop_soon_quietly = 1; /* Careful here. See comments in inferior.h. Basically some OSes
don't ignore SIGSTOPs on continue requests anymore. We need a
way for handle_inferior_event to reset the stop_signal variable
after an attach, and this is what STOP_QUIETLY_NO_SIGSTOP is for. */
stop_soon_quietly = STOP_QUIETLY_NO_SIGSTOP;
wait_for_inferior (); wait_for_inferior ();
stop_soon_quietly = NO_STOP_QUIETLY;
#endif #endif
/* /*

View File

@ -390,12 +390,37 @@ extern enum step_over_calls_kind step_over_calls;
extern int step_multi; extern int step_multi;
/* Nonzero means expecting a trap and caller will handle it themselves. /* Nonzero means expecting a trap and caller will handle it
It is used after attach, due to attaching to a process; themselves. It is used when running in the shell before the child
when running in the shell before the child program has been exec'd; program has been exec'd; and when running some kinds of remote
and when running some kinds of remote stuff (FIXME?). */ stuff (FIXME?). */
extern int stop_soon_quietly; /* It is also used after attach, due to attaching to a process. This
is a bit trickier. When doing an attach, the kernel stops the
debuggee with a SIGSTOP. On newer GNU/Linux kernels (>= 2.5.61)
the handling of SIGSTOP for a ptraced process has changed. Earlier
versions of the kernel would ignore these SIGSTOPs, while now
SIGSTOP is treated like any other signal, i.e. it is not muffled.
If the gdb user does a 'continue' after the 'attach', gdb passes
the global variable stop_signal (which stores the signal from the
attach, SIGSTOP) to the ptrace(PTRACE_CONT,...) call. This is
problematic, because the kernel doesn't ignore such SIGSTOP
now. I.e. it is reported back to gdb, which in turn presents it
back to the user.
To avoid the problem, we use STOP_QUIETLY_NO_SIGSTOP, which allows
gdb to clear the value of stop_signal after the attach, so that it
is not passed back down to the kernel. */
enum stop_kind
{
NO_STOP_QUIETLY = 0,
STOP_QUIETLY,
STOP_QUIETLY_NO_SIGSTOP
};
extern enum stop_kind stop_soon_quietly;
/* Nonzero if proceed is being used for a "finish" command or a similar /* Nonzero if proceed is being used for a "finish" command or a similar
situation when stop_registers should be saved. */ situation when stop_registers should be saved. */

View File

@ -286,7 +286,7 @@ int stop_after_trap;
when running in the shell before the child program has been exec'd; when running in the shell before the child program has been exec'd;
and when running some kinds of remote stuff (FIXME?). */ and when running some kinds of remote stuff (FIXME?). */
int stop_soon_quietly; enum stop_kind stop_soon_quietly;
/* Nonzero if proceed is being used for a "finish" command or a similar /* Nonzero if proceed is being used for a "finish" command or a similar
situation when stop_registers should be saved. */ situation when stop_registers should be saved. */
@ -659,7 +659,7 @@ clear_proceed_status (void)
step_frame_id = null_frame_id; step_frame_id = null_frame_id;
step_over_calls = STEP_OVER_UNDEBUGGABLE; step_over_calls = STEP_OVER_UNDEBUGGABLE;
stop_after_trap = 0; stop_after_trap = 0;
stop_soon_quietly = 0; stop_soon_quietly = NO_STOP_QUIETLY;
proceed_to_finish = 0; proceed_to_finish = 0;
breakpoint_proceeded = 1; /* We're about to proceed... */ breakpoint_proceeded = 1; /* We're about to proceed... */
@ -802,7 +802,7 @@ start_remote (void)
{ {
init_thread_list (); init_thread_list ();
init_wait_for_inferior (); init_wait_for_inferior ();
stop_soon_quietly = 1; stop_soon_quietly = STOP_QUIETLY;
trap_expected = 0; trap_expected = 0;
/* Always go on waiting for the target, regardless of the mode. */ /* Always go on waiting for the target, regardless of the mode. */
@ -1258,7 +1258,7 @@ handle_inferior_event (struct execution_control_state *ecs)
might be the shell which has just loaded some objects, might be the shell which has just loaded some objects,
otherwise add the symbols for the newly loaded objects. */ otherwise add the symbols for the newly loaded objects. */
#ifdef SOLIB_ADD #ifdef SOLIB_ADD
if (!stop_soon_quietly) if (stop_soon_quietly == NO_STOP_QUIETLY)
{ {
/* Remove breakpoints, SOLIB_ADD might adjust /* Remove breakpoints, SOLIB_ADD might adjust
breakpoint addresses via breakpoint_re_set. */ breakpoint addresses via breakpoint_re_set. */
@ -1757,7 +1757,9 @@ handle_inferior_event (struct execution_control_state *ecs)
if (stop_signal == TARGET_SIGNAL_TRAP if (stop_signal == TARGET_SIGNAL_TRAP
|| (breakpoints_inserted && || (breakpoints_inserted &&
(stop_signal == TARGET_SIGNAL_ILL (stop_signal == TARGET_SIGNAL_ILL
|| stop_signal == TARGET_SIGNAL_EMT)) || stop_soon_quietly) || stop_signal == TARGET_SIGNAL_EMT))
|| stop_soon_quietly == STOP_QUIETLY
|| stop_soon_quietly == STOP_QUIETLY_NO_SIGSTOP)
{ {
if (stop_signal == TARGET_SIGNAL_TRAP && stop_after_trap) if (stop_signal == TARGET_SIGNAL_TRAP && stop_after_trap)
{ {
@ -1765,12 +1767,27 @@ handle_inferior_event (struct execution_control_state *ecs)
stop_stepping (ecs); stop_stepping (ecs);
return; return;
} }
if (stop_soon_quietly)
/* This is originated from start_remote(), start_inferior() and
shared libraries hook functions. */
if (stop_soon_quietly == STOP_QUIETLY)
{ {
stop_stepping (ecs); stop_stepping (ecs);
return; return;
} }
/* This originates from attach_command(). We need to overwrite
the stop_signal here, because some kernels don't ignore a
SIGSTOP in a subsequent ptrace(PTRACE_SONT,SOGSTOP) call.
See more comments in inferior.h. */
if (stop_soon_quietly == STOP_QUIETLY_NO_SIGSTOP)
{
stop_stepping (ecs);
if (stop_signal == TARGET_SIGNAL_STOP)
stop_signal = TARGET_SIGNAL_0;
return;
}
/* Don't even think about breakpoints /* Don't even think about breakpoints
if just proceeded over a breakpoint. if just proceeded over a breakpoint.

View File

@ -1821,7 +1821,7 @@ heuristic_proc_start (CORE_ADDR pc)
stop_soon_quietly, but with this test, at least we stop_soon_quietly, but with this test, at least we
don't print out warnings for every child forked (eg, on don't print out warnings for every child forked (eg, on
decstation). 22apr93 rich@cygnus.com. */ decstation). 22apr93 rich@cygnus.com. */
if (!stop_soon_quietly) if (stop_soon_quietly == NO_STOP_QUIETLY)
{ {
static int blurb_printed = 0; static int blurb_printed = 0;

View File

@ -67,7 +67,7 @@
extern void vx_read_register (); extern void vx_read_register ();
extern void vx_write_register (); extern void vx_write_register ();
extern void symbol_file_command (); extern void symbol_file_command ();
extern int stop_soon_quietly; /* for wait_for_inferior */ extern enum stop_kind stop_soon_quietly; /* for wait_for_inferior */
static int net_step (); static int net_step ();
static int net_ptrace_clnt_call (); /* Forward decl */ static int net_ptrace_clnt_call (); /* Forward decl */
@ -243,9 +243,9 @@ vx_create_inferior (char *exec_file, char *args, char **env)
/* Install inferior's terminal modes. */ /* Install inferior's terminal modes. */
target_terminal_inferior (); target_terminal_inferior ();
stop_soon_quietly = 1; stop_soon_quietly = STOP_QUIETLY;
wait_for_inferior (); /* Get the task spawn event */ wait_for_inferior (); /* Get the task spawn event */
stop_soon_quietly = 0; stop_soon_quietly = NO_STOP_QUIETLY;
/* insert_step_breakpoint (); FIXME, do we need this? */ /* insert_step_breakpoint (); FIXME, do we need this? */
proceed (-1, TARGET_SIGNAL_DEFAULT, 0); proceed (-1, TARGET_SIGNAL_DEFAULT, 0);

View File

@ -436,7 +436,7 @@ irix_solib_create_inferior_hook (void)
out what we need to know about them. */ out what we need to know about them. */
clear_proceed_status (); clear_proceed_status ();
stop_soon_quietly = 1; stop_soon_quietly = STOP_QUIETLY;
stop_signal = TARGET_SIGNAL_0; stop_signal = TARGET_SIGNAL_0;
do do
{ {
@ -462,7 +462,7 @@ irix_solib_create_inferior_hook (void)
Delaying the resetting of stop_soon_quietly until after symbol loading Delaying the resetting of stop_soon_quietly until after symbol loading
suppresses the warning. */ suppresses the warning. */
solib_add ((char *) 0, 0, (struct target_ops *) 0, auto_solib_add); solib_add ((char *) 0, 0, (struct target_ops *) 0, auto_solib_add);
stop_soon_quietly = 0; stop_soon_quietly = NO_STOP_QUIETLY;
re_enable_breakpoints_in_shlibs (); re_enable_breakpoints_in_shlibs ();
} }

View File

@ -321,7 +321,7 @@ osf_solib_create_inferior_hook (void)
out what we need to know about them. */ out what we need to know about them. */
clear_proceed_status (); clear_proceed_status ();
stop_soon_quietly = 1; stop_soon_quietly = STOP_QUIETLY;
stop_signal = TARGET_SIGNAL_0; stop_signal = TARGET_SIGNAL_0;
do do
{ {
@ -337,7 +337,7 @@ osf_solib_create_inferior_hook (void)
Delaying the resetting of stop_soon_quietly until after symbol loading Delaying the resetting of stop_soon_quietly until after symbol loading
suppresses the warning. */ suppresses the warning. */
solib_add ((char *) 0, 0, (struct target_ops *) 0, auto_solib_add); solib_add ((char *) 0, 0, (struct target_ops *) 0, auto_solib_add);
stop_soon_quietly = 0; stop_soon_quietly = NO_STOP_QUIETLY;
/* Enable breakpoints disabled (unnecessarily) by clear_solib(). */ /* Enable breakpoints disabled (unnecessarily) by clear_solib(). */
re_enable_breakpoints_in_shlibs (); re_enable_breakpoints_in_shlibs ();

View File

@ -829,7 +829,7 @@ sunos_solib_create_inferior_hook (void)
out what we need to know about them. */ out what we need to know about them. */
clear_proceed_status (); clear_proceed_status ();
stop_soon_quietly = 1; stop_soon_quietly = STOP_QUIETLY;
stop_signal = TARGET_SIGNAL_0; stop_signal = TARGET_SIGNAL_0;
do do
{ {
@ -837,7 +837,7 @@ sunos_solib_create_inferior_hook (void)
wait_for_inferior (); wait_for_inferior ();
} }
while (stop_signal != TARGET_SIGNAL_TRAP); while (stop_signal != TARGET_SIGNAL_TRAP);
stop_soon_quietly = 0; stop_soon_quietly = NO_STOP_QUIETLY;
/* We are now either at the "mapping complete" breakpoint (or somewhere /* We are now either at the "mapping complete" breakpoint (or somewhere
else, a condition we aren't prepared to deal with anyway), so adjust else, a condition we aren't prepared to deal with anyway), so adjust

View File

@ -1290,7 +1290,7 @@ svr4_solib_create_inferior_hook (void)
out what we need to know about them. */ out what we need to know about them. */
clear_proceed_status (); clear_proceed_status ();
stop_soon_quietly = 1; stop_soon_quietly = STOP_QUIETLY;
stop_signal = TARGET_SIGNAL_0; stop_signal = TARGET_SIGNAL_0;
do do
{ {
@ -1298,7 +1298,7 @@ svr4_solib_create_inferior_hook (void)
wait_for_inferior (); wait_for_inferior ();
} }
while (stop_signal != TARGET_SIGNAL_TRAP); while (stop_signal != TARGET_SIGNAL_TRAP);
stop_soon_quietly = 0; stop_soon_quietly = NO_STOP_QUIETLY;
#endif /* defined(_SCO_DS) */ #endif /* defined(_SCO_DS) */
} }