This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gdb and binutils branch gdb-7.8-branch updated. gdb-7.8-release-95-ga70c6d6


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gdb and binutils".

The branch, gdb-7.8-branch has been updated
       via  a70c6d64c936f981640b8e3315ddadb141af7aad (commit)
      from  a39611f90c9a8ae50ab08c17e68af0490ab95352 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=a70c6d64c936f981640b8e3315ddadb141af7aad

commit a70c6d64c936f981640b8e3315ddadb141af7aad
Author: Joel Brobecker <brobecker@adacore.com>
Date:   Tue Oct 14 23:18:35 2014 +0200

    state->dr_control_mirror == 0 failed assertion in gdbserver on Windows XP
    
    When using GDBserver on Windows XP, GDBserver reports an assertion
    failure after hitting a hardware watchpoint. The problem was reproduced
    using the sources from gdb.ada/int_deref, but should probably reproduce
    with any scenario involving hardware watchpoints.
    
    In our scenario, we break on line 5, just before the increment, insert
    a watchhpoint on it, and then continue:
    
        (gdb) b foo.adb:5
        Breakpoint 1 at 0x4017c2: file foo.adb, line 5.
        (gdb) cont
        Continuing.
    
        Breakpoint 1, foo () at foo.adb:5
        5          Pck.Watch := Pck.Watch + 1;
        (gdb) watch watch
        Hardware watchpoint 2: watch
        (gdb) c
        Continuing.
        Remote communication error.  Target disconnected.: Invalid argument.
    
    The immediate cause for the communication error is easily explained,
    gdbserver crashes due to a failed assertion:
    
        x86_remove_aligned_watchpoint: Assertion `state->dr_control_mirror == 0' failed.
    
    The assertion occurs because debug_reg_state.dr_control_mirror gets
    overwritten by the value read from the inferior, when processing
    the watchpoint event in win32_wait: win32_wait finds that we stopped,
    calls get_thread_regcache which causes i386_get_thread_context to
    get called, which then...
    
      if (th->tid == current_event->dwThreadId)
        {
          /* Copy dr values from the current thread.  */
          struct x86_debug_reg_state *dr = &debug_reg_state;
          [...]
          dr->dr_control_mirror = th->context.Dr7;
        }
    
    Both should be identical, normally making this a no-op, but
    it turns out that bits 12-11-10 are documented as being fixed
    and equal to 001. Our handling of dr_control_mirror does not
    manage those bits, and leaves them as zeros instead. So, when
    we overwrite the value from the thread's DR7 register, we
    accidentally set bit 10, causing state->dr_control_mirror
    to be 0x400 after we've cleared everything internally.
    
    This patch fixes the issue by removing the statement setting
    state->dr_control_mirror to the thread's DR7 register value.
    
    gdb/gdbserver/ChangeLog:
    
            PR server/17487
            * win32-i386-low.c (i386_get_thread_context): Do not set
            dr->dr_control_mirror.

-----------------------------------------------------------------------

Summary of changes:
 gdb/gdbserver/ChangeLog        |    6 ++++++
 gdb/gdbserver/win32-i386-low.c |    1 -
 2 files changed, 6 insertions(+), 1 deletions(-)


hooks/post-receive
-- 
gdb and binutils


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]