I investigated some problem on arm-linux in a gdb.in script, and added "set debug frame on". I ran into: ... [frame] frame_unwind_register_value: exit gdb.in:9: Error in sourced command file: value is not available ... and the script stopped. The corresponding backtrace is: ... (gdb) bt #0 0xf75906d2 in __cxa_throw () from /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 #1 0xab1ccffa in throw_it (reason=RETURN_ERROR, error=NOT_AVAILABLE_ERROR, fmt=0xab3098ec "value is not available", ap=...) at /home/rock/gdb/src/gdbsupport/common-exceptions.cc:204 #2 0xab1cd076 in throw_verror (error=NOT_AVAILABLE_ERROR, fmt=0xab3098ec "value is not available", ap=...) at /home/rock/gdb/src/gdbsupport/common-exceptions.cc:212 #3 0xab1cd0a8 in throw_error (error=NOT_AVAILABLE_ERROR, fmt=0xab3098ec "value is not available") at /home/rock/gdb/src/gdbsupport/common-exceptions.cc:227 #4 0xab0490b6 in value::require_available (this=0xab5975d8) at /home/rock/gdb/src/gdb/value.c:1137 #5 0xab0499b0 in value::contents (this=0xab5975d8) at /home/rock/gdb/src/gdb/value.c:1307 #6 0xaad837ec in frame_unwind_register_value (next_frame=..., regnum=91) at /home/rock/gdb/src/gdb/frame.c:1320 #7 0xab04eae8 in value::fetch_lazy_register (this=0xab542d68) at /home/rock/gdb/src/gdb/value.c:3962 #8 0xab04f09c in value::fetch_lazy (this=0xab542d68) at /home/rock/gdb/src/gdb/value.c:4057 #9 0xab049a50 in value::optimized_out (this=0xab542d68) at /home/rock/gdb/src/gdb/value.c:1339 #10 0xaad83718 in frame_unwind_register_value (next_frame=..., regnum=91) at /home/rock/gdb/src/gdb/frame.c:1299 #11 0xaad8316e in frame_register_unwind (next_frame=..., regnum=91, optimizedp=0xfffee5a4, unavailablep=0xfffee5a0, lvalp=0xfffee5a8, addrp=0xfffee598, realnump=0xfffee594, bufferp=0x0) at /home/rock/gdb/src/gdb/frame.c:1190 #12 0xaaf3f2ba in info_frame_command_core (fi=..., selected_frame_p=false) at /home/rock/gdb/src/gdb/stack.c:1761 #13 0xaaf448c6 in frame_command_helper<info_frame_command_core>::level ( arg=0xfffef17f "0", from_tty=0) at /home/rock/gdb/src/gdb/stack.c:1891 #14 0xaaf444b4 in frame_command_helper<info_frame_command_core>::base_command ( arg=0xfffef17f "0", from_tty=0) at /home/rock/gdb/src/gdb/stack.c:1966 #15 0xaac2774e in do_simple_func (args=0xfffef17f "0", from_tty=0, c=0xab4d42c0) at /home/rock/gdb/src/gdb/cli/cli-decode.c:95 #16 0xaac2afaa in cmd_func (cmd=0xab4d42c0, args=0xfffef17f "0", from_tty=0) at /home/rock/gdb/src/gdb/cli/cli-decode.c:2742 #17 0xaafac12a in execute_command (p=0xfffef17f "0", from_tty=0) at /home/rock/gdb/src/gdb/top.c:571 #18 0xaad5c76a in command_handler (command=0xfffef174 "info frame 0") at /home/rock/gdb/src/gdb/event-top.c:566 #19 0xaafab920 in read_command_file (stream=0xab4b9818) at /home/rock/gdb/src/gdb/top.c:338 #20 0xaac3678e in script_from_file (stream=0xab4b9818, file=0xfffef811 "gdb.in") at /home/rock/gdb/src/gdb/cli/cli-script.c:1644 #21 0xaac205d6 in source_script_from_stream (stream=0xab4b9818, file=0xfffef811 "gdb.in", file_to_open=0xfffef268 "gdb.in") at /home/rock/gdb/src/gdb/cli/cli-cmds.c:730 #22 0xaac206dc in source_script_with_search (file=0xfffef811 "gdb.in", from_tty=0, search_path=0) at /home/rock/gdb/src/gdb/cli/cli-cmds.c:775 #23 0xaac20730 in source_script (file=0xfffef811 "gdb.in", from_tty=0) at /home/rock/gdb/src/gdb/cli/cli-cmds.c:784 #24 0xaae3516c in catch_command_errors ( command=0xaac2071d <source_script(char const*, int)>, arg=0xfffef811 "gdb.in", from_tty=0, do_bp_actions=false) at /home/rock/gdb/src/gdb/main.c:507 #25 0xaae352e6 in execute_cmdargs (cmdarg_vec=0xfffef404, file_type=CMDARG_FILE, cmd_type=CMDARG_COMMAND, ret=0xfffef3f4) at /home/rock/gdb/src/gdb/main.c:603 #26 0xaae36714 in captured_main_1 (context=0xfffef544) at /home/rock/gdb/src/gdb/main.c:1304 #27 0xaae368e2 in captured_main (data=0xfffef544) at /home/rock/gdb/src/gdb/main.c:1325 #28 0xaae3694c in gdb_main (args=0xfffef544) at /home/rock/gdb/src/gdb/main.c:1354 #29 0xaaaee8ea in main (argc=5, argv=0xfffef6b4) at /home/rock/gdb/src/gdb/gdb.c:39 ... The problem is here in frame_unwind_register_value: ... if (value->lazy ()) gdb_printf (&debug_file, " lazy"); else { int i; gdb::array_view<const gdb_byte> buf = value->contents (); ... It doesn't check for the value->entirely_available () case. This fixes it: ... diff --git a/gdb/frame.c b/gdb/frame.c index fae89cbbc0a..4b97c23e3d5 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -1314,6 +1314,8 @@ frame_unwind_register_value (frame_info_ptr next_frame, int regnum) if (value->lazy ()) gdb_printf (&debug_file, " lazy"); + else if (!value->entirely_available ()) + gdb_printf (&debug_file, " unavailable"); else { int i; ...
https://sourceware.org/pipermail/gdb-patches/2024-February/206526.html
The master branch has been updated by Tom de Vries <vries@sourceware.org>: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=2aaba7444679492ae9e2757d7d05ba63bd2ec3c7 commit 2aaba7444679492ae9e2757d7d05ba63bd2ec3c7 Author: Tom de Vries <tdevries@suse.de> Date: Mon Feb 26 15:31:34 2024 +0100 [gdb] Fix "value is not available" with debug frame On arm-linux, with a started hello world, running "info frame" works fine, but when I set debug frame to on, I run into: ... (gdb) info frame ... [frame] frame_unwind_register_value: exit value is not available (gdb) ... The problem is here in frame_unwind_register_value: ... if (value->lazy ()) gdb_printf (&debug_file, " lazy"); else { int i; gdb::array_view<const gdb_byte> buf = value->contents (); ... where we call value->contents () while !value->entirely_available (). Fix this by checking value->entirely_available () and printing: ... [frame] frame_unwind_register_value: -> register=91 unavailable ... Tested on arm-linux. PR gdb/31369 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31369
Fixed.