From: Johnson Sun <j3.soon777@gmail.com>
To: gdb-patches@sourceware.org
Cc: j3.soon777@gmail.com
Subject: [PATCH] [PR python/29603] Fix deletion of Watchpoints
Date: Sun, 25 Sep 2022 13:33:50 +0800 [thread overview]
Message-ID: <20220925053349.918439-1-j3.soon777@gmail.com> (raw)
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
next reply other threads:[~2022-09-25 5:35 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-25 5:33 Johnson Sun [this message]
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
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=20220925053349.918439-1-j3.soon777@gmail.com \
--to=j3.soon777@gmail.com \
--cc=gdb-patches@sourceware.org \
/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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).