From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) by sourceware.org (Postfix) with ESMTPS id BACE5384A031 for ; Tue, 9 Feb 2021 10:08:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org BACE5384A031 Received: by mail-wr1-f48.google.com with SMTP id l12so20936847wry.2 for ; Tue, 09 Feb 2021 02:08:33 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=zrgMjrg+U7sbn/4W8FvsfJIR2p5i1BNL9ldFVq401IY=; b=h3inP4Kn1pJwmTYPWEmzk0oeA/W5ZMsw0jvIZ6nY5qxAPK97czar5y+fLbFd9pg/2h 5HHHFxwSfAsedx7+gs6mnzo8gwCcG3B4qdImMQpkIvGQcaY5gx/yPYPO1rOTeS8YFEZ/ DuqBRfwzF5bY4DMm0y/eJcvi9irkOAInA2EfKHcH8PWwUMJP5e9NKgnH4tYNu9OEIG9L H8jt5Gc3fStgZymCV3xMzS0DkxcZYvQGlexmaoG+ySmOUQrBnwe05ux12gx4lBDOcXqX Nlx1wAvWJwCPKMYo8yn92stW5fjRj7G7irFfVLwTNN5Uv/q2juf+uon0S6xjZ3SPXrwj 3nEg== X-Gm-Message-State: AOAM532bWMc6MxLHGThTH6aPOh0tIEztaY7cErvplz0s80emk8k4DeUZ uuT44k0Qlpi+BnZWhbDezbIB88QBK94= X-Google-Smtp-Source: ABdhPJy2kXe1lPsUK7pdSEndrRs0Z67KC1qsHtpwUTJgPQj6n0pQjpLWOhkxhH1p6oBVG+00v6mT8A== X-Received: by 2002:adf:ed45:: with SMTP id u5mr24437314wro.358.1612865312876; Tue, 09 Feb 2021 02:08:32 -0800 (PST) Received: from localhost ([83.219.56.252]) by smtp.gmail.com with ESMTPSA id c5sm35597629wrn.77.2021.02.09.02.08.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Feb 2021 02:08:32 -0800 (PST) From: Jan Vrany To: gdb-patches@sourceware.org Cc: Jonah Graham , Jan Vrany Subject: [PATCH] MI: PR20684, preserve user selected thread and frame when invoking MI commands Date: Tue, 9 Feb 2021 10:08:13 +0000 Message-Id: <20210209100813.710754-1-jan.vrany@labware.com> X-Mailer: git-send-email 2.30.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00, 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, 09 Feb 2021 10:08:36 -0000 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); } -- 2.30.0