diff options
author | Johnson Sun <j3.soon777@gmail.com> | 2023-05-11 23:46:20 +0800 |
---|---|---|
committer | Simon Marchi <simon.marchi@efficios.com> | 2023-05-11 12:09:10 -0400 |
commit | 6e96d8a9702d1fef3eb6de47bb84bdea578eb1bb (patch) | |
tree | b0d72f824dfacd1b7ec82a35d9f1d97b3f82a94a /gdb/breakpoint.c | |
parent | 8b331fa16ba85f7e539547bf483b9ef359ca760f (diff) | |
download | fsf-binutils-gdb-6e96d8a9702d1fef3eb6de47bb84bdea578eb1bb.zip fsf-binutils-gdb-6e96d8a9702d1fef3eb6de47bb84bdea578eb1bb.tar.gz fsf-binutils-gdb-6e96d8a9702d1fef3eb6de47bb84bdea578eb1bb.tar.bz2 |
Disable out-of-scope watchpoints
Currently, when a local software watchpoint goes out of scope, GDB sets
the watchpoint's disposition to `delete at next stop' and then normal
stops (i.e., stop and wait for the next GDB command). When GDB normal
stops, it automatically deletes the breakpoints with their disposition
set to `delete at next stop'.
Suppose a Python script decides not to normal stop when a local
software watchpoint goes out of scope, the watchpoint will not be
automatically deleted even when its disposition is set to
`delete at next stop'.
Since GDB single-steps the program and tests the watched expression
after each instruction, not deleting the watchpoint causes the
watchpoint to be hit many more times than it should, as reported in
PR python/29603.
This was happening because the watchpoint is not deleted or 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.
Calling `breakpoint_auto_delete' on all kinds of stops (in
`fetch_inferior_event') seem to solve this issue, but is in fact
inappropriate, since `breakpoint_auto_delete' goes over all breakpoints
instead of just going through the bpstat chain (which only contains the
breakpoints that were hit right now).
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29603
Change-Id: Ia85e670b2bcba2799219abe4b6be3b582387e383
Diffstat (limited to 'gdb/breakpoint.c')
-rw-r--r-- | gdb/breakpoint.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index dcb00bf..fdb184a 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1844,6 +1844,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 |