Re: [PATCH] Windows gdb: Fix resetting of the debug-registers bit in ContextFlags

Hannes Domani <[email protected]>
Newsgroups gmane.comp.gdb.patches
Message-ID <[email protected]>
 Ping.


Am Montag, 6. Juli 2026 um 17:02:35 MESZ hat Hannes Domani <[email protected]> Folgendes geschrieben:

> It's just great that all your mails are blocked by yahoo...
> 
> 
> Am Mittwoch, 1. Juli 2026 um 21:03:09 MESZ hat Pedro Alves <pedro () palves ! net> Folgendes geschrieben:
> 
> > On 2026-06-27 15:27, Hannes Domani wrote:
> > > The CONTEXT_DEBUG_REGISTERS also includes the arch-specific bit
> > > (CONTEXT_i386 or CONTEXT_AMD64) which is included in all CONTEXT_*
> > > defines.
> > >
> > > So this basically just checks if any CONTEXT_* define is set:
> > >  if ((context->ContextFlags & CONTEXT_DEBUG_REGISTERS) != 0)
> > >
> > > And similarily, unsetting CONTEXT_DEBUG_REGISTERS removes the
> > 
> > similarily => similarly
> 
> Right.
> 
> 
> > > arch-specific bit as well.
> > >
> > > So this creates a CONTEXT_DEBUG_REG_FLAG define with just the
> > > debug-registers bit, and uses it in these problematic locations.
> > 
> > How did you notice this?  Like, GDB was misbehaving and you found the
> > issue, was it by inspection?  I'd be good to have that info in the commit log.
> 
> I noticed because I was doing some changes in that function, and
> CONTEXT_DEBUG_REGISTERS stood out to me very quickly, because for WOW64 I
> would expect WindowsContext<decltype(context)>::debug to be used instead.
> 
> 
> > > ---
> > >  gdb/x86-windows-nat.c | 10 +++++++---
> > >  1 file changed, 7 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/gdb/x86-windows-nat.c b/gdb/x86-windows-nat.c
> > > index 27adeb1f154..3368814ed96 100644
> > > --- a/gdb/x86-windows-nat.c
> > > +++ b/gdb/x86-windows-nat.c
> > > @@ -42,6 +42,10 @@ enum
> > > 
> > >  #define DR6_CLEAR_VALUE 0xffff0ff0
> > 
> > > 
> > > +/* The CONTEXT_DEBUG_REGISTERS define without the arch-specific bit
> > > +  (CONTEXT_i386 or CONTEXT_AMD64).  */
> > > +#define CONTEXT_DEBUG_REG_FLAG 0x10
> > > +
> > 
> > Did you consider avoiding harcoding numbers, like:
> > 
> > #ifdef __x86_64__
> > # define CONTEXT_ARCH_BIT CONTEXT_AMD64
> > #else
> > # define CONTEXT_ARCH_BIT CONTEXT_i386
> > #endif
> > 
> > #define CONTEXT_DEBUG_REG_FLAG (CONTEXT_DEBUG_REGISTERS & ~CONTEXT_ARCH_BIT)
> 
> I did consider this:
> 
> #define CONTEXT_DEBUG_REG_FLAG (CONTEXT_DEBUG_REGISTERS & ~CONTEXT_CONTROL)
> 
> 
> > >  struct x86_windows_per_inferior : public windows_per_inferior
> > >  {
> > >    /* The function to use in order to determine whether a register is
> > > @@ -142,7 +146,7 @@ x86_windows_nat_target::thread_context_continue (windows_thread_info *th,
> > >      {
> > >        windows_process->fill_thread_context (th);
> > > 
> > > -      gdb_assert ((context->ContextFlags & CONTEXT_DEBUG_REGISTERS) != 0);
> > > +      gdb_assert ((context->ContextFlags & CONTEXT_DEBUG_REG_FLAG) != 0);
> > > 
> > >        /* Check whether the thread has Dr6 set indicating a
> > >          watchpoint hit, and we haven't seen the watchpoint event
> > > @@ -173,13 +177,13 @@ x86_windows_nat_target::thread_context_continue (windows_thread_info *th,
> > >              update the debug registers later when the thread
> > >              is re-resumed by the core after the watchpoint
> > >              event.  */
> > > -          context->ContextFlags &= ~CONTEXT_DEBUG_REGISTERS;
> > > +          context->ContextFlags &= ~CONTEXT_DEBUG_REG_FLAG;
> > 
> > My bad, I suppose...
> > 
> > Does clearing the arch bit make the context be basically as if it was fully zeroed?
> > 
> > So if we notice we had a pending watchpoint hit, we were not writing _any_ register?
> > 
> > That was not the original intention, for sure.
> > 
> > But OTOH, looking back at this, I'm wondering whether that wasn't really the right thing to do.
> > If we e.g., change the PC to point elsewhere, and then process the pending watchpoint, we'd want
> > to see the PC as it was when the watchpoint triggered, not what it was modified to.  Same for
> > other registers, as the watchpoint's value will very likely depend on the state of registers.
> > 
> > Right?
> > 
> > OTOH, if e.g., the user did an infcall on a thread that has a pending watchpoint, and we don't
> > modify registers, and then the watchpoint doesn't cause a stop, not writing registers means
> > we'll not really do the infcall, and the inferior proceeds as if we had done a "continue"...
> > Not great either.
> > 
> > OK, let's just do what you're suggesting until we come up with a better way, as it was the
> > original intention.  I'm just curious for more details.
> 
> I did some experiments, and it looks like SetThreadContext doesn't care at
> all about the arch bit, so it is working like your original intention.
> I thought it would fail in the arch bit is missing, but I was wrong about that.
> 
> 
> Hannes
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.