From ec7d7c038cbdd93780ff6ee18823b0285c55f0d6 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Thu, 1 May 2008 18:50:14 +0000 Subject: 2008-05-01 Daniel Jacobowitz Pedro Alves Based on work by Jan Kratochvil and Jeff Johnston . * 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 Daniel Jacobowitz * 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. --- gdb/infrun.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'gdb/infrun.c') diff --git a/gdb/infrun.c b/gdb/infrun.c index f576a59123d..16a802bb068 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -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 -- cgit v1.2.1