public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] [PR python/29603] Fix deletion of Watchpoints
@ 2022-09-25  5:33 Johnson Sun
  2022-09-25 18:10 ` Lancelot SIX
  2022-10-01  5:20 ` Johnson Sun
  0 siblings, 2 replies; 34+ messages in thread
From: Johnson Sun @ 2022-09-25  5:33 UTC (permalink / raw)
  To: gdb-patches; +Cc: j3.soon777

Currently, during normal stop (i.e., stop and waiting for the next command),
GDB automatically deletes local Watchpoints that are out of scope. However,
local Watchpoints are not deleted if a Python script decides not to normal
stop upon hit, causing them to be hit many more times than they should, as
reported in PR python/29603. This was happening because the watchpoint is not
disabled when going out of scope.

This commit fixes this issue by disabling the watchpoint when going out of
scope. It also adds a test to ensure this feature isn't regressed in the
future.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29603
---
 gdb/breakpoint.c                           |  1 +
 gdb/testsuite/gdb.python/py-watchpoint.c   | 27 +++++++++++++
 gdb/testsuite/gdb.python/py-watchpoint.exp | 44 ++++++++++++++++++++++
 gdb/testsuite/gdb.python/py-watchpoint.py  | 31 +++++++++++++++
 4 files changed, 103 insertions(+)
 create mode 100644 gdb/testsuite/gdb.python/py-watchpoint.c
 create mode 100644 gdb/testsuite/gdb.python/py-watchpoint.exp
 create mode 100644 gdb/testsuite/gdb.python/py-watchpoint.py

diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index bff3bac7d1a..b78ae9c4993 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -1832,6 +1832,7 @@ watchpoint_del_at_next_stop (struct watchpoint *w)
       w->related_breakpoint = w;
     }
   w->disposition = disp_del_at_next_stop;
+  disable_breakpoint(w);
 }
 
 /* Extract a bitfield value from value VAL using the bit parameters contained in
diff --git a/gdb/testsuite/gdb.python/py-watchpoint.c b/gdb/testsuite/gdb.python/py-watchpoint.c
new file mode 100644
index 00000000000..6d02e87e571
--- /dev/null
+++ b/gdb/testsuite/gdb.python/py-watchpoint.c
@@ -0,0 +1,27 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2022 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see  <http://www.gnu.org/licenses/>.  */
+
+#include <stdio.h>
+
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 3; i++)
+    printf ("%d", i);
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.python/py-watchpoint.exp b/gdb/testsuite/gdb.python/py-watchpoint.exp
new file mode 100644
index 00000000000..863f3eff66a
--- /dev/null
+++ b/gdb/testsuite/gdb.python/py-watchpoint.exp
@@ -0,0 +1,44 @@
+# Copyright (C) 2022 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the GDB testsuite.  It checks Watchpoints
+# are deleted after used.
+
+load_lib gdb-python.exp
+
+standard_testfile
+
+if {[prepare_for_testing "failed to prepare" $testfile $srcfile]} {
+    return -1
+}
+
+# Skip all tests if Python scripting is not enabled.
+if { [skip_python_tests] } { continue }
+
+if ![runto_main] then {
+    return 0
+}
+
+#
+# Check Watchpoints are deleted after used
+#
+
+gdb_test "set can-use-hw-watchpoints 0" ".*" "Don't use hardware watchpoints"
+gdb_test "python print (len(gdb.breakpoints()))" "1" "check default BP count"
+gdb_test "source ${srcdir}/${subdir}/${testfile}.py" ".*Python script imported.*" \
+	 "import python scripts"
+gdb_test "python print (len(gdb.breakpoints()))" "2" "check modified BP count"
+gdb_test "continue" ".*Watchpoint Hit: 4.*" "run until program stops"
+gdb_test "python print (len(gdb.breakpoints()))" "1" "check BP count"
diff --git a/gdb/testsuite/gdb.python/py-watchpoint.py b/gdb/testsuite/gdb.python/py-watchpoint.py
new file mode 100644
index 00000000000..855c820b245
--- /dev/null
+++ b/gdb/testsuite/gdb.python/py-watchpoint.py
@@ -0,0 +1,31 @@
+# Copyright (C) 2022 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the GDB testsuite.  It checks Watchpoints
+# are deleted after used.
+
+class MyBreakpoint(gdb.Breakpoint):
+    def __init__(self, *args, **kwargs):
+        gdb.Breakpoint.__init__(self, *args, **kwargs)
+        self.i = 0
+    def stop(self):
+        self.i += 1
+        print("Watchpoint Hit:", self.i)
+        gdb.execute('print i')
+        return False
+
+MyBreakpoint('i', gdb.BP_WATCHPOINT)
+
+print("Python script imported")
-- 
2.34.1

base-commit: c99b2113a478a075e8d8f7c3848a92f1ce73f847

^ permalink raw reply	[flat|nested] 34+ messages in thread

end of thread, other threads:[~2023-05-11 16:09 UTC | newest]

Thread overview: 34+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-25  5:33 [PATCH] [PR python/29603] Fix deletion of Watchpoints Johnson Sun
2022-09-25 18:10 ` Lancelot SIX
2022-10-01  5:20 ` Johnson Sun
2022-10-01  5:27   ` [PATCH v2] [PR python/29603] Disable out-of-scope watchpoints Johnson Sun
2022-10-20 17:57     ` Johnson Sun
2022-10-20 18:11       ` [PATCH v3] " Johnson Sun
2022-11-18 12:17         ` [PING] " Johnson Sun
2022-11-25 15:11           ` [PING^2] " Johnson Sun
2022-12-04 16:45             ` [PING^3] " Johnson Sun
2022-12-12 21:44               ` [PING^4] " Johnson Sun
2022-12-20 22:08                 ` [PING^5] " Johnson Sun
2022-12-27 16:40                   ` [PING^6] " Johnson Sun
2023-01-12 18:34                     ` [PING^7] " Johnson Sun
2023-01-13 15:40         ` Simon Marchi
2023-01-23 10:15           ` Johnson Sun
2023-02-18 16:26             ` [PING] " Johnson Sun
2023-02-26  6:16               ` [RFC] " Johnson Sun
2023-03-12 17:24                 ` [PING] " Johnson Sun
2023-03-13 16:00             ` Simon Marchi
2023-03-23 18:25               ` Johnson Sun
2023-03-23 18:31                 ` [PATCH v4] " Johnson Sun
2023-04-09 20:47                   ` Johnson Sun
2023-04-09 20:49                     ` [PING] " Johnson Sun
2023-04-17 18:18                       ` [PING^2] " Johnson Sun
2023-04-17 18:56                   ` Simon Marchi
2023-04-23  9:46                     ` Johnson Sun
2023-04-23  9:54                       ` [PATCH v5] " Johnson Sun
2023-05-06 19:06                         ` [PING] " Johnson Sun
2023-05-09 18:50                         ` Simon Marchi
2023-05-10 17:22                           ` Johnson Sun
2023-05-11  2:08                             ` Simon Marchi
2023-05-11 15:46                               ` [PATCH v6] " Johnson Sun
2023-05-11 16:09                                 ` Simon Marchi
2023-05-11 15:50                               ` [PATCH v5] " Johnson Sun

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).