From: Pedro Alves <pedro@codesourcery.com>
To: gdb-patches@sourceware.org
Cc: "Philippe Waroquiers" <philippe.waroquiers@skynet.be>,
yao@codesourcery.com
Subject: x86 watchpoints bug (Re: ping: Re: PATCH : allow to set length of hw watchpoints (e.g. for Valgrind gdbserver))
Date: Tue, 31 May 2011 19:07:00 -0000 [thread overview]
Message-ID: <201105312007.09956.pedro@codesourcery.com> (raw)
In-Reply-To: <D762C72B7DC84A92BCF8D21C8D5E68E2@soleil>
On Sunday 29 May 2011 14:01:11, Philippe Waroquiers wrote:
> For what concerns the bug: the problem is that the code in i386-low.c
> can partially place a watchpoint, but to the contrary of i386-nat.c,
> such a partial watchpoint will not be rolled back by breakpoint.c
Not sure I understand what is different between GDB and GDBserver
here. A watchpoint, from breakpoint.c's perpective can be composed
of several low-level watchpoints. E.g., if the expression the user
wants to watch requires trapping accesses to two disjoint memory
regions for changes, each of those memory regions will correspond
to one low-level hardware watchpoint. In GDBserver's or i386-nat.c's
perpective, there will be two watchpoints. If the second fails to
insert, then breakpoint.c in GDB rolls back the first. This applies
to GDBserver as well.
> The patch fixes this (as this bug is much easier to trigger with long
> breakpoints which are accepted by gdb, but have to be rolled back
> by gdbserver).
> To reproduce the bug, compile the attached s.c, and do the following:
> gdbserver :1234 ./s
> gdb ./s
> tar rem :1234
> set breakpoint always-inserted on
> watch s1
> watch s2
> watch s4
> watch s3
> del
> y
> break s.c:24
> c
> p p = &s3
> c
> linux-x86-low.c:511: A problem internal to GDBserver has been detected.
> Assertion `DR_FIRSTADDR <= regnum && regnum < DR_LASTADDR' failed.
First things first. This assertion is actually bogus ( and I'm to blame
for it :-) ). Patch below. We get here with regnum == 3, which is quite
valid. This means gdbserver is asserting whenever a watchpoint on DR3
triggers. Vis:
(gdb) watch s1
(gdb) watch s2
(gdb) watch s3
(gdb) b 24
(gdb) c
...
on gdbserver side we have:
stopped_data_addr:
CONTROL (DR7): 51150155 STATUS (DR6): 00000000
DR0: addr=0x603768, ref.count=1 DR1: addr=0x60376a, ref.count=1
DR2: addr=0x609a08, ref.count=1 DR3: addr=0x60d8e8, ref.count=1
^^^^^^^^
so:
(gdb) p p = 0x60d8e8
(gdb) c
... puff!
../../../src/gdb/gdbserver/linux-x86-low.c:511: A problem internal to GDBserver has been detected.
Assertion `DR_FIRSTADDR <= regnum && regnum < DR_LASTADDR' failed.
Program exited with code 01.
(gdb)
Pedro Alves
2011-05-31 Pedro Alves <pedro@codesourcery.com>
gdb/gdbserver/
* linux-x86-low.c (i386_dr_low_get_addr): Fix off by one in
assertion.
* win32-i386-low.c (i386_dr_low_get_addr): Ditto.
---
gdb/gdbserver/linux-x86-low.c | 2 +-
gdb/gdbserver/win32-i386-low.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
Index: src/gdb/gdbserver/linux-x86-low.c
===================================================================
--- src.orig/gdb/gdbserver/linux-x86-low.c 2011-04-28 17:17:30.000000000 +0100
+++ src/gdb/gdbserver/linux-x86-low.c 2011-05-31 19:55:00.924959503 +0100
@@ -508,7 +508,7 @@ i386_dr_low_get_addr (int regnum)
ptid_t ptid = ptid_of (lwp);
/* DR6 and DR7 are retrieved with some other way. */
- gdb_assert (DR_FIRSTADDR <= regnum && regnum < DR_LASTADDR);
+ gdb_assert (DR_FIRSTADDR <= regnum && regnum <= DR_LASTADDR);
return x86_linux_dr_get (ptid, regnum);
}
Index: src/gdb/gdbserver/win32-i386-low.c
===================================================================
--- src.orig/gdb/gdbserver/win32-i386-low.c 2011-01-13 15:07:54.000000000 +0000
+++ src/gdb/gdbserver/win32-i386-low.c 2011-05-31 19:56:14.414959478 +0100
@@ -61,7 +61,7 @@ i386_dr_low_set_addr (const struct i386_
CORE_ADDR
i386_dr_low_get_addr (int regnum)
{
- gdb_assert (DR_FIRSTADDR <= regnum && regnum < DR_LASTADDR);
+ gdb_assert (DR_FIRSTADDR <= regnum && regnum <= DR_LASTADDR);
return debug_reg_state.dr_mirror[regnum];
}
next prev parent reply other threads:[~2011-05-31 19:07 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-21 22:20 ping: Re: PATCH : allow to set length of hw watchpoints (e.g. for Valgrind gdbserver) Philippe Waroquiers
2011-05-26 19:02 ` Tom Tromey
2011-05-29 13:01 ` Philippe Waroquiers
2011-05-30 15:26 ` Joel Brobecker
2011-05-31 19:07 ` Pedro Alves [this message]
2011-05-31 20:25 ` x86 watchpoints bug (Re: ping: Re: PATCH : allow to set length of hw watchpoints (e.g. for Valgrind gdbserver)) Philippe Waroquiers
2011-05-31 20:53 ` Pedro Alves
2011-05-31 21:29 ` Pedro Alves
2011-05-31 22:15 ` Philippe Waroquiers
2011-05-31 23:04 ` Pedro Alves
2011-06-01 14:35 ` Pedro Alves
2011-06-08 22:55 ` Philippe Waroquiers
2011-06-09 0:00 ` Pedro Alves
2011-06-09 22:16 ` Philippe Waroquiers
2011-07-21 17:20 ` Pedro Alves
2011-07-22 16:40 ` Philippe Waroquiers
2011-07-22 16:43 ` Pedro Alves
2011-07-23 16:28 ` Thiago Jung Bauermann
2011-07-26 20:02 ` software watchpoints bug (was: Re: x86 watchpoints bug) Pedro Alves
2011-07-27 3:45 ` Thiago Jung Bauermann
2011-07-22 17:19 ` x86 watchpoints bug (Re: ping: Re: PATCH : allow to set length of hw watchpoints (e.g. for Valgrind gdbserver)) Pedro Alves
2011-05-27 3:25 ` ping: Re: PATCH : allow to set length of hw watchpoints (e.g. for Valgrind gdbserver) Yao Qi
2011-05-27 17:53 ` Tom Tromey
2011-05-27 17:59 ` Pedro Alves
2011-05-30 4:06 ` Yao Qi
2011-05-30 5:34 ` Philippe Waroquiers
2011-05-30 5:48 ` Yao Qi
2011-05-30 6:31 ` Philippe Waroquiers
2011-05-31 17:31 ` Pedro Alves
2011-05-31 18:06 ` Philippe Waroquiers
2011-06-01 15:15 ` Pedro Alves
2011-06-05 20:55 ` Philippe Waroquiers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201105312007.09956.pedro@codesourcery.com \
--to=pedro@codesourcery.com \
--cc=gdb-patches@sourceware.org \
--cc=philippe.waroquiers@skynet.be \
--cc=yao@codesourcery.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox