Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Tom de Vries <tdevries@suse.de>
To: Andrew Burgess <aburgess@redhat.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH] [gdb/tui] Fix crash with debuginfod query
Date: Thu, 15 Jan 2026 14:13:31 +0100	[thread overview]
Message-ID: <5dbfe8e2-5f2b-40a3-80ca-09098df913df@suse.de> (raw)
In-Reply-To: <87pl7bt6nz.fsf@redhat.com>

On 1/15/26 1:13 PM, Andrew Burgess wrote:
> Tom de Vries <tdevries@suse.de> writes:
> 
>> PR tui/31449 reports a SIGFPE when the debuginfod query happens while enabling
>> TUI using the "tui enable" command:
>> ...
>> Thread 1 "gdb" received signal SIGFPE, Arithmetic exception.
>> 0x0000000001021084 in tui_inject_newline_into_command_window ()
>>      at /data/vries/gdb/src/gdb/tui/tui-io.c:1096
>> 1096	      py += px / tui_cmd_win ()->width;
>> ...
>> due to divide-by-zero because tui_cmd_win ()->width == 0.
>>
>> The corresponding backtrace is:
>> ...
>>   (gdb) bt
>>   #0  0x0000000001021084 in tui_inject_newline_into_command_window ()
>>       at gdb/tui/tui-io.c:1096
>>   #1  0x0000000000fe65fd in gdb_readline_wrapper_line (line=...) at gdb/top.c:939
>>   #2  0x0000000000944eef in gdb_rl_callback_handler (rl=0x2cc865a0 "n")
>>       at gdb/event-top.c:288
>>   #3  0x0000000001175779 in rl_callback_read_char ()
>>       at readline/readline/callback.c:302
>>   #4  0x0000000000944bc3 in gdb_rl_callback_read_char_wrapper_sjlj ()
>>       at gdb/event-top.c:197
>>   #5  0x0000000000944cd4 in gdb_rl_callback_read_char_wrapper_noexcept ()
>>       at gdb/event-top.c:240
>>   #6  0x0000000000944d52 in gdb_rl_callback_read_char_wrapper (...)
>>       at gdb/event-top.c:252
>>   #7  0x0000000001062352 in stdin_event_handler (error=0, client_data=0x2c865150)
>>       at gdb/ui.c:154
>>   #8  0x0000000001a04edf in handle_file_event (file_ptr=0x2ccf8850, ready_mask=1)
>>       at gdbsupport/event-loop.cc:551
>>   #9  0x0000000001a05522 in gdb_wait_for_event (block=1)
>>       at gdbsupport/event-loop.cc:672
>>   #10 0x0000000001a043ff in gdb_do_one_event (mstimeout=-1)
>>       at gdbsupport/event-loop.cc:263
>>   #11 0x00000000006d5480 in interp::do_one_event (this=0x2cc2af20, mstimeout=-1)
>>       at gdb/interps.h:93
>>   #12 0x0000000000fe670d in gdb_readline_wrapper (
>>       prompt=0x2ccca4e0 "Enable debuginfod for this session? (y or [n]) ")
>>       at gdb/top.c:1033
>>   #13 0x00000000010c6853 in defaulted_query(...) (...)
>>       at gdb/utils.c:844
>>   #14 0x00000000010c6b8a in nquery (...)
>>       at gdb/utils.c:901
>>   #15 0x00000000007a9324 in debuginfod_is_enabled ()
>>       at gdb/debuginfod-support.c:268
>>   #16 0x00000000007a950d in debuginfod_source_query (...)
>>       at gdb/debuginfod-support.c:311
>>   #17 0x0000000000efc2c7 in open_source_file (s=0x2cc8f4b0) at gdb/source.c:1152
>>   #18 0x0000000000efc619 in symtab_to_fullname (...) at gdb/source.c:1214
>>   #19 0x0000000000f5ebb3 in find_line_symtab (...)
>>       at gdb/symtab.c:3287
>>   #20 0x0000000000f5f0e5 in find_pc_for_line (...)
>>       at gdb/symtab.c:3391
>>   #21 0x0000000001011f54 in tui_get_begin_asm_address (...)
>>       at gdb/tui/tui-disasm.c:404
>>   #22 0x000000000104888d in tui_source_window_base::rerender (this=0x2cbdc570)
>>       at gdb/tui/tui-winsource.c:474
>>   #23 0x0000000001028e81 in tui_win_info::resize (this=0x2cbdc570,
>>       height_=21, width_=127, origin_x_=0,
>>       origin_y_=0) at gdb/tui/tui-layout.c:299
>>   #24 0x00000000010297d0 in tui_layout_window::apply (this=0x2cc50350,
>>       x_=0, y_=0, width_=127,
>>       height_=21, preserve_cmd_win_size_p=false) at gdb/tui/tui-layout.c:432
>>   #25 0x000000000102bfea in tui_layout_split::apply (this=0x2caea920,
>>       x_=0, y_=0, width_=127,
>>       height_=33, preserve_cmd_win_size_p=false) at gdb/tui/tui-layout.c:1026
>>   #26 0x0000000001028267 in tui_apply_current_layout (...)
>>       at gdb/tui/tui-layout.c:68
>>   #27 0x0000000001028737 in tui_set_layout (layout=0x2c9b9e90)
>>       at gdb/tui/tui-layout.c:133
>>   #28 0x0000000001028af5 in tui_set_initial_layout () at gdb/tui/tui-layout.c:209
>>   #29 0x000000000104b795 in tui_enable () at gdb/tui/tui.c:496
>>   #30 0x000000000104bab3 in tui_enable_command (args=0x0, from_tty=1)
>>       at gdb/tui/tui.c:591
>>   #31 0x00000000006c5ffe in do_simple_func (args=0x0, from_tty=1, c=0x2c9bb2f0)
>>       at gdb/cli/cli-decode.c:94
>>   #32 0x00000000006cc94f in cmd_func (cmd=0x2c9bb2f0, args=0x0, from_tty=1)
>>       at gdb/cli/cli-decode.c:2831
>>   #33 0x0000000000fe53ad in execute_command (p=0x2c86699a "", from_tty=1)
>>       at gdb/top.c:563
>>   #34 0x000000000094584d in command_handler (command=0x2c866990 "tui enable")
>>       at gdb/event-top.c:611
>>   #35 0x0000000000945dfe in command_line_handler (rl=...) at gdb/event-top.c:844
>>   #36 0x000000000101e916 in tui_command_line_handler (rl=...)
>>       at gdb/tui/tui-interp.c:101
>>   #37 0x0000000000944eef in gdb_rl_callback_handler (rl=0x2cc86a30 "tui enable")
>>       at gdb/event-top.c:288
>>   #38 0x0000000001175779 in rl_callback_read_char ()
>>       at readline/readline/callback.c:302
>>   #39 0x0000000000944bc3 in gdb_rl_callback_read_char_wrapper_sjlj ()
>>       at gdb/event-top.c:197
>>   #40 0x0000000000944cd4 in gdb_rl_callback_read_char_wrapper_noexcept ()
>>       at gdb/event-top.c:240
>>   #41 0x0000000000944d52 in gdb_rl_callback_read_char_wrapper (...)
>>       at gdb/event-top.c:252
>>   #42 0x0000000001062352 in stdin_event_handler (error=0, client_data=0x2c865150)
>>       at gdb/ui.c:154
>>   #43 0x0000000001a04edf in handle_file_event (file_ptr=0x2ccf8850, ready_mask=1)
>>       at gdbsupport/event-loop.cc:551
>>   #44 0x0000000001a05522 in gdb_wait_for_event (block=1)
>>       at gdbsupport/event-loop.cc:672
>>   #45 0x0000000001a043ff in gdb_do_one_event (mstimeout=-1)
>>       at gdbsupport/event-loop.cc:263
>>   #46 0x00000000006d5480 in interp::do_one_event (this=0x2cc2af20, mstimeout=-1)
>>       at gdb/interps.h:93
>>   #47 0x0000000000b77f25 in start_event_loop () at gdb/main.c:403
>>   #48 0x0000000000b78113 in captured_command_loop () at gdb/main.c:468
>>   #49 0x0000000000b7a07c in captured_main (context=0x7fff660b9e60)
>>       at gdb/main.c:1381
>>   #50 0x0000000000b7a178 in gdb_main (args=0x7fff660b9e60) at gdb/main.c:1400
>>   #51 0x0000000000419705 in main (argc=5, argv=0x7fff660b9f98) at gdb/gdb.c:38
>>   (gdb)
>> ...
>>
>> The problem is that the command window is used (during initialization of the
>> source window) before it's properly initialized.
>>
>> A patch [1] was posted for this PR, which fixes the problem by calling
>> a function that will force the debuginfod query to happen before enabling the
>> TUI:
>> ...
>>   static void
>>   tui_enable_command (const char *args, int from_tty)
>>   {
>> +  /* Trigger any debuginfod-related y/n prompts now to avoid having
>> +     it occur during tui initialization.  Handling the prompt while
>> +     tui windows are initializing can cause crashes.  */
>> +  debuginfod_is_enabled ();
>> +
>>     tui_enable ();
>>   }
>> ...
>>
>> While that approach works fine, it requires us to hard-code each query that
>> may happen.
>>
>> [ A review comment reported a problem when using C-x C-a to enable TUI instead
>> of "tui enable", not fixed by the previous patch.  It's also not fixed by this
>> patch. Filed as PR33794. ]
>>
>> This patch takes another approach: add a layout with only the command window,
>> and activate that layout first, making sure that we finalize the
>> initialization of the command window before we activate the initial layout.
>>
>> While that fixes the divide-by-zero, the query still looks slightly odd
>> because '\n' does a line feed but no a carriage return, so each new line has
>> more leading spaces.
>>
>> Fix this by moving the activation of the initial layout to after tui_setup_io.
> 
> I don't really like the way that this change clears the screen and then
> displays just the debuginfod prompt, it feels a little odd.
> 

I see, that makes sense.

> The problem appears to be our attempt to populate the TUI windows with
> content prior to having fully setup the initial TUI CMD window.  So, I
> wondered, could we not just defer populating the windows maybe?
> 

Aha.  Nice idea.

> As an absolute bodge just to see if this would work or not, I created
> the patch below.  Reminder, this patch is 200% a hack.  It really is
> just a "what might the user experience look like" proof of concept.
> 
> This arranges for the source windows to not fill in any content while
> the initial layout is being setup, then, once the TUI is enabled, we
> rerender all the windows, filling in the content.
> 
> In this way, the debuginfod prompt appears within the expected CMD
> window.
> 
> What do you think about this as an end goal?

Sounds good to me.

> Obviously the approach
> would need to be figured out, as the patch below is 300% hack (yes, it
> got worse while I'm thinking about it).
> 

LOL :)

Ok, I'll see if I can implement this approach in a more polished 
fashion.  Please let me know if you prefer to work on it your self.

Thanks
- Tom

> Thanks,
> Andrew
> 
> ---
> 
> diff --git i/gdb/tui/tui-layout.c w/gdb/tui/tui-layout.c
> index 272f5134d85..903a22f3ad1 100644
> --- i/gdb/tui/tui-layout.c
> +++ w/gdb/tui/tui-layout.c
> @@ -38,6 +38,8 @@
>   #include "tui/tui-source.h"
>   #include "gdb_curses.h"
>   
> +bool magic_disable = false;
> +
>   /* The layouts.  */
>   static std::vector<std::unique_ptr<tui_layout_split>> layouts;
>   
> @@ -206,7 +208,9 @@ tui_next_layout_command (const char *arg, int from_tty)
>   void
>   tui_set_initial_layout ()
>   {
> +  magic_disable = true;
>     tui_set_layout (layouts[0].get ());
> +  magic_disable = false;
>   }
>   
>   /* Implement the "layout prev" command.  */
> @@ -296,7 +300,8 @@ tui_win_info::resize (int height_, int width_,
>     if (handle == nullptr)
>       make_window ();
>   
> -  rerender ();
> +  if (!magic_disable)
> +    rerender ();
>   }
>   
>   \f
> diff --git i/gdb/tui/tui.c w/gdb/tui/tui.c
> index fb94823f0fe..21e1d08ac8e 100644
> --- i/gdb/tui/tui.c
> +++ w/gdb/tui/tui.c
> @@ -534,6 +534,7 @@ tui_enable (void)
>     tui_set_key_mode (tui_current_key_mode);
>   
>     /* Refresh the screen.  */
> +  tui_apply_current_layout (true);
>     tui_refresh_all_win ();
>   
>     /* Update gdb's knowledge of its terminal.  */
> diff --git i/gdb/tui/tui.h w/gdb/tui/tui.h
> index 7daefe2c9bb..7760f62ddf3 100644
> --- i/gdb/tui/tui.h
> +++ w/gdb/tui/tui.h
> @@ -22,6 +22,8 @@
>   #ifndef GDB_TUI_TUI_H
>   #define GDB_TUI_TUI_H
>   
> +extern bool magic_disable;
> +
>   /* Flag to control tui debugging.  */
>   
>   extern bool debug_tui;
> 


  reply	other threads:[~2026-01-15 13:14 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-14 17:28 Tom de Vries
2026-01-15 11:29 ` Andrew Burgess
2026-01-15 13:04   ` Tom de Vries
2026-01-16 13:24     ` Tom de Vries
2026-01-15 12:13 ` Andrew Burgess
2026-01-15 13:13   ` Tom de Vries [this message]
2026-01-15 14:26     ` Tom de Vries
2026-01-16 13:25       ` Tom de Vries
2026-01-16 14:53 ` Tom Tromey
2026-01-16 15:07   ` Tom de Vries
2026-01-17 13:14   ` Andrew Burgess

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=5dbfe8e2-5f2b-40a3-80ca-09098df913df@suse.de \
    --to=tdevries@suse.de \
    --cc=aburgess@redhat.com \
    --cc=gdb-patches@sourceware.org \
    /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