From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30535 invoked by alias); 6 Aug 2008 05:17:48 -0000 Received: (qmail 30526 invoked by uid 22791); 6 Aug 2008 05:17:47 -0000 X-Spam-Check-By: sourceware.org Received: from main.gmane.org (HELO ciao.gmane.org) (80.91.229.2) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 06 Aug 2008 05:17:05 +0000 Received: from list by ciao.gmane.org with local (Exim 4.43) id 1KQbOO-0004lc-W4 for gdb@sources.redhat.com; Wed, 06 Aug 2008 05:17:01 +0000 Received: from 78.158.192.230 ([78.158.192.230]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 06 Aug 2008 05:17:00 +0000 Received: from vladimir by 78.158.192.230 with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 06 Aug 2008 05:17:00 +0000 To: gdb@sources.redhat.com From: Vladimir Prus Subject: Re: "thread", "thread apply" and "step" ? Date: Wed, 06 Aug 2008 05:17:00 -0000 Message-ID: References: <1217997625.3549.662.camel@localhost.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7Bit User-Agent: KNode/0.10.9 X-IsSubscribed: yes Mailing-List: contact gdb-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sourceware.org X-SW-Source: 2008-08/txt/msg00089.txt.bz2 Michael Snyder wrote: > On Tue, 2008-08-05 at 16:11 -0400, Rich Wagner wrote: >> I haven't been able to find an "official" GDB spec which answers a >> question I have, relating to threads and stepping, so... >> >> >> Say your program has two threads, A and B, and that B most recently hit >> a breakpoint. >> >> It's pretty clear (and my experiments have shown) that if you then >> simply execute "step", then the step occurs in B. That is, both threads >> resume execution, with both threads suspending again when B reaches the >> "end-of-step" boundary. So far, so good... >> >> However, things become less clear, and non-intuitive, if after B hits a >> breakpoint, and I then use: >> >> thread A >> step > > The short answer is "don't do that". > > What I *wanted* to say is "you can't do that". > The problem is, as you have discovered, you can -- > it just doesn't have the effect that you think it should. > > GDB's "thread" command will specify a thread to which > subsequent state queries will apply (eg. "info register"). > > But GDB does not exercise any control over the operating > system's thread scheduling, therefore GDB has no control > over which thread will actually run when you say "step" > or "continue". You might think it should be the thread > that you last selected -- but it won't. It will be the > thread that the operating system chooses (generally the > one that was most recently running). Well, with scheduler locking on, it should be the thread that is selected. More specifically, the call to target_resume should be passed the ptid of the selected thread. For native linux, this indeed has the effect of resuming the right thread. Further, in non-stop mode scheduler locking is implicitly on, so: -exec-continue --thread N will always resume just thread N, without changing the state of any other thread. A target that is neither linux nor remote can, in theory, ignore the ptid passed to target_resume. I don't know if such targets exist or not. - Volodya