[binutils-gdb/gdb-17-branch] [gdb/breakpoints] Don't ignore <file> in rbreak <file>:<regexp>
Tom de Vries via Gdb-cvs <[email protected]>
| Newsgroups | gmane.comp.gdb.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=063b0d3f0b34799e2abf312936945c4297d22ce2 commit 063b0d3f0b34799e2abf312936945c4297d22ce2 Author: Tom de Vries <[email protected]> Date: Tue Apr 28 16:12:44 2026 +0200 [gdb/breakpoints] Don't ignore <file> in rbreak <file>:<regexp> PR breakpoints/34112 reports that "rbreak <file>:<regexp>" sets breakpoints in files other than <file>. This is a regression since commit c4c093a31f6 ("Make global_symbol_searcher::filenames private"), which did: ... if (file_name != nullptr) - spec.filenames.push_back (file_name); + spec.add_filename (std::move (file_name)); ... The std::move nullifies file_name, so a subsequent file_name check: ... if (file_name != nullptr) ... now always evaluates to false. Fix this by: - introducing a variable bool file_name_p, initialized before the std::move, and - using that instead. Tested on x86_64-linux. Approved-By: Tom Tromey <[email protected]> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34112 Diff: --- gdb/symtab.c | 9 +++++++-- gdb/testsuite/gdb.base/rbreak-2.c | 28 ++++++++++++++++++++++++++++ gdb/testsuite/gdb.base/rbreak.c | 30 ++++++++++++++++++++++++++++++ gdb/testsuite/gdb.base/rbreak.exp | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 2 deletions(-) diff --git a/gdb/symtab.c b/gdb/symtab.c index 34f38e24efb..ebd08cfeaa2 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -5648,8 +5648,13 @@ rbreak_command (const char *regexp, int from_tty) } } + /* Compute this property now. We want to use the property after + std::move (file_name), but at that point we can no longer compute it + because the std::move nullifies file_name. */ + bool file_name_p = file_name != nullptr; + global_symbol_searcher spec (SEARCH_FUNCTION_DOMAIN, regexp); - if (file_name != nullptr) + if (file_name_p) spec.add_filename (std::move (file_name)); std::vector<symbol_search> symbols = spec.search (); @@ -5662,7 +5667,7 @@ rbreak_command (const char *regexp, int from_tty) std::string name; if (p.msymbol.minsym == nullptr) { - if (file_name != nullptr) + if (file_name_p) { struct symtab *symtab = p.symbol->symtab (); const char *fullname = symtab_to_fullname (symtab); diff --git a/gdb/testsuite/gdb.base/rbreak-2.c b/gdb/testsuite/gdb.base/rbreak-2.c new file mode 100644 index 00000000000..f0d30df2f3c --- /dev/null +++ b/gdb/testsuite/gdb.base/rbreak-2.c @@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2026 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/>. */ + +static int +foo (void) +{ + return 0; +} + +int +bar (void) +{ + return foo (); +} diff --git a/gdb/testsuite/gdb.base/rbreak.c b/gdb/testsuite/gdb.base/rbreak.c new file mode 100644 index 00000000000..9df951f3397 --- /dev/null +++ b/gdb/testsuite/gdb.base/rbreak.c @@ -0,0 +1,30 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2026 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/>. */ + +static int +foo (void) +{ + return 1; +} + +extern int bar (void); + +int +main (void) +{ + return foo () + bar (); +} diff --git a/gdb/testsuite/gdb.base/rbreak.exp b/gdb/testsuite/gdb.base/rbreak.exp new file mode 100644 index 00000000000..94629357ef5 --- /dev/null +++ b/gdb/testsuite/gdb.base/rbreak.exp @@ -0,0 +1,32 @@ +# Copyright 2026 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/>. + +# Check rbreak <file>:<regexp> command. + +standard_testfile .c -2.c + +if { [prepare_for_testing "failed to prepare" $testfile \ + [list $srcfile $srcfile2]] } { + return -1 +} + +# Regression test for PR34112. Check that "rbreak $srcfile:foo" doesn't set +# a breakpoint on $srcfile2:foo. +set re_line \ + "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal\\." +gdb_test "rbreak $srcfile:foo" \ + [multi_line \ + $re_line \ + ".*"]