Re: [PATCH] gdb: fix breakpoints on inline functions qualified with source file name

Guinevere Larsen <[email protected]>
Newsgroups gmane.comp.gdb.patches
Message-ID <[email protected]>
On 7/30/26 3:15 AM, Markus Metzger wrote:
> On 'break foo.[hc]:foo', GDB only searches the symbols of foo.[hc] on file
> scope.  If foo has been inlined, GDB would not find it.
>
> On 'break foo', however, GDB also searches local blocks for inline
> function symbols in iterate_over_all_matching_symtabs(), which is called
> indirectly from add_matching_symbols_to_info().
>
> Add that functionality to add_matching_symbols_to_info() in case it is
> called with a list of file symtabs to search.
> ---

Hi Markus!

I looked through and confirmed it fixes the test case you added, so all 
looks good!

I wonder, though, does it make sense to add this code to some common 
place, so that future code isn't going to forget to add this handling a 
well. Have you tried adding it to the iterate_over_file_blocks code?

-- 
Cheers,
Guinevere Larsen
it/its
she/her (deprecated)

>   gdb/linespec.c                           | 14 ++++++++++
>   gdb/testsuite/gdb.base/break-inline2.c   | 33 ++++++++++++++++++++++++
>   gdb/testsuite/gdb.base/break-inline2.exp | 30 +++++++++++++++++++++
>   gdb/testsuite/gdb.base/break-inline2.h   | 28 ++++++++++++++++++++
>   4 files changed, 105 insertions(+)
>   create mode 100644 gdb/testsuite/gdb.base/break-inline2.c
>   create mode 100644 gdb/testsuite/gdb.base/break-inline2.exp
>   create mode 100644 gdb/testsuite/gdb.base/break-inline2.h
>
> diff --git a/gdb/linespec.c b/gdb/linespec.c
> index b6505ba283d..384c989ef2f 100644
> --- a/gdb/linespec.c
> +++ b/gdb/linespec.c
> @@ -4276,6 +4276,20 @@ add_matching_symbols_to_info (const char *name,
>   	  set_current_program_space (elt_pspace);
>   	  iterate_over_file_blocks (elt, lookup_name, SEARCH_VFT, add_symbol);
>   
> +	  /* Search local blocks for inline functions, too.  */
> +	  const blockvector *bv = elt->compunit ().blockvector ();
> +	  for (int i = FIRST_LOCAL_BLOCK; i < bv->num_blocks (); i++)
> +	    {
> +	      const struct block *block = bv->block (i);
> +	      info->state->language->for_each_symbol
> +		(block, lookup_name, SEARCH_VFT,
> +		 [&] (block_symbol *bsym)
> +		   {
> +		     if (bsym->symbol->is_inlined ())
> +		       add_symbol (bsym);
> +		   });
> +	    }
> +
>   	  /* If no new symbols were found in this iteration and this symtab
>   	     is in assembler, we might actually be looking for a label for
>   	     which we don't have debug info.  Check for a minimal symbol in
> diff --git a/gdb/testsuite/gdb.base/break-inline2.c b/gdb/testsuite/gdb.base/break-inline2.c
> new file mode 100644
> index 00000000000..797ab07da31
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/break-inline2.c
> @@ -0,0 +1,33 @@
> +/* 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/>.  */
> +
> +#include "break-inline2.h"
> +
> +static int
> +test (void)
> +{
> +  int f = foo ();
> +  int b = bar ();
> +  return f + b;
> +}
> +
> +int
> +main (void)
> +{
> + /* Don't make breakpoints on foo and main bind to the same address. */
> +  return test ();
> +}
> diff --git a/gdb/testsuite/gdb.base/break-inline2.exp b/gdb/testsuite/gdb.base/break-inline2.exp
> new file mode 100644
> index 00000000000..b10cdece118
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/break-inline2.exp
> @@ -0,0 +1,30 @@
> +#   Copyright (C) 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/>.
> +
> +standard_testfile
> +
> +if {[prepare_for_testing "failed to prepare" "$testfile" "$srcfile"]} {
> +    return
> +}
> +
> +if {![runto_main]} {
> +    return
> +}
> +
> +gdb_breakpoint "$testfile.h:foo" -message -allow-pending
> +gdb_breakpoint bar -message -allow-pending
> +
> +gdb_continue_to_breakpoint "foo" ".*foo.entry.*"
> +gdb_continue_to_breakpoint "bar" ".*bar.entry.*"
> diff --git a/gdb/testsuite/gdb.base/break-inline2.h b/gdb/testsuite/gdb.base/break-inline2.h
> new file mode 100644
> index 00000000000..e60d054e85b
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/break-inline2.h
> @@ -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 inline int __attribute__((always_inline))
> +foo (void) /* foo.entry */
> +{ /* foo.entry */
> +  return 42; /* foo.entry */
> +}
> +
> +static inline int __attribute__((always_inline))
> +bar (void) /* bar.entry */
> +{ /* bar.entry */
> +  return 42; /* bar.entry */
> +}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.