From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 2DD373858CD1 for ; Thu, 22 Feb 2024 22:26:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2DD373858CD1 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 2DD373858CD1 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1708640803; cv=none; b=Xni61/CYbGdFrVlwy3r2CzVykc5/NMRN7A6RF8ae0S3xhAay/oBItM8swkHwAwcd13a3osF2PzCUiehCVqo4+5WrT8kUVFtRlbfM2/NcAjiZx/A7hqrl/g3+FOZimcShdPWf1IYaO+wY1kY+4bSDnIwzXyhOxJyxI3M0/H/MaC8= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1708640803; c=relaxed/simple; bh=12Eo/V903bPydspKXPCG93xWo0S9iLhyeoUHqmtFYOE=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=Gr3+4JpmoMH4mRmQWdPOnEmLolNsrEb1t/tZtmnFHSHWM6dDkd1/586sMtzdKamR/QqhXmz0Rb0W6+0dv+qsCStTMZlxpNbRJdHfR++SQcitvtwIQzLEHzI0Lm/wcADNgbxmG5vVJT43zCu/FtewZ75z8PQxqRR3e3skOcmT2MI= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1708640800; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XWMxXW160ll6NeZLOeX4AZcmIqONajOr2KJSzIywk6w=; b=g2xMgilcSbAhOJSkRAyBInsL0ta4RHQSNcOiOg03IeUJmayVunTpQ4Lx4Zar/a716M1dIT xJJS56FI0T3xOZK30plwbxh786MPl7J2yWwIL5G0Lb91ZhJRmARj4l3bO2sTmq19RdR0uI tKBTKdW40Tyn27zBg+eLnYfxMZNpimc= Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-614-oBD-iRr9NymVAeDXpa9WjA-1; Thu, 22 Feb 2024 17:26:39 -0500 X-MC-Unique: oBD-iRr9NymVAeDXpa9WjA-1 Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-299c12daea5so1085600a91.1 for ; Thu, 22 Feb 2024 14:26:39 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708640798; x=1709245598; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XWMxXW160ll6NeZLOeX4AZcmIqONajOr2KJSzIywk6w=; b=qeMUCnh6r90Q9kQSNsVPmFUpHuvi5W20iXxjeZOQUrNxmDTagmPLvZ64XTXny2J/gT iPD2LcPwxJBJyk+E/eWH4rSzljQH2j3B2kKHO5LXYV7UuGsNnzsucF9C0XtIjjykNpPK lGTqlwQK+0fGa6uMGtv2h1rX8A0TebPNI02Gie/9oAmLZtneZsbRvI65301/JNAxYfKa 7vO8Bc3tbeunyQwqqc0VQUnqQ6hsAORBk55kLyjIns3WpLesSzljD/Qmx/sIry/bbIOu sCxSBrqsZpS2xWws6LkNpIKV3C+1wrR54TWskvnq4fgQnTjcXVKE3owmycV78aB9mGJe vzZQ== X-Gm-Message-State: AOJu0Ywup5aKYp6N1sfvZqKiV+eN+VzvHtDa8oQ6NIdEDum//1dOExkw 5I1LDBdyNX6sNawoypaP65F0yTpETwsMoBaxqhE427kDbbJL1NAWt4dAdSr4ap1kstJejrR5kxg zRh35qq14T2nWBPtpc8ezjPyGLwB2eJMZXIVXkUxDnMGfYjXf1JVQs5Dq534/sCKtF/U+Z1tLqN nmTDmOm0lK8OMuAL5v0tOBHB9/X9m0/EGKj3lDQsN4 X-Received: by 2002:a17:90a:970a:b0:299:88b6:7d93 with SMTP id x10-20020a17090a970a00b0029988b67d93mr5433834pjo.17.1708640798464; Thu, 22 Feb 2024 14:26:38 -0800 (PST) X-Google-Smtp-Source: AGHT+IESnPPS2k63uyGdGQXAKmPEaciyunU17rSobnXsbLvUEUjFKrzS6DYmROV8g7IpUUmj7dkHRsYN5JO3RjOeows= X-Received: by 2002:a17:90a:970a:b0:299:88b6:7d93 with SMTP id x10-20020a17090a970a00b0029988b67d93mr5433819pjo.17.1708640798062; Thu, 22 Feb 2024 14:26:38 -0800 (PST) MIME-Version: 1.0 References: <20240203021515.705567-1-amerey@redhat.com> In-Reply-To: <20240203021515.705567-1-amerey@redhat.com> From: Aaron Merey Date: Thu, 22 Feb 2024 17:26:27 -0500 Message-ID: Subject: [PING][PATCH v4] gdb/debuginfod: Ctrl-C asks to cancel further downloads To: gdb-patches@sourceware.org Cc: Tom de Vries X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Ping Thanks, Aaron On Fri, Feb 2, 2024 at 9:15=E2=80=AFPM Aaron Merey wrot= e: > > v3: https://sourceware.org/pipermail/gdb-patches/2023-March/197679.html > > v4 includes changes needed to apply the patch to the current master branc= h. > > Currently gdb only allows for debuginfod downloads to be cancelled one at > a time via Ctrl-C. This can be a burden if one wishes to cancel a large > series of downloads. Additionally there can also be ambiguity between wh= ether > Ctrl-C during a download was intended to cancel a download or interrupt t= he > inferior. > > This patch addresses these issues by adding a new debuginfod setting and > changing the behavior of Ctrl-C during a download. > > Add a new command "set debuginfod cancel one/all/ask", where: > - "one" means Ctrl-C cancels one download, > - "all" means Ctrl-C cancels all further downloads, and > - "ask" means Ctrl-C asks whether to cancel all further downloads. A "ye= s" > implies "set debuginfod cancel all", and a "no" implies "set debuginfod > cancel one", so the question is only asked once. > > Note that the behaviour as it was before this patch is equivalent to > "set debuginfod cancel one". Instead, the new default is "set debuginfod > cancel ask". Note that cancelling all further downloads implies "set > debuginfod enabled off". > > A single Ctrl-C during downloading now sets the quit_flag and proceeds wi= th > all downloads. If the inferior has the terminal, then a second Ctrl-C du= ring > downloading triggers a query asking whether to cancel the download or > interrupt the inferior. If the user wishes to cancel the download then > the setting of 'set debuginfod cancel' determines whether one or all > downloads are cancelled. In the case of "set debuginfod cancel ask", > there will be another query at this point asking whether to cancel one > or all downloads. > > If the inferior does not have the terminal, then a second Ctrl-C during > downloading simply cancels the download according to the setting of > "set debuginfod cancel". In this case there is no query asking whether > to interrupt the inferior or cancel a download. > > Example session where inferior has terminal: > > (gdb) run > [...] > Downloading separate debug info for /lib64/libxyz.so > [### ]^C^C > Cancel the current download? > If no, then Ctrl-C will be sent to the target process. ([y] or n) y > Cancelling download of separate debug info for /lib64/libxyz.so... > Cancel further downloading for this session? (y or [n]) n > Downloading separate debug info for /lib64/libabcd.so > > Example session where inferior does not have terminal: > > (gdb) run > [...] > Downloading separate debug info for /lib64/libxyz.so > [### ]^C^C > Cancelling download of separate debug info for /lib64/libxyz.so... > Cancel further downloading for this session? (y or [n]) y > Debuginfod has been disabled. > To re-enable use the 'set debuginfod enabled' command. > > Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=3D29582 > Suggested-By: Martin Li=C5=A1ka > Co-Authored-By: Tom de Vries > --- > gdb/debuginfod-support.c | 183 +++++++++++++++++++++++++++++++++++++-- > gdb/doc/gdb.texinfo | 21 +++++ > 2 files changed, 199 insertions(+), 5 deletions(-) > > diff --git a/gdb/debuginfod-support.c b/gdb/debuginfod-support.c > index 7d8ada39e96..97d4b2f2bac 100644 > --- a/gdb/debuginfod-support.c > +++ b/gdb/debuginfod-support.c > @@ -38,6 +38,8 @@ static cmd_list_element *maint_show_debuginfod_cmdlist; > static const char debuginfod_on[] =3D "on"; > static const char debuginfod_off[] =3D "off"; > static const char debuginfod_ask[] =3D "ask"; > +static const char debuginfod_one[] =3D "one"; > +static const char debuginfod_all[] =3D "all"; > > static const char *debuginfod_enabled_enum[] =3D > { > @@ -47,6 +49,20 @@ static const char *debuginfod_enabled_enum[] =3D > nullptr > }; > > +/* Valid values for set debuginfod cancel command. */ > + > +static const char *debuginfod_cancel_enum[] =3D > +{ > + debuginfod_one, > + debuginfod_all, > + debuginfod_ask, > + nullptr > +}; > + > +/* Value of debuginfod cancellation mode. */ > + > +static const char *debuginfod_cancel =3D debuginfod_ask; > + > static const char *debuginfod_enabled =3D > #if defined(HAVE_LIBDEBUGINFOD) > debuginfod_ask; > @@ -109,9 +125,11 @@ debuginfod_section_query (const unsigned char *build= _id, > struct user_data > { > user_data (const char *desc, const char *fname) > - : desc (desc), fname (fname) > + : pass_quit_flag (false), inf_had_term (false), desc (desc), fname (= fname) > { } > > + bool pass_quit_flag; > + bool inf_had_term; > const char * const desc; > const char * const fname; > ui_out::progress_update progress; > @@ -156,10 +174,83 @@ progressfn (debuginfod_client *c, long cur, long to= tal) > if (check_quit_flag ()) > { > ui_file *outstream =3D get_unbuffered (gdb_stdout); > - gdb_printf (outstream, _("Cancelling download of %s %s...\n"), > - data->desc, styled_fname.c_str ()); > - return 1; > - } > + > + /* If a single Ctrl-C occurs during downloading, let it propagate = to the > + target. If more than one Ctrl-C occurs, ask whether to cancel t= he > + current download or interrupt the target. If the download is > + cancelled, the setting of debuginfod_cancel will determine wheth= er > + the current download is cancelled or debuginfod is disabled. */ > + if (!data->pass_quit_flag) > + data->pass_quit_flag =3D true; > + else > + { > + int resp =3D 1; > + bool extra_nl =3D false; > + > + if (data->inf_had_term) > + { > + /* If Ctrl-C occurs during the following prompts, catch the > + exception to prevent unsafe early returns to gdb's main > + event loop. During these prompts, Ctrl-C is equivalent = to > + answering 'y'. */ > + try > + { > + resp =3D yquery (_("Cancel the current download?\nIf no= , " > + "then Ctrl-C will be sent to the targe= t " > + "process. ")); > + } > + catch (const gdb_exception &) > + { > + /* If the query doesn't complete, then we need an addit= ional > + newline to get "Cancelling download of..." printed o= n a > + separate line. */ > + extra_nl =3D true; > + } > + } > + if (resp) > + { > + if (extra_nl) > + { > + gdb_printf (outstream, "\n"); > + extra_nl =3D false; > + } > + > + gdb_printf (outstream, _("Cancelling download of %s %s...\n= "), > + data->desc, styled_fname.c_str ())= ; > + if (debuginfod_cancel =3D=3D debuginfod_ask) > + { > + try > + { > + resp =3D nquery > + (_("Cancel further downloading for this session? = ")); > + } > + catch (const gdb_exception &) > + { > + resp =3D 1; > + extra_nl =3D true; > + } > + > + if (resp) > + debuginfod_cancel =3D debuginfod_all; > + else > + debuginfod_cancel =3D debuginfod_one; > + } > + if (debuginfod_cancel =3D=3D debuginfod_all) > + { > + if (extra_nl) > + gdb_printf (outstream, "\n"); > + > + gdb_printf (outstream, > + _("Debuginfod has been disabled.\nTo re-ena= ble " > + "use the 'set debuginfod enabled' command= .\n")); > + debuginfod_enabled =3D debuginfod_off; > + } > + > + data->pass_quit_flag =3D false; > + return 1; > + } > + } > + } > > if (debuginfod_verbose =3D=3D 0) > return 0; > @@ -330,6 +421,10 @@ debuginfod_source_query (const unsigned char *build_= id, > user_data data ("source file", srcpath); > > debuginfod_set_user_data (c, &data); > + > + if (!target_terminal::is_ours ()) > + data.inf_had_term =3D true; > + > if (target_supports_terminal_ours ()) > { > term_state.emplace (); > @@ -341,6 +436,11 @@ debuginfod_source_query (const unsigned char *build_= id, > build_id_len, > srcpath, > &dname)); > + if (data.pass_quit_flag) > + set_quit_flag (); > + if (data.inf_had_term && term_state.has_value ()) > + target_terminal::inferior (); > + > debuginfod_set_user_data (c, nullptr); > } > > @@ -376,6 +476,10 @@ debuginfod_debuginfo_query (const unsigned char *bui= ld_id, > user_data data ("separate debug info for", filename); > > debuginfod_set_user_data (c, &data); > + > + if (!target_terminal::is_ours ()) > + data.inf_had_term =3D true; > + > if (target_supports_terminal_ours ()) > { > term_state.emplace (); > @@ -384,6 +488,12 @@ debuginfod_debuginfo_query (const unsigned char *bui= ld_id, > > fd =3D scoped_fd (debuginfod_find_debuginfo (c, build_id, build_id_l= en, > &dname)); > + > + if (data.pass_quit_flag) > + set_quit_flag (); > + if (data.inf_had_term && term_state.has_value ()) > + target_terminal::inferior (); > + > debuginfod_set_user_data (c, nullptr); > } > > @@ -419,6 +529,10 @@ debuginfod_exec_query (const unsigned char *build_id= , > user_data data ("executable for", filename); > > debuginfod_set_user_data (c, &data); > + > + if (!target_terminal::is_ours ()) > + data.inf_had_term =3D true; > + > if (target_supports_terminal_ours ()) > { > term_state.emplace (); > @@ -427,6 +541,11 @@ debuginfod_exec_query (const unsigned char *build_id= , > > fd =3D scoped_fd (debuginfod_find_executable (c, build_id, build_id_= len, > &dname)); > + if (data.pass_quit_flag) > + set_quit_flag (); > + if (data.inf_had_term && term_state.has_value ()) > + target_terminal::inferior (); > + > debuginfod_set_user_data (c, nullptr); > } > > @@ -467,6 +586,10 @@ debuginfod_section_query (const unsigned char *build= _id, > { > user_data data (desc.c_str (), filename); > debuginfod_set_user_data (c, &data); > + > + if (!target_terminal::is_ours ()) > + data.inf_had_term =3D true; > + > if (target_supports_terminal_ours ()) > { > term_state.emplace (); > @@ -475,6 +598,12 @@ debuginfod_section_query (const unsigned char *build= _id, > > fd =3D scoped_fd (debuginfod_find_section (c, build_id, build_id_len= , > section_name, &dname)); > + > + if (data.pass_quit_flag) > + set_quit_flag (); > + if (data.inf_had_term && term_state.has_value ()) > + target_terminal::inferior (); > + > debuginfod_set_user_data (c, nullptr); > } > > @@ -523,6 +652,33 @@ show_debuginfod_enabled (ui_file *file, int from_tty= , cmd_list_element *cmd, > "\"%s\".\n"), debuginfod_enabled); > } > > +/* Set callback for "set debuginfod cancel". */ > + > +static void > +set_debuginfod_cancel (const char *value) > +{ > + debuginfod_cancel =3D value; > +} > + > +/* Get callback for "set debuginfod cancel". */ > + > +static const char * > +get_debuginfod_cancel () > +{ > + return debuginfod_cancel; > +} > + > +/* Show callback for "set debuginfod cancel". */ > + > +static void > +show_debuginfod_cancel (ui_file *file, int from_tty, cmd_list_element *c= md, > + const char *value) > +{ > + gdb_printf (file, > + _("Debuginfod cancellation mode is currently set to " > + "\"%s\".\n"), debuginfod_cancel); > +} > + > /* Set callback for "set debuginfod urls". */ > > static void > @@ -627,6 +783,23 @@ When set to \"ask\", prompt whether to enable or dis= able debuginfod." ), > &set_debuginfod_prefix_list, > &show_debuginfod_prefix_list); > > + add_setshow_enum_cmd ("cancel", class_run, debuginfod_cancel_enum, > + _("Set Ctrl-C behaviour for debuginfod."), > + _("Show Ctrl-C behaviour for debuginfod."), > + _("\ > +When set to \'one\', pressing Ctrl-C twice cancels a single \ > +download.\nWhen set to \'all\', pressing Ctrl-C twice cancels all furthe= r downloads.\n\ > +When set to \'ask\', pressing Ctrl-C twice asks what to do.\nA single Ct= rl-C during \ > +downloading is passed to the target process being debugged.\nA second Ct= rl-C \ > +during downloading may raise a prompt asking whether to cancel the downl= oad or \ > +send Ctrl-C to the target.\nIf the download is cancelled, then no Ctrl-C= is \ > +sent to the target."), > + set_debuginfod_cancel, > + get_debuginfod_cancel, > + show_debuginfod_cancel, > + &set_debuginfod_prefix_list, > + &show_debuginfod_prefix_list); > + > /* set/show debuginfod urls */ > add_setshow_string_noescape_cmd ("urls", class_run, _("\ > Set the list of debuginfod server URLs."), _("\ > diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo > index e98c15242bc..d6df28896b1 100644 > --- a/gdb/doc/gdb.texinfo > +++ b/gdb/doc/gdb.texinfo > @@ -50259,6 +50259,27 @@ is set to @code{ask} for interactive sessions. > Display whether @code{debuginfod enabled} is set to @code{on}, @code{off= } or > @code{ask}. > > +@kindex set debuginfod cancel > +@anchor{set debuginfod cancel} > +@item set debuginfod cancel > +@itemx set debuginfod cancel one > +@cindex debuginfod @kbd{Ctrl-C} behaviour > +Pressing @kbd{Ctrl-C} twice during downloading will cancel the current > +download. > + > +@item set debuginfod cancel all > +Pressing @kbd{Ctrl-C} twice during downloading will cancel this and all > +further downloads. > + > +@item set debuginfod cancel ask > +Pressing @kbd{Ctrl-C} twice during downloading will cancel the current > +download and prompt whether to cancel all further downloads. By default= , > +@code{debuginfod cancel} is set to @code{ask} for interactive sessions. > + > +@kindex show debuginfod cancel > +@item show debuginfod cancel > +Display the current setting of @code{debuginfod cancel}. > + > @kindex set debuginfod urls > @cindex configure debuginfod URLs > @item set debuginfod urls > -- > 2.43.0 >