From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13228 invoked by alias); 16 Aug 2002 14:30:12 -0000 Mailing-List: contact gdb-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sources.redhat.com Received: (qmail 13216 invoked from network); 16 Aug 2002 14:30:10 -0000 Received: from unknown (HELO crack.them.org) (65.125.64.184) by sources.redhat.com with SMTP; 16 Aug 2002 14:30:10 -0000 Received: from nevyn.them.org ([66.93.61.169] ident=mail) by crack.them.org with asmtp (Exim 3.12 #1 (Debian)) id 17fi7C-0004XC-00; Fri, 16 Aug 2002 09:30:14 -0500 Received: from drow by nevyn.them.org with local (Exim 3.35 #1 (Debian)) id 17fi7c-00061p-00; Fri, 16 Aug 2002 10:30:40 -0400 Date: Fri, 16 Aug 2002 07:30:00 -0000 From: Daniel Jacobowitz To: gdb@sources.redhat.com Cc: ac131313@ges.redhat.com Subject: Re: RFC: Two small remote protocol extensions Message-ID: <20020816143040.GA22041@nevyn.them.org> Mail-Followup-To: gdb@sources.redhat.com, ac131313@ges.redhat.com References: <20020502022543.GA22594@nevyn.them.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20020502022543.GA22594@nevyn.them.org> User-Agent: Mutt/1.5.1i X-SW-Source: 2002-08/txt/msg00186.txt.bz2 On Wed, May 01, 2002 at 10:25:43PM -0400, Daniel Jacobowitz wrote: > In making remote thread debugging work on GNU/Linux, I needed two additions > to the remote protocol. Neither is strictly necessary, but both are useful, > IMHO. > > They are: > > - two new replies to the continue/step packets, 'n' and 'x'. They > indicate thread creation and death respectively, and are asynchronous; > the target is not stopped when they are sent. This one got shouted down, I'm not going to bring it up again. > - A new 'Hs' packet, paralleling Hc and Hg. This sets the "step" thread. This one, however, needs feedback. A user just reported a bogus SIGTRAP bug to me which is fixed by the above. To elaborate on the problem: right now we have two ways of specifying a thread to the remote agent. Hg specifies the "general" thread, and Hc specifies the "continue" thread. These correspond to inferior_ptid and resume_ptid, roughly. When we single-step, if we are not using some form of scheduler-locking, resume_ptid is 0. We don't tell the agent at that point what inferior_ptid is; it has to step _some_ thread, and it picks one, and if it doesn't pick the one GDB expected we get problems. We need to either: - Communicate inferior_ptid via Hg at this time - Communicate inferior_ptid via a new Hs explicitly I think the former makes sense. Here's a patch; what do you think of it? Also included is the patch for gdbserver; I'd send a separate patch along afterwards to remove the vestiges of Hs from my testing, which escaped in the original threads patch. -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer 2002-08-16 Daniel Jacobowitz * remote.c (remote_resume): Also send inferior_ptid. 2002-08-16 Daniel Jacobowitz * target.c (set_desired_inferior): Respect general_thread if cont_thread is 0 or -1. Index: remote.c =================================================================== RCS file: /cvs/src/src/gdb/remote.c,v retrieving revision 1.91 diff -u -p -r1.91 remote.c --- remote.c 9 Aug 2002 16:41:24 -0000 1.91 +++ remote.c 16 Aug 2002 14:26:51 -0000 @@ -2616,8 +2616,13 @@ remote_resume (ptid_t ptid, int step, en { struct remote_state *rs = get_remote_state (); char *buf = alloca (rs->remote_packet_size); - int pid = PIDGET (ptid); + int pid = PIDGET (ptid), inf_pid = PIDGET (inferior_ptid); char *p; + + if (inf_pid == -1) + set_thread (0, 1); + else + set_thread (inf_pid, 1); if (pid == -1) set_thread (0, 0); /* run any thread */ Index: gdbserver/target.c =================================================================== RCS file: /cvs/src/src/gdb/gdbserver/target.c,v retrieving revision 1.3 diff -u -p -r1.3 target.c --- gdbserver/target.c 11 Jun 2002 17:32:40 -0000 1.3 +++ gdbserver/target.c 16 Aug 2002 14:26:51 -0000 @@ -46,6 +46,10 @@ set_desired_inferior (int use_general) found = (struct thread_info *) find_inferior_id (&all_threads, step_thread); + if (general_thread > 0 && (cont_thread == 0 || cont_thread == -1)) + found = (struct thread_info *) find_inferior_id (&all_threads, + general_thread); + if (found == NULL) found = (struct thread_info *) find_inferior_id (&all_threads, cont_thread);