From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-f47.google.com (mail-wr1-f47.google.com [209.85.221.47]) by sourceware.org (Postfix) with ESMTPS id CE08C386EC3F for ; Tue, 23 Feb 2021 11:20:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org CE08C386EC3F Received: by mail-wr1-f47.google.com with SMTP id v1so22168950wrd.6 for ; Tue, 23 Feb 2021 03:20:27 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:date:in-reply-to :references:user-agent:mime-version:content-transfer-encoding; bh=/qFk7NIcLGDisjygf4HJdkSNh6wVZbjGAXppHAcIJZY=; b=n/jWRzwFD1mrPvJBiqn4675DAaurQ7cm5yLbFhxunIhyqFA6rX+ry95Ms3tbTh+RII mM2i+m+Z7XRVwgVhznYJNMzyYrbh4G5PxUuyrE5oglOqoZbONWTXGnnrUH/q7zuKtcEb LZUrXT2Mq4Ir9mVHAiyECLLkZaANBHMxn4KtDEx18AK9KuBS0wHSpgakW9ax30qpC7so 0Msa22XvdIyMfaHdZ9qWJU9LYVKcU6ICd9DYe7MYtLMeqAf0i7uGVC2U1AcEZqKtVwVS l7MbswX3+CWhenJ8Dxlt9DAr9FsBc1Qwwon40yMWiAK0WdedfrmeMfFOSRBfUTpxFPhr kI5w== X-Gm-Message-State: AOAM532bVx5Yy+CT3aMLuDAlzHjscauvFeZDrkcKejKAakUPt2JR/5/W Wvoop/0Ic32fDdtagx0rZJ5Wtu0y1z0= X-Google-Smtp-Source: ABdhPJxNaQX0PBtkXPJeSlXfZ9zhpaM20EcSGQnzkrkSPtH7XZFlH7R7jedghgjLVX8VzYw4+WpDwQ== X-Received: by 2002:a5d:52c2:: with SMTP id r2mr6408188wrv.40.1614079226964; Tue, 23 Feb 2021 03:20:26 -0800 (PST) Received: from ?IPv6:2a02:c7d:d65a:4200:2236:f008:480a:c873? ([2a02:c7d:d65a:4200:2236:f008:480a:c873]) by smtp.gmail.com with ESMTPSA id n66sm2249675wmn.25.2021.02.23.03.20.25 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Feb 2021 03:20:26 -0800 (PST) Message-ID: <71093a268d80ba44ededb868b850dde4873987b3.camel@labware.com> Subject: [PING] Re: [PATCH] MI: PR20684, preserve user selected thread and frame when invoking MI commands From: Jan Vrany To: gdb-patches@sourceware.org Date: Tue, 23 Feb 2021 11:20:25 +0000 In-Reply-To: <20210209100813.710754-1-jan.vrany@labware.com> References: <20210209100813.710754-1-jan.vrany@labware.com> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.0 required=5.0 tests=BAYES_00, BODY_8BITS, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 23 Feb 2021 11:20:29 -0000 Polite ping. On Tue, 2021-02-09 at 10:08 +0000, Jan Vrany wrote: > When invoking MI commands with --thread and/or --frame, user selected > thread and frame was not preserved: > >   (gdb) >   info thread >   &"info thread\n" >   ~"  Id   Target Id                                           Frame > \n" >   ~"* 1    Thread 0x7ffff7c30740 (LWP 19302) \"user-selected-c\" main > () at /home/uuu/gdb/gdb/testsuite/gdb.mi/user-selected-context- > sync.c:60\n" >   ~"  2    Thread 0x7ffff7c2f700 (LWP 19306) \"user-selected-c\" > child_sub_function () at /home/uuu/gdb/gdb/testsuite/gdb.mi/user- > selected-context-sync.c:30\n" >   ~"  3    Thread 0x7ffff742e700 (LWP 19307) \"user-selected-c\" > child_sub_function () at /home/uuu/gdb/gdb/testsuite/gdb.mi/user- > selected-context-sync.c:30\n" >   ^done >   (gdb) >   info frame >   &"info frame\n" >   ~"Stack level 0, frame at 0x7fffffffdf90:\n" >   ~" rip = 0x555555555207 in main > (/home/uuu/gdb/gdb/testsuite/gdb.mi/user-selected-context-sync.c:60); > saved rip = 0x7ffff7c5709b\n" >   ~" source language c.\n" >   ~" Arglist at 0x7fffffffdf80, args: \n" >   ~" Locals at 0x7fffffffdf80, Previous frame's sp is > 0x7fffffffdf90\n" >   ~" Saved registers:\n " >   ~" rbp at 0x7fffffffdf80, rip at 0x7fffffffdf88\n" >   ^done >   (gdb) >   -stack-info-depth --thread 3 >   ^done,depth="4" >   (gdb) >   info thread >   &"info thread\n" >   ~"  Id   Target Id                                           Frame > \n" >   ~"  1    Thread 0x7ffff7c30740 (LWP 19302) \"user-selected-c\" main > () at /home/uuu/gdb/gdb/testsuite/gdb.mi/user-selected-context- > sync.c:60\n" >   ~"  2    Thread 0x7ffff7c2f700 (LWP 19306) \"user-selected-c\" > child_sub_function () at /home/uuu/gdb/gdb/testsuite/gdb.mi/user- > selected-context-sync.c:30\n" >   ~"* 3    Thread 0x7ffff742e700 (LWP 19307) \"user-selected-c\" > child_sub_function () at /home/uuu/gdb/gdb/testsuite/gdb.mi/user- > selected-context-sync.c:30\n" >   ^done >   (gdb) >   info frame >   &"info frame\n" >   ~"Stack level 0, frame at 0x7ffff742dee0:\n" >   ~" rip = 0x555555555169 in child_sub_function > (/home/uuu/gdb/gdb/testsuite/gdb.mi/user-selected-context-sync.c:30); > saved rip = 0x555555555188\n" >   ~" called by frame at 0x7ffff742df00\n" >   ~" source language c.\n" >   ~" Arglist at 0x7ffff742ded0, args: \n" >   ~" Locals at 0x7ffff742ded0, Previous frame's sp is > 0x7ffff742dee0\n" >   ~" Saved registers:\n " >   ~" rbp at 0x7ffff742ded0, rip at 0x7ffff742ded8\n" >   ^done >   (gdb) > > This was problematic for frontends that provide access to CLI because > UI > may silently change the context for CLI commands (as demonstrated > above). > > gdb/Changelog > >         PR 20684 >         * gdb/mi/mi-main.c (mi_cmd_execute): Preserve user selected > thread >         and frame when invoking MI commands. > --- >  gdb/ChangeLog    |  6 ++++++ >  gdb/mi/mi-main.c | 36 +++++++++++++++--------------------- >  2 files changed, 21 insertions(+), 21 deletions(-) > > diff --git a/gdb/ChangeLog b/gdb/ChangeLog > index e67668d315c..ea232ff1b3f 100644 > --- a/gdb/ChangeLog > +++ b/gdb/ChangeLog > @@ -1,3 +1,9 @@ > +2021-02-09  Jan Vrany  > + > +       PR 20684 > +       * gdb/mi/mi-main.c (mi_cmd_execute): Preserve user selected > thread > +       and frame when invoking MI commands. > + >  2021-02-08  Shahab Vahedi  >   >         PR tdep/27369 > diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c > index 9a14d78e1e2..c5103800314 100644 > --- a/gdb/mi/mi-main.c > +++ b/gdb/mi/mi-main.c > @@ -1971,25 +1971,13 @@ mi_execute_command (const char *cmd, int > from_tty) >              again.  */ >           && !command_notifies_uscc_observer (command.get ())) >         { > -         int report_change = 0; > - > -         if (command->thread == -1) > -           { > -             report_change = (previous_ptid != null_ptid > -                              && inferior_ptid != previous_ptid > -                              && inferior_ptid != null_ptid); > -           } > -         else if (inferior_ptid != null_ptid) > -           { > -             struct thread_info *ti = inferior_thread (); > - > -             report_change = (ti->global_num != command->thread); > -           } > - > -         if (report_change) > -           { > -             gdb::observers::user_selected_context_changed.notify > -               (USER_SELECTED_THREAD | USER_SELECTED_FRAME); > +         if (command->thread == -1 > +             && previous_ptid != null_ptid > +             && inferior_ptid != previous_ptid > +             && inferior_ptid != null_ptid) > +            { > +              gdb::observers::user_selected_context_changed.notify > +                      (USER_SELECTED_THREAD | USER_SELECTED_FRAME); >             } >         } >      } > @@ -2035,6 +2023,7 @@ mi_cmd_execute (struct mi_parse *parse) >        set_current_program_space (inf->pspace); >      } >   > +  gdb::optional thread_saver; >    if (parse->thread != -1) >      { >        thread_info *tp = find_thread_global_id (parse->thread); > @@ -2045,9 +2034,11 @@ mi_cmd_execute (struct mi_parse *parse) >        if (tp->state == THREAD_EXITED) >         error (_("Thread id: %d has terminated"), parse->thread); >   > +      thread_saver.emplace (); >        switch_to_thread (tp); >      } >   > +  gdb::optional frame_saver; >    if (parse->frame != -1) >      { >        struct frame_info *fid; > @@ -2055,8 +2046,11 @@ mi_cmd_execute (struct mi_parse *parse) >   >        fid = find_relative_frame (get_current_frame (), &frame); >        if (frame == 0) > -       /* find_relative_frame was successful */ > -       select_frame (fid); > +        { > +          /* find_relative_frame was successful */ > +          frame_saver.emplace (); > +          select_frame (fid); > +        } >        else >         error (_("Invalid frame id: %d"), frame); >      }