This is the mail archive of the
gdb@sourceware.org
mailing list for the GDB project.
Re: MI commands with --thread (--frame?) do not preserve user selected thread / frame
- From: Jan Vrany <jan dot vrany at fit dot cvut dot cz>
- To: gdb at sourceware dot org
- Date: Wed, 19 Jun 2019 16:10:04 +0100
- Subject: Re: MI commands with --thread (--frame?) do not preserve user selected thread / frame
- References: <5df1c9d79778a5d6703bba442031b5a1bbeda141.camel@fit.cvut.cz>
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);
}