From: Pierre Muller <muller@cerbere.u-strasbg.fr>
To: Eli Zaretskii <eliz@is.elta.co.il>
Cc: kettenis@science.uva.nl, gdb-patches@sources.redhat.com
Subject: [RFA/RFC 3] Remove hardware break and watchpoints at program exit.
Date: Fri, 11 Jan 2002 09:20:00 -0000 [thread overview]
Message-ID: <4.2.0.58.20020111171505.01cdfad0@ics.u-strasbg.fr> (raw)
In-Reply-To: <7704-Fri11Jan2002160358+0200-eliz@is.elta.co.il>
[-- Attachment #1: Type: text/plain, Size: 1577 bytes --]
After the previous discussion about the
hardware watch and breakpoint removal
about the debuggee exited. I slightly modifed my patch
by adding a test to avoid calling ptrace
in i386-linux-nat.c, i386bsd-nat.c and x86-64-linux-nat.c
i386_linux_dr_set, i386bsd_dr_set and x86_64_linux_dr_set functions
if taget_has_execution is 0.
I have a little doubt about the default value of the
HARDWARE_REGISTER_RESET macro.
What should be used as a no-op default ?
2002-01-09 Pierre Muller <muller@ics.u-strasbg.fr>
* breakpoint.c (REMOVE_HARDWARE_BREAKPOINT_AT_EXIT):
Define to 0 if not defined.
(REMOVE_HARDWARE_WATCHPOINT_AT_EXIT):
Define to 0 if not defined.
(HARDWARE_REGISTER_RESET): Default to no-op.
(breakpoint_init_inferior): Use REMOVE_HARDWARE_BREAKPOINT_AT_EXIT
and REMOVE_HARDWARE_WATCHPOINT_AT_EXIT to conditionally
remove hardware break and watchpoints at exit.
Call HARDWARE_REGISTER_RESET macro if defined at exit.
* config/i386/nm-i386.h: Define HARDWARE_REGISTER_RESET
macro to call i386_cleanup_dregs().
Set REMOVE_HARDWARE_BREAKPOINT_AT_EXIT to 1.
Set REMOVE_HARDWARE_WATCHPOINT_AT_EXIT to 1.
* go32-nat.c (go32_mourn_inferior): Remove call to i386_cleanup_dregs
as this is done in breakpoint_init_inferior().
* i386-linux-nat.c (i386_linux_dr_set): Don't call ptrace if target_has_execution is zero.
* i386bsd-nat.c (i386bsd_dr_set): Likewise.
* x86-64-linux-nat.c (x86_64_linux_dr_set): Likewise.
[-- Attachment #2: dregs.diffs --]
[-- Type: text/plain, Size: 5608 bytes --]
Index: breakpoint.c
===================================================================
RCS file: /cvs/src/src/gdb/breakpoint.c,v
retrieving revision 1.57
diff -u -p -r1.57 breakpoint.c
--- breakpoint.c 2001/11/11 16:39:59 1.57
+++ breakpoint.c 2002/01/11 16:19:11
@@ -234,6 +234,19 @@ static int executing_breakpoint_commands
B ? (TMP=B->next, 1): 0; \
B = TMP)
+#ifndef REMOVE_HARDWARE_BREAKPOINT_AT_EXIT
+#define REMOVE_HARDWARE_BREAKPOINT_AT_EXIT 0
+#endif
+
+#ifndef REMOVE_HARDWARE_WATCHPOINT_AT_EXIT
+#define REMOVE_HARDWARE_WATCHPOINT_AT_EXIT 0
+#endif
+
+
+#ifndef HARDWARE_REGISTERS_RESET
+#define HARDWARE_REGISTERS_RESET {}
+#endif
+
/* True if SHIFT_INST_REGS defined, false otherwise. */
int must_shift_inst_regs =
@@ -1440,7 +1453,17 @@ breakpoint_init_inferior (enum inf_conte
ALL_BREAKPOINTS_SAFE (b, temp)
{
- b->inserted = 0;
+ if ((((REMOVE_HARDWARE_BREAKPOINT_AT_EXIT)
+ && b->type == bp_hardware_breakpoint)
+ ||((REMOVE_HARDWARE_WATCHPOINT_AT_EXIT)
+ && (b->type == bp_hardware_watchpoint
+ || b->type == bp_access_watchpoint
+ || b->type == bp_read_watchpoint)))
+ && b->inserted
+ && context == inf_exited)
+ remove_breakpoint (b, mark_uninserted);
+
+ b->inserted = 0;
switch (b->type)
{
@@ -1487,6 +1510,8 @@ breakpoint_init_inferior (enum inf_conte
warning ("You must reinsert them explicitly.");
warning_needed = 0;
}
+ if (context == inf_exited)
+ HARDWARE_REGISTER_RESET;
}
/* breakpoint_here_p (PC) returns non-zero if an enabled breakpoint
Index: go32-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/go32-nat.c,v
retrieving revision 1.26
diff -u -p -r1.26 go32-nat.c
--- go32-nat.c 2001/12/06 08:15:37 1.26
+++ go32-nat.c 2002/01/11 16:19:11
@@ -663,14 +663,6 @@ go32_create_inferior (char *exec_file, c
static void
go32_mourn_inferior (void)
{
- /* We need to make sure all the breakpoint enable bits in the DR7
- register are reset when the inferior exits. Otherwise, if they
- rerun the inferior, the uncleared bits may cause random SIGTRAPs,
- failure to set more watchpoints, and other calamities. It would
- be nice if GDB itself would take care to remove all breakpoints
- at all times, but it doesn't, probably under an assumption that
- the OS cleans up when the debuggee exits. */
- i386_cleanup_dregs ();
go32_kill_inferior ();
generic_mourn_inferior ();
}
Index: i386-linux-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-linux-nat.c,v
retrieving revision 1.34
diff -u -p -r1.34 i386-linux-nat.c
--- i386-linux-nat.c 2002/01/09 22:32:16 1.34
+++ i386-linux-nat.c 2002/01/11 16:19:12
@@ -738,8 +738,9 @@ i386_linux_dr_set (int regnum, unsigned
tid = PIDGET (inferior_ptid);
errno = 0;
- ptrace (PT_WRITE_U, tid,
- offsetof (struct user, u_debugreg[regnum]), value);
+ if (target_has_execution)
+ ptrace (PT_WRITE_U, tid,
+ offsetof (struct user, u_debugreg[regnum]), value);
if (errno != 0)
perror_with_name ("Couldn't write debug register");
}
Index: i386bsd-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/i386bsd-nat.c,v
retrieving revision 1.11
diff -u -p -r1.11 i386bsd-nat.c
--- i386bsd-nat.c 2002/01/05 18:36:32 1.11
+++ i386bsd-nat.c 2002/01/11 16:19:12
@@ -298,8 +298,9 @@ i386bsd_dr_set (int regnum, unsigned int
{
struct dbreg dbregs;
- if (ptrace (PT_GETDBREGS, PIDGET (inferior_ptid),
- (PTRACE_ARG3_TYPE) &dbregs, 0) == -1)
+ if (target_has_execution
+ && ptrace (PT_GETDBREGS, PIDGET (inferior_ptid),
+ (PTRACE_ARG3_TYPE) &dbregs, 0) == -1))
perror_with_name ("Couldn't get debug registers");
/* For some mysterious reason, some of the reserved bits in the
@@ -309,8 +310,9 @@ i386bsd_dr_set (int regnum, unsigned int
DBREG_DRX ((&dbregs), regnum) = value;
- if (ptrace (PT_SETDBREGS, PIDGET (inferior_ptid),
- (PTRACE_ARG3_TYPE) &dbregs, 0) == -1)
+ if (target_has_execution
+ && ptrace (PT_SETDBREGS, PIDGET (inferior_ptid),
+ (PTRACE_ARG3_TYPE) &dbregs, 0) == -1))
perror_with_name ("Couldn't write debug registers");
}
Index: x86-64-linux-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/x86-64-linux-nat.c,v
retrieving revision 1.2
diff -u -p -r1.2 x86-64-linux-nat.c
--- x86-64-linux-nat.c 2002/01/08 00:59:31 1.2
+++ x86-64-linux-nat.c 2002/01/11 16:19:12
@@ -73,8 +73,9 @@ x86_64_linux_dr_set (int regnum, unsigne
tid = PIDGET (inferior_ptid);
errno = 0;
- ptrace (PT_WRITE_U, tid,
- offsetof (struct user, u_debugreg[regnum]), value);
+ if (target_has_execution)
+ ptrace (PT_WRITE_U, tid,
+ offsetof (struct user, u_debugreg[regnum]), value);
if (errno != 0)
perror_with_name ("Couldn't write debug register");
}
Index: config/i386/nm-i386.h
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/nm-i386.h,v
retrieving revision 1.2
diff -u -p -r1.2 nm-i386.h
--- nm-i386.h 2001/03/23 16:17:45 1.2
+++ nm-i386.h 2002/01/11 16:19:12
@@ -115,6 +115,12 @@ extern int i386_remove_hw_breakpoint (C
#define DECR_PC_AFTER_HW_BREAK 0
+#define REMOVE_HARDWARE_WATCHPOINT_AT_EXIT 1
+
+#define REMOVE_HARDWARE_BREAKPOINT_AT_EXIT 1
+
+#define HARDWARE_REGISTERS_RESET i386_cleanup_dregs ()
+
#endif /* I386_USE_GENERIC_WATCHPOINTS */
#endif /* NM_I386_H */
[-- Attachment #3: Type: text/plain, Size: 176 bytes --]
Pierre Muller
Institut Charles Sadron
6,rue Boussingault
F 67083 STRASBOURG CEDEX (France)
mailto:muller@ics.u-strasbg.fr
Phone : (33)-3-88-41-40-07 Fax : (33)-3-88-41-40-99
next prev parent reply other threads:[~2002-01-11 17:20 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-01-11 4:01 [RFA/RFC 2] " Pierre Muller
2002-01-11 4:38 ` Eli Zaretskii
2002-01-11 4:57 ` Pierre Muller
2002-01-11 5:58 ` Eli Zaretskii
2002-01-11 5:39 ` Pierre Muller
2002-01-11 6:06 ` Eli Zaretskii
2002-01-11 8:15 ` Pierre Muller
2002-01-11 9:20 ` Pierre Muller [this message]
2002-01-12 5:20 ` [RFA/RFC 3] " Mark Kettenis
2002-01-12 13:16 ` muller
2002-01-13 0:31 ` Eli Zaretskii
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=4.2.0.58.20020111171505.01cdfad0@ics.u-strasbg.fr \
--to=muller@cerbere.u-strasbg.fr \
--cc=eliz@is.elta.co.il \
--cc=gdb-patches@sources.redhat.com \
--cc=kettenis@science.uva.nl \
/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