Disable out-of-scope watchpoints
authorJohnson Sun <j3.soon777@gmail.com>
Thu, 11 May 2023 15:46:20 +0000 (23:46 +0800)
committerSimon Marchi <simon.marchi@efficios.com>
Thu, 11 May 2023 16:09:10 +0000 (12:09 -0400)
commit6e96d8a9702d1fef3eb6de47bb84bdea578eb1bb
treeb0d72f824dfacd1b7ec82a35d9f1d97b3f82a94a
parent8b331fa16ba85f7e539547bf483b9ef359ca760f
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
gdb/breakpoint.c
gdb/testsuite/gdb.python/py-watchpoint.c [new file with mode: 0644]
gdb/testsuite/gdb.python/py-watchpoint.exp [new file with mode: 0644]
gdb/testsuite/gdb.python/py-watchpoint.py [new file with mode: 0644]