From: Tom de Vries <tdevries@suse.de>
To: Andrew Burgess <aburgess@redhat.com>, gdb-patches@sourceware.org
Cc: Abhay Kandpal <abhay@linux.ibm.com>, Tom Tromey <tom@tromey.com>
Subject: Re: [PATCH 2/2] gdb: catch some exceptions in find_function_in_inferior
Date: Fri, 11 Sep 2026 13:07:36 +0200 [thread overview]
Message-ID: <5424362d-623e-459a-b06f-a0d9530c83dc@suse.de> (raw)
In-Reply-To: <f352710d6b5665bfeba0798c3acbe943bc480aac.1789034019.git.aburgess@redhat.com>
On 9/10/26 3:13 PM, Andrew Burgess wrote:
> After commit:
>
> commit 32090b27e92cb8fd4998e8e8e65d43f445545bc7
> Date: Wed Sep 2 10:43:34 2026 +0100
>
> gdb: fix incorrect search domain in find_function_in_inferior
>
> Bug PR gdb/34602 was created which details some new regressions that
> were introduced for the tests:
>
> gdb.ada/funcall_ref.exp
> gdb.ada/arrayparam.exp
> gdb.compile/compile.exp
> gdb.compile/compile-cplus.exp
>
> The previous commit fixed the gdb.compile/ regressions, and this
> commit fixes the gdb.ada/ regressions.
>
Hi Andrew,
thanks for working on this.
I've applied both patches and did a build and test run, and the
regressions are fixed.
> I initially struggled to reproduce this issue. The bug was reported
> against an openSUSE system, and in the end I was only able to
> reproduce it on a similar openSUSE system. I suspect this is related
> to the original reporter, and myself, not having a particular debug
> package installed.
>
This is an interesting question, so I decided to investigate.
The first thing I found was that the alias system.crtl.malloc == malloc
is present due to extra debug info in the executable. FWIW, it comes
from ./gcc/ada/libgnat/s-crtl.ads:
...
function malloc (Size : size_t) return System.Address;
pragma Import (C, malloc, "malloc");
...
In terms of debug info, the alias uses a DW_AT_linkage attribute to
point to malloc.
I found a test-case in the testsuite (gdb.ada/lang_switch.exp) that also
uses pragma import, but in a simpler setup: unlike here the alias points
to a function in the same executable. In case the c function is
represented in the debug info, the alias target is found. Otherwise,
not. This seems incorrect to me, so I filed a PR for this (
https://sourceware.org/bugzilla/show_bug.cgi?id=34627 ).
Then the question, is debug info missing for malloc? That doesn't seem
to be the case:
...
$ gdb -q -batch outputs/gdb.ada/funcall_ref/foo-all -ex start \
-ex "set language c" -ex "p malloc"
...
$1 = {void *(size_t)} 0x7ffff7d63d2e <__GI___libc_malloc>
...
Looking at ada_alias_get_block_value, ISTM that using
lookup_global_symbol means that it doesn't look beyond the exec
containing the alias. So in conclusion, I'd say the debug information
is present, but ignored.
This might be due to a gdb bug, so I filed a PR (
https://sourceware.org/bugzilla/show_bug.cgi?id=34628 ).
I haven't reviewed the patch in detail, but the idea sounds good to.
Acked-By: Tom de Vries <tdevries@suse.de>
Thanks,
- Tom
> The tests in question need to allocate memory in the inferior. To do
> this they call value_allocate_space_in_inferior, this calls
> find_function_in_inferior, which after commit 32090b27e92cb8fd makes a
> successful call to lookup_symbol. This results in a backtrace like
> this:
>
> #0 ada_alias_get_block_value (sym=0x213da30) at ../../src/gdb/dwarf2/ada-imported.c:107
> #1 0x0000000000db8775 in symbol::value_block (this=0x213da30) at ../../src/gdb/symtab.c:6619
> #2 0x000000000045cc1f in remove_extra_symbols (syms=std::__debug::vector of length 2, capacity 2 = {...}) at ../../src/gdb/ada-lang.c:5182
> #3 0x000000000045e236 in ada_lookup_symbol_list_worker (lookup_name=..., block=0x0, domain=..., full_search=true) at ../../src/gdb/ada-lang.c:5702
> #4 0x000000000045e3c9 in ada_lookup_symbol_list (name=0x16a3ae4 "malloc", block=0x0, domain=...) at ../../src/gdb/ada-lang.c:5727
> #5 0x000000000045e4bf in ada_lookup_symbol (name=0x16a3ae4 "malloc", block0=0x0, domain=...) at ../../src/gdb/ada-lang.c:5758
> #6 0x000000000047b15a in ada_language::lookup_symbol_nonlocal (this=0x1bfd2c0 <ada_language_defn>, name=0x16a3ae4 "malloc", block=0x0, domain=...) at ../../src/gdb/ada-lang.c:13839
> #7 0x0000000000dac991 in lookup_symbol_aux (name=0x16a3ae4 "malloc", match_type=symbol_name_match_type::FULL, block=0x0, domain=..., language=language_ada, is_a_field_of_this=0x0) at ../../src/gdb/symtab.c:2150
> #8 0x0000000000dabfab in lookup_symbol_in_language (name=0x16a3ae4 "malloc", block=0x0, domain=..., lang=language_ada, is_a_field_of_this=0x0) at ../../src/gdb/symtab.c:1961
> #9 0x0000000000dac042 in lookup_symbol (name=0x16a3ae4 "malloc", block=0x0, domain=..., is_a_field_of_this=0x0) at ../../src/gdb/symtab.c:1974
> #10 0x0000000000f36346 in find_function_in_inferior (name=0x16a3ae4 "malloc", objf_p=0x7fffffffbef8) at ../../src/gdb/valops.c:122
> #11 0x0000000000f36542 in value_allocate_space_in_inferior (len=8) at ../../src/gdb/valops.c:186
>
> If GDB is unable to find the Ada alias for the function to be called
> then an exception is thrown. This exception propagates all the way
> out of value_allocate_space_in_inferior, causing the allocation to
> fail, and as a consequence, the test to fail.
>
> My thinking here is that, if the lookup_symbol call throws an
> exception then we should catch this in find_function_in_inferior and
> ignore it. The find_function_in_inferior has a minimal symbol
> fallback path, so if the full symbol lookup throws an exception that
> doesn't mean we cannot try the minimal symbol path.
>
> That's what I have implemented here. With this done the gdb.ada/
> tests are now passing on my openSUSE test machine.
>
> No new tests here as the original failure relies on being in an
> environment where there is insufficient debug information to find the
> Ada malloc function alias.
>
> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34602
> ---
> gdb/valops.c | 31 ++++++++++++++++++++++---------
> 1 file changed, 22 insertions(+), 9 deletions(-)
>
> diff --git a/gdb/valops.c b/gdb/valops.c
> index 2ff15de7c68..a235a0ebe8d 100644
> --- a/gdb/valops.c
> +++ b/gdb/valops.c
> @@ -112,21 +112,34 @@ show_overload_resolution (struct ui_file *file, int from_tty,
> struct value *
> find_function_in_inferior (const char *name, struct objfile **objf_p)
> {
> - struct block_symbol sym;
> bound_minimal_symbol msymbol;
>
> - sym = lookup_symbol (name, nullptr, SEARCH_FUNCTION_DOMAIN, nullptr);
> - if (sym.symbol != nullptr)
> + try
> {
> - msymbol = find_gnu_ifunc (sym.symbol);
> - if (msymbol.minsym == nullptr)
> + block_symbol sym = lookup_symbol (name, nullptr, SEARCH_FUNCTION_DOMAIN,
> + nullptr);
> +
> + if (sym.symbol != nullptr)
> {
> - if (objf_p != nullptr)
> - *objf_p = sym.symbol->objfile ();
> - return value_of_variable (sym.symbol, sym.block);
> + msymbol = find_gnu_ifunc (sym.symbol);
> + if (msymbol.minsym == nullptr)
> + {
> + if (objf_p != nullptr)
> + *objf_p = sym.symbol->objfile ();
> + return value_of_variable (sym.symbol, sym.block);
> + }
> }
> }
> - else
> + catch (const gdb_exception_error &)
> + {
> + /* Ignore the error. If there's a problem looking for the full
> + symbol then we shouldn't give up, we should fall back to
> + looking for the minimal symbol. */
> + }
> +
> + /* If we didn't find an IFunc related minimal symbol above, then
> + look for a suitable minimal symbol now. */
> + if (msymbol.minsym == nullptr)
> msymbol = lookup_minimal_symbol (current_program_space, name);
>
> if (msymbol.minsym != nullptr)
next prev parent reply other threads:[~2026-09-11 11:08 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-10 13:13 [PATCH 0/2] Fix regressions after find_function_in_inferior changes Andrew Burgess
2026-09-10 13:13 ` [PATCH 1/2] gdb: fill in default return types for some inferior function calls Andrew Burgess
2026-09-11 14:38 ` Tom Tromey
2026-09-10 13:13 ` [PATCH 2/2] gdb: catch some exceptions in find_function_in_inferior Andrew Burgess
2026-09-11 11:07 ` Tom de Vries [this message]
2026-09-11 14:42 ` Tom Tromey
2026-09-11 14:43 ` [PATCH 0/2] Fix regressions after find_function_in_inferior changes Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5424362d-623e-459a-b06f-a0d9530c83dc@suse.de \
--to=tdevries@suse.de \
--cc=abhay@linux.ibm.com \
--cc=aburgess@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=tom@tromey.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox