This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [gdbserver] Fix attaching notices
A Tuesday 08 July 2008 00:51:45, Pedro Alves wrote:
> You're right, I just tried with 6.8 too, and don't see the SIGTRAP
> notice... I'll try to pinpoint what changed this, and see if it
> was a spurious change.
>
Unsurprisingly,
> 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.
Before,
/* 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)
{
stop_stepping (ecs);
if (stop_signal == TARGET_SIGNAL_STOP)
stop_signal = TARGET_SIGNAL_0;
return;
}
After,
/* 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_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);
stop_signal = TARGET_SIGNAL_0;
return;
}
Since gdbserver is reporting a TARGET_SIGNAL_TRAP, this now doesn't
match, and we go on handling the event until we decide it was a
random signal.
So, we either
1) go with my patch (on which the win32 part was a hack, but I
can live with it), and live with the bogus notice
against older gdbservers, or
2) change the test to:
if (stop_soon == STOP_QUIETLY_NO_SIGSTOP
&& stop_signal == TARGET_SIGNAL_STOP
&& stop_signal == TARGET_SIGNAL_TRAP)
{
stop_stepping (ecs);
stop_signal = TARGET_SIGNAL_0;
return;
}
Or even add a `&& stop_signal == TARGET_SIGNAL_0', and merge
this stop_soon with STOP_QUIETLY_REMOTE.
3) other?
--
Pedro Alves