MI commands with --thread (--frame?) do not preserve user selected thread / frame

Jan Vrany jan.vrany@fit.cvut.cz
Wed Jun 19 15:10:00 GMT 2019


On Wed, 2019-06-19 at 11:53 +0100, Jan Vrany wrote:
> Hi, 
> 
> I was debugging a multithreaded program and realized that using --thread option to
> verious MI command silently changes user selected thread - here's an example using
> separate UI and CLI chahhel (tested on commit 6f5601c4d0)
> 
> 
...
> 
> 
> As you can see, there was no `frame`, `thread`, `-select-frame` or `-thread-select` command between
> first and second info thread / frame commands on CLI, yet the selected thread / frame changed (silently).
> 
> Is this intended behavior? If so what's the rationale?
> 

Simple patch that preserves user selected context:

---

diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index 13c310d494..ac3969f1b4 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -2060,6 +2060,7 @@ mi_cmd_execute (struct mi_parse *parse)
       set_current_program_space (inf->pspace);
     }
 
+  gdb::optional<scoped_restore_current_thread> thread_saver;
   if (parse->thread != -1)
     {
       thread_info *tp = find_thread_global_id (parse->thread);
@@ -2070,9 +2071,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<scoped_restore_selected_frame> frame_saver;
   if (parse->frame != -1)
     {
       struct frame_info *fid;
@@ -2080,8 +2083,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);
     }



More information about the Gdb mailing list