From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 4UD7KUboaGkZxQQAWB0awg (envelope-from ) for ; Thu, 15 Jan 2026 08:14:46 -0500 Authentication-Results: simark.ca; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=D7FC9g9e; dkim=fail reason="signature verification failed" header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=OCm18fvF; dkim=fail reason="signature verification failed" (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=D7FC9g9e; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=OCm18fvF; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id A2F6B1E070; Thu, 15 Jan 2026 08:14:46 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_INVALID,DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,WEIRD_PORT autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 856B31E070 for ; Thu, 15 Jan 2026 08:14:45 -0500 (EST) Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id DEAFE4BA2E37 for ; Thu, 15 Jan 2026 13:14:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DEAFE4BA2E37 Authentication-Results: sourceware.org; dkim=fail reason="signature verification failed" (1024-bit key, unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=D7FC9g9e; dkim=fail reason="signature verification failed" header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=OCm18fvF; dkim=fail reason="signature verification failed" (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=D7FC9g9e; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=OCm18fvF Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2a07:de40:b251:101:10:150:64:2]) by sourceware.org (Postfix) with ESMTPS id 5F8B44BA2E38 for ; Thu, 15 Jan 2026 13:13:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5F8B44BA2E38 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 5F8B44BA2E38 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a07:de40:b251:101:10:150:64:2 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1768482813; cv=none; b=mGoXdZIg5CkD5ciN5kvu0VAoTYGie7zIsbsRC1xmNdhq2IUvb5mGgEohJwepOzo2d9Z2VGjjSWHiScJ5UdvLkNpd/AfDvPEdzyhd4vA229s/YMnf7d/+xr84J9oM/wn2Hnu5V7NWQ/lj/a4ZP4S/7si1jI8IYtBn27c3L0P4huc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1768482813; c=relaxed/simple; bh=qFHqRcZgWbdqhyIha7Idwe8RI9MkcCkrs2GXwWdwaGg=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature: Message-ID:Date:MIME-Version:Subject:To:From; b=O3YTPIznN1LmIThOabuy1/53oCxhgxT5kzYmgAXzC3x5qDwIz88FKaU8GuC3tfVru/JgHohOouVFflmD49vxxNiVmix/hAar1wjEnxDNjhHfbJWnKqKmUmv7f3gH0XxLZQSPk+e7R1j8S61tRP+t8Q0c7InImif+L0zGsWMr+v8= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5F8B44BA2E38 Received: from imap1.dmz-prg2.suse.org (unknown [10.150.64.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 530625BCDE; Thu, 15 Jan 2026 13:13:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1768482812; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BJFTydnccB1UmU7SZFT2vyttxLAGvObDeZgN3Xbi/QA=; b=D7FC9g9eE8fxzCDOxj7s7bjB/QnvmwJjh1yG95AlgParNnjGt9CdqslQYdxr2+QMawMVsB gpA4d3Iq32GepIm4qr20jU0gDAtIEHHbkH8Q78E4zQyWM+ymzb9LGdw+Avw6EbmaZMGHb7 ebCrNzSUgQCZnYjvqcm5MG2lg+WCvi8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1768482812; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BJFTydnccB1UmU7SZFT2vyttxLAGvObDeZgN3Xbi/QA=; b=OCm18fvFCYDW44diu/S9bzmAoHowY4rftX031EkOox1+oqJQb8vSvnyuFI3F37hEDJgSAB tY8AkphqteiaG0Aw== Authentication-Results: smtp-out2.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1768482812; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BJFTydnccB1UmU7SZFT2vyttxLAGvObDeZgN3Xbi/QA=; b=D7FC9g9eE8fxzCDOxj7s7bjB/QnvmwJjh1yG95AlgParNnjGt9CdqslQYdxr2+QMawMVsB gpA4d3Iq32GepIm4qr20jU0gDAtIEHHbkH8Q78E4zQyWM+ymzb9LGdw+Avw6EbmaZMGHb7 ebCrNzSUgQCZnYjvqcm5MG2lg+WCvi8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1768482812; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BJFTydnccB1UmU7SZFT2vyttxLAGvObDeZgN3Xbi/QA=; b=OCm18fvFCYDW44diu/S9bzmAoHowY4rftX031EkOox1+oqJQb8vSvnyuFI3F37hEDJgSAB tY8AkphqteiaG0Aw== Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id 382933EA63; Thu, 15 Jan 2026 13:13:32 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id zNEEDPznaGmWHwAAD6G6ig (envelope-from ); Thu, 15 Jan 2026 13:13:32 +0000 Message-ID: <5dbfe8e2-5f2b-40a3-80ca-09098df913df@suse.de> Date: Thu, 15 Jan 2026 14:13:31 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] [gdb/tui] Fix crash with debuginfod query To: Andrew Burgess , gdb-patches@sourceware.org References: <20260114172833.1824823-1-tdevries@suse.de> <87pl7bt6nz.fsf@redhat.com> Content-Language: en-US From: Tom de Vries In-Reply-To: <87pl7bt6nz.fsf@redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spamd-Result: default: False [-4.30 / 50.00]; BAYES_HAM(-3.00)[100.00%]; NEURAL_HAM_LONG(-1.00)[-1.000]; NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain]; FROM_HAS_DN(0.00)[]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; RCPT_COUNT_TWO(0.00)[2]; FUZZY_RATELIMITED(0.00)[rspamd.com]; MIME_TRACE(0.00)[0:+]; ARC_NA(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; RCVD_TLS_ALL(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; FROM_EQ_ENVFROM(0.00)[]; TO_DN_SOME(0.00)[]; RCVD_COUNT_TWO(0.00)[2]; MID_RHS_MATCH_FROM(0.00)[]; DBL_BLOCKED_OPENRESOLVER(0.00)[imap1.dmz-prg2.suse.org:helo, suse.de:mid, suse.de:email] X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org On 1/15/26 1:13 PM, Andrew Burgess wrote: > Tom de Vries 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> 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 (); > } > > > 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; >