This is the mail archive of the
gdb-prs@sourceware.org
mailing list for the GDB project.
[Bug server/17487] state->dr_control_mirror == 0 failed assertion in gdbserver on Windows XP
- From: "cvs-commit at gcc dot gnu.org" <sourceware-bugzilla at sourceware dot org>
- To: gdb-prs at sourceware dot org
- Date: Wed, 15 Oct 2014 14:29:05 +0000
- Subject: [Bug server/17487] state->dr_control_mirror == 0 failed assertion in gdbserver on Windows XP
- Auto-submitted: auto-generated
- References: <bug-17487-4717 at http dot sourceware dot org/bugzilla/>
https://sourceware.org/bugzilla/show_bug.cgi?id=17487
--- Comment #1 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
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(-)
--
You are receiving this mail because:
You are on the CC list for the bug.