This is the mail archive of the
gdb@sourceware.org
mailing list for the GDB project.
Re: (maybe) Async mode failures on PPC
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?
2008-07-15 Luis Machado <luisgpm@br.ibm.com>
* infrun.c (handle_inferior_event): reinit_frame_cache before
handling events on threads.
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)
{
case TARGET_WAITKIND_LOADED: