2008-05-01 Daniel Jacobowitz <dan@codesourcery.com>

Pedro Alves  <pedro@codesourcery.com>

	Based on work by Jan Kratochvil <jan.kratochvil@redhat.com> and Jeff
 	Johnston <jjohnstn@redhat.com>.

	* NEWS: Mention attach to stopped process fix.
	* infcmd.c (detach_command, disconnect_command): Discard the thread
	list.
	* infrun.c (handle_inferior_event): Do not ignore non-SIGSTOP while
	attaching.  Use signal_stop_state.
	(signal_stop_state): Check stop_soon.
	* linux-nat.c (kill_lwp): Declare earlier.
	(pid_is_stopped, linux_nat_post_attach_wait): New.
	(lin_lwp_attach_lwp): Use linux_nat_post_attach_wait.  Update
	comments.
	(linux_nat_attach): Use linux_nat_post_attach_wait.
	(detach_callback, linux_nat_detach): Improve handling for signalled
	processes.
	(linux_nat_pid_to_str): Always print out the LWP ID if it differs
	from the process ID.
	* Makefile.in (infcmd.o): Update.

2008-05-01  Jan Kratochvil  <jan.kratochvil@redhat.com>
	    Daniel Jacobowitz  <dan@codesourcery.com>

	* gdb.threads/attach-into-signal.c, gdb.threads/attach-into-signal.exp,
	gdb.threads/attach-stopped.c, gdb.threads/attach-stopped.exp,
	gdb.threads/attachstop-mt.c, gdb.threads/attachstop-mt.exp: New.
This commit is contained in:
Daniel Jacobowitz
2008-05-01 18:50:14 +00:00
parent ca38c58efa
commit a0ef42744d
11 changed files with 985 additions and 87 deletions

View File

@@ -1946,13 +1946,15 @@ handle_inferior_event (struct execution_control_state *ecs)
/* 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 == STOP_QUIETLY_NO_SIGSTOP)
SIGSTOP in a subsequent ptrace(PTRACE_CONT,SIGSTOP) call.
See more comments in inferior.h. On the other hand, if we
get a non-SIGSTOP, report it to the user - assume the backend
will handle the SIGSTOP if it should show up later. */
if (stop_soon == STOP_QUIETLY_NO_SIGSTOP
&& stop_signal == TARGET_SIGNAL_STOP)
{
stop_stepping (ecs);
if (stop_signal == TARGET_SIGNAL_STOP)
stop_signal = TARGET_SIGNAL_0;
stop_signal = TARGET_SIGNAL_0;
return;
}
@@ -2023,7 +2025,7 @@ process_event_stop_test:
target_terminal_ours_for_output ();
print_stop_reason (SIGNAL_RECEIVED, stop_signal);
}
if (signal_stop[stop_signal])
if (signal_stop_state (stop_signal))
{
stop_stepping (ecs);
return;
@@ -3276,7 +3278,9 @@ hook_stop_stub (void *cmd)
int
signal_stop_state (int signo)
{
return signal_stop[signo];
/* Always stop on signals if we're just gaining control of the
program. */
return signal_stop[signo] || stop_soon != NO_STOP_QUIETLY;
}
int