Re: (maybe) Async mode failures on PPC

Luis Machado
2008-07-15T16:45:19Z

On Tue, 2008-07-15 at 11:46 -0300, Luis Machado wrote:
> On Mon, 2008-07-14 at 14:06 -0300, Luis Machado wrote:
> > Hey Pedro,
> >
> > On Mon, 2008-07-14 at 17:57 +0100, Pedro Alves wrote:
> > > Hi Luis,
> > >
> > > On Monday 14 July 2008 17:31:42, Luis Machado wrote:
> > > > Steps to reproduce this failure:
> > > >
> > > > 1 - Load the watchpoint.exp test binary into gdb.
> > > > 2 - start it and next over a few lines.
> > >
> > > I can't reproduce it on x86 (sync or async), neither with your
> > > recipe or by running the watchpoint.exp test.
> >
> > It seems to be a ppc-specific thing. I forgot to mention that you need
> > to place a watchpoint on variable "ptr1" to trigger this. When no
> > watchpoints are inserted, it runs as expected. And this is sync mode,
> > i
> > did not turn async on, and i presume it's off by default, like it was
> > until recently.
> >
> > > :-(
> > >
> > > The "Target is executing" notice comes from
> > frame.c:get_current_frame.
> > >
> > > I couldn't figure out for sure from your description of the
> > > problem if this only happens in async, or if it happen in sync as
> > well,
> > > but I understood async only.
> > >
> > > Why is GDB trying to get the current frame of an executing
> > > thread, or why does GDB think that the current thread is
> > > executing at this point, if it isn't?
> > >
> > > Can you do a bit of debugging and figure out what is the
> > > code path that ended up triggering the first error?
> > > get_current_frame is called from too many places to be able
> > > to do an educated guess.
> >
> > Yes, sorry. I was just wondering if anyone else was having the same
> > problem and did not provide much info about it. I'll dig into it and
> > will provide the code path for the error as it seems to be a
> > regression.
> > But i feel it's related somehow to watchpoints.
> >
> > Regards,
> > Luis
>
> Here is a patch i discussed with Pedro to fix this regression. Tested
> and nothing showed up in the testsuite.
>
> Is this OK?

Updated the changelog entry according to Pedro's suggestion.

2008-07-15 Luis Machado <luisgpm@br.ibm.com>

* infrun.c (handle_inferior_event): Tag threads as stopped
before inserting breakpoints.

Index: gdb/infrun.c
===================================================================
--- gdb.orig/infrun.c 2008-07-15 09:36:19.000000000 -0500
+++ gdb/infrun.c 2008-07-15 09:37:20.000000000 -0500
@@ -1828,6 +1828,29 @@

adjust_pc_after_break (ecs);

+ reinit_frame_cache ();
+
+ /* If it's a new process, add it to the thread database */
+
+ ecs->new_thread_event = (!ptid_equal (ecs->ptid, inferior_ptid)
+ && !ptid_equal (ecs->ptid, minus_one_ptid)
+ && !in_thread_list (ecs->ptid));
+
+ if (ecs->ws.kind != TARGET_WAITKIND_EXITED
+ && ecs->ws.kind != TARGET_WAITKIND_SIGNALLED && ecs->new_thread_event)
+ add_thread (ecs->ptid);
+
+ if (ecs->ws.kind != TARGET_WAITKIND_IGNORE)
+ {
+ /* Mark the non-executing threads accordingly. */
+ if (!non_stop
+ || ecs->ws.kind == TARGET_WAITKIND_EXITED
+ || ecs->ws.kind == TARGET_WAITKIND_SIGNALLED)
+ set_executing (pid_to_ptid (-1), 0);
+ else
+ set_executing (ecs->ptid, 0);
+ }
+
switch (infwait_state)
{
case infwait_thread_hop_state:
@@ -1867,29 +1890,6 @@
}
infwait_state = infwait_normal_state;

- reinit_frame_cache ();
-
- /* If it's a new process, add it to the thread database */
-
- ecs->new_thread_event = (!ptid_equal (ecs->ptid, inferior_ptid)
- && !ptid_equal (ecs->ptid, minus_one_ptid)
- && !in_thread_list (ecs->ptid));
-
- if (ecs->ws.kind != TARGET_WAITKIND_EXITED
- && ecs->ws.kind != TARGET_WAITKIND_SIGNALLED && ecs->new_thread_event)
- add_thread (ecs->ptid);
-
- if (ecs->ws.kind != TARGET_WAITKIND_IGNORE)
- {
- /* Mark the non-executing threads accordingly. */
- if (!non_stop
- || ecs->ws.kind == TARGET_WAITKIND_EXITED
- || ecs->ws.kind == TARGET_WAITKIND_SIGNALLED)
- set_executing (pid_to_ptid (-1), 0);
- else
- set_executing (ecs->ptid, 0);
- }
-
switch (ecs->ws.kind)
{