From f29ab2e0e350a4b382a1e4eb1b41c28564d83e94 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Tue, 22 Aug 2023 16:07:02 +0100 Subject: [PATCH] gdb: add missing notify_breakpoint_modified call The commit: commit b080fe54fb3414b488b8ef323c6c50def061f918 Date: Tue Nov 8 12:32:51 2022 +0000 gdb: add inferior-specific breakpoints introduced a bug in the function breakpoint_set_inferior. The above commit includes this line: gdb::observers::breakpoint_modified.notify (b); when it should have instead used this line: notify_breakpoint_modified (b); The change to use notify_breakpoint_modified was introduced to GDB after commit b080fe54fb34 was written, but before it was merged, and I failed to update this part of the code during the rebase. The consequence of this error is that the MI interpreter will not emit breakpoint-modified notifications when breakpoint_set_inferior is called. In this commit I update the code to call notify_breakpoint_modified, and add a test that checks the MI events are being emitted correctly in this case. --- gdb/breakpoint.c | 2 +- gdb/testsuite/gdb.mi/mi-py-modify-bp.c | 28 +++++++++++ gdb/testsuite/gdb.mi/mi-py-modify-bp.exp | 61 ++++++++++++++++++++++++ gdb/testsuite/gdb.mi/mi-py-modify-bp.py | 25 ++++++++++ 4 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.mi/mi-py-modify-bp.c create mode 100644 gdb/testsuite/gdb.mi/mi-py-modify-bp.exp create mode 100644 gdb/testsuite/gdb.mi/mi-py-modify-bp.py diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index f88ca1c9b65..f0f5328fb5e 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1574,7 +1574,7 @@ breakpoint_set_inferior (struct breakpoint *b, int inferior) int old_inferior = b->inferior; b->inferior = inferior; if (old_inferior != inferior) - gdb::observers::breakpoint_modified.notify (b); + notify_breakpoint_modified (b); } /* See breakpoint.h. */ diff --git a/gdb/testsuite/gdb.mi/mi-py-modify-bp.c b/gdb/testsuite/gdb.mi/mi-py-modify-bp.c new file mode 100644 index 00000000000..58546b33387 --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-py-modify-bp.c @@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright (C) 2023 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 . */ + +int +foo () +{ + return 0; +} + +int +main () +{ + return foo (); +} diff --git a/gdb/testsuite/gdb.mi/mi-py-modify-bp.exp b/gdb/testsuite/gdb.mi/mi-py-modify-bp.exp new file mode 100644 index 00000000000..95a26eab672 --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-py-modify-bp.exp @@ -0,0 +1,61 @@ +# Copyright (C) 2023 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 . + +# Check that the MI interpreter correctly emits breakpoint-modified +# notifications when a breakpoint's thread or inferior is set from +# Python code. + +load_lib mi-support.exp +set MIFLAGS "-i=mi" + +standard_testfile + +require allow_python_tests + +if {[build_executable $testfile.exp $testfile $srcfile] == -1} { + return -1 +} + +set remote_python_file [gdb_remote_download host \ + ${srcdir}/${subdir}/${testfile}.py] + +mi_clean_restart $binfile +mi_runto_main + +# Delete all breakpoints. +mi_delete_breakpoints + +# Create a breakpoint. At this point the breakpoint is global, but +# this will be adjusted from Python code. +mi_create_breakpoint "foo" "break in foo" -disp keep -func foo +set bpnum [mi_get_valueof "/d" "\$bpnum" "INVALID" \ + "get number for thread-specific breakpoint"] + +# Some patterns used in the expected output below. +set thr_group_re [string_to_regexp {thread-groups=["i1"]}] +set times_re [string_to_regexp {times="0"}] + +# Source the Python script, the script changes the thread then +# inferior field of the first breakpoint, we expect to see the +# breakpoint modified four times. +mi_gdb_test "source $remote_python_file" \ + [multi_line \ + "&\"source \[^\r\n\]+\"" \ + "=breakpoint-modified,bkpt=\\{number=\"$bpnum\",\[^\r\n\]+\\,$thr_group_re,thread=\"1\",$times_re,\[^\r\n\]+}" \ + "=breakpoint-modified,bkpt=\\{number=\"$bpnum\",\[^\r\n\]+\\,$thr_group_re,$times_re,\[^\r\n\]+}" \ + "=breakpoint-modified,bkpt=\\{number=\"$bpnum\",\[^\r\n\]+\\,$thr_group_re,inferior=\"1\",$times_re,\[^\r\n\]+}" \ + "=breakpoint-modified,bkpt=\\{number=\"$bpnum\",\[^\r\n\]+\\,$thr_group_re,$times_re,\[^\r\n\]+}" \ + "\\^done"] \ + "source python script" diff --git a/gdb/testsuite/gdb.mi/mi-py-modify-bp.py b/gdb/testsuite/gdb.mi/mi-py-modify-bp.py new file mode 100644 index 00000000000..6e1034c38bd --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-py-modify-bp.py @@ -0,0 +1,25 @@ +# Copyright (C) 2023 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 . + +import gdb + +bps = gdb.breakpoints() +bp = bps[0] + +bp.thread = 1 +bp.thread = None + +bp.inferior = 1 +bp.inferior = None -- 2.30.2