This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]