This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH v2 15/23] Implement all-stop on top of a target running non-stop mode
- From: Pedro Alves <palves at redhat dot com>
- To: Yao Qi <qiyaoltc at gmail dot com>
- Cc: gdb-patches at sourceware dot org
- Date: Wed, 08 Apr 2015 20:41:44 +0100
- Subject: Re: [PATCH v2 15/23] Implement all-stop on top of a target running non-stop mode
- Authentication-results: sourceware.org; auth=none
- References: <1428410990-28560-1-git-send-email-palves at redhat dot com> <1428410990-28560-16-git-send-email-palves at redhat dot com> <86r3rvvu8c dot fsf at gmail dot com> <5524FA77 dot 50900 at redhat dot com> <55250C1D dot 4090304 at redhat dot com> <552582F3 dot 1060106 at redhat dot com>
On 04/08/2015 08:35 PM, Pedro Alves wrote:
> On 04/08/2015 12:08 PM, Pedro Alves wrote:
>>
>> Hmm. Looks like the assertion caught a pre-existing problem.
>> This sets up the thread to re-hit the breakpoint at PC once the
>> signal handler returns, and lets _all_ threads run. But, what if had
>> _other_ threads that needed a step-over too? Those will run too,
>> and immediately re-trap the same breakpoint, but GDB will re-report them.
>
> I thought it'd be easy to test that with multiple-step-overs.exp test, and
> indeed, bad things happened. I filed bugs and pushed the test in upfront,
> as managing all these patch dependencies is getting complicated...
>
> [pushed] Add test for PR18214 and PR18216 - multiple step-overs with queued signals
> https://sourceware.org/ml/gdb-patches/2015-04/msg00293.html
>
>> Maybe we should set a step-resume breakpoint on _all_ threads that need
>> a step-over, not just the current. I'll need to think a bit about this.
>
> That works. I tested it with native | remote, all-stop | non-stop,
> software | hardware single-step, and all pass now.
Oh, I almost forgot, I also needed to move the pending waitstatus handling
to restart_threads. The "If some thread needs to start a step-over
at this point" assertion just below triggers otherwise. I'll fold this
into the "Teach non-stop to do in-line step-overs" patch.
diff --git a/gdb/infrun.c b/gdb/infrun.c
index cce29fe..3a12c2b 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -4918,6 +4918,18 @@ restart_threads (struct thread_info *event_thread)
continue;
}
+
+ if (tp->suspend.waitstatus_pending_p)
+ {
+ if (debug_infrun)
+ fprintf_unfiltered (gdb_stdlog,
+ "infrun: restart threads: "
+ "[%s] has pending status\n",
+ target_pid_to_str (tp->ptid));
+ tp->resumed = 1;
+ continue;
+ }
+
/* If some thread needs to start a step-over at this point, it
should still be in the step-over queue, and thus skipped
above. */
@@ -6504,6 +6516,8 @@ keep_going_stepped_thread (struct thread_info *tp)
if (tp->suspend.waitstatus_pending_p)
{
+ abort ();
+
if (debug_infrun)
{
char *statstr;