]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb, record: notify frame change on 'record stop' when selected thread moves
authorMarkus Metzger <markus.t.metzger@intel.com>
Fri, 9 May 2025 10:33:44 +0000 (10:33 +0000)
committerMarkus Metzger <markus.t.metzger@intel.com>
Mon, 3 Nov 2025 06:19:31 +0000 (06:19 +0000)
As a side effect of the 'record stop' command, threads may move to the end
of their execution history if they had been replaying.

When using CLI or TUI, there is no indication of that move for the
selected thread.

Notify about the frame change for the selected thread.  This makes CLI
print the selected frame and TUI update their view.

Add a note to the MI record-stopped event.

Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Approved-By: Tom Tromey <tom@tromey.com>
gdb/doc/gdb.texinfo
gdb/record-btrace.c
gdb/record.c
gdb/target-delegates-gen.c
gdb/target.h
gdb/testsuite/gdb.btrace/step.exp

index 821f3ed4b050d5d504b99e6805b0debf99423834..854f22b612e5bb63af0b21e741b33ea025085877 100644 (file)
@@ -32566,6 +32566,9 @@ method in use supports multiple recording formats, @var{format} will be present
 and contain the currently used format.  @xref{Process Record and Replay},
 for existing method and format values.
 
+If recording was stopped for the btrace method, threads move to the
+end of their execution history.
+
 @item =cmd-param-changed,param=@var{param},value=@var{value}
 Reports that a parameter of the command @code{set @var{param}} is
 changed to @var{value}.  In the multi-word @code{set} command,
index 4087a26f5b58a7bed9be01b3c3b0bfd294ac397f..80d22a9b4b6d5fffb560f830f6ddde47c2b075bc 100644 (file)
@@ -80,7 +80,7 @@ public:
 
   enum record_method record_method (ptid_t ptid) override;
 
-  void stop_recording () override;
+  bool stop_recording () override;
   void info_record () override;
 
   void insn_history (int size, gdb_disassembly_flags flags) override;
@@ -408,17 +408,20 @@ record_btrace_target_open (const char *args, int from_tty)
 
 /* The stop_recording method of target record-btrace.  */
 
-void
+bool
 record_btrace_target::stop_recording ()
 {
   DEBUG ("stop recording");
 
+  bool is_replaying = record_is_replaying (inferior_ptid);
   record_stop_replaying ();
   record_btrace_auto_disable ();
 
   for (thread_info &tp : current_inferior ()->non_exited_threads ())
     if (tp.btrace.target != NULL)
       btrace_disable (&tp);
+
+  return is_replaying;
 }
 
 /* The disconnect method of target record-btrace.  */
index de1a7a87a8e430d04adba20220004ab0947f6887..7f3cf541bf1ae4fc4a3e9c112412dfbf02d038ea 100644 (file)
@@ -151,12 +151,12 @@ record_read_memory (struct gdbarch *gdbarch,
 
 /* Stop recording.  */
 
-static void
+static bool
 record_stop (struct target_ops *t)
 {
   DEBUG ("stop %s", t->shortname ());
 
-  t->stop_recording ();
+  return t->stop_recording ();
 }
 
 /* Unpush the record target.  */
@@ -178,7 +178,7 @@ record_disconnect (struct target_ops *t, const char *args, int from_tty)
 
   DEBUG ("disconnect %s", t->shortname ());
 
-  record_stop (t);
+  (void) record_stop (t);
   record_unpush (t);
 
   target_disconnect (args, from_tty);
@@ -193,7 +193,7 @@ record_detach (struct target_ops *t, inferior *inf, int from_tty)
 
   DEBUG ("detach %s", t->shortname ());
 
-  record_stop (t);
+  (void) record_stop (t);
   record_unpush (t);
 
   target_detach (inf, from_tty);
@@ -305,17 +305,18 @@ cmd_record_delete (const char *args, int from_tty)
 static void
 cmd_record_stop (const char *args, int from_tty)
 {
-  struct target_ops *t;
-
-  t = require_record_target ();
-
-  record_stop (t);
+  struct target_ops *t = require_record_target ();
+  bool thread_moved = record_stop (t);
   record_unpush (t);
 
   gdb_printf (_("Process record is stopped and all execution "
                "logs are deleted.\n"));
 
   interps_notify_record_changed (current_inferior (), 0, NULL, NULL);
+
+  /* INFERIOR_PTID may have moved when we stopped recording.  */
+  if (thread_moved)
+    notify_user_selected_context_changed (USER_SELECTED_FRAME);
 }
 
 
index 164ddbb9a2ea2da5fe4e02f78c3fa82d5e9eaf18..e10a9fa0b056c4c74a86130fb6ea48ac7afbcd17 100644 (file)
@@ -172,7 +172,7 @@ struct dummy_target : public target_ops
   enum btrace_error read_btrace (struct btrace_data *arg0, struct btrace_target_info *arg1, enum btrace_read_type arg2) override;
   const struct btrace_config *btrace_conf (const struct btrace_target_info *arg0) override;
   enum record_method record_method (ptid_t arg0) override;
-  void stop_recording () override;
+  bool stop_recording () override;
   void info_record () override;
   void save_record (const char *arg0) override;
   bool supports_delete_record () override;
@@ -353,7 +353,7 @@ struct debug_target : public target_ops
   enum btrace_error read_btrace (struct btrace_data *arg0, struct btrace_target_info *arg1, enum btrace_read_type arg2) override;
   const struct btrace_config *btrace_conf (const struct btrace_target_info *arg0) override;
   enum record_method record_method (ptid_t arg0) override;
-  void stop_recording () override;
+  bool stop_recording () override;
   void info_record () override;
   void save_record (const char *arg0) override;
   bool supports_delete_record () override;
@@ -3794,24 +3794,28 @@ debug_target::record_method (ptid_t arg0)
   return result;
 }
 
-void
+bool
 target_ops::stop_recording ()
 {
-  this->beneath ()->stop_recording ();
+  return this->beneath ()->stop_recording ();
 }
 
-void
+bool
 dummy_target::stop_recording ()
 {
+  return false;
 }
 
-void
+bool
 debug_target::stop_recording ()
 {
   target_debug_printf_nofunc ("-> %s->stop_recording (...)", this->beneath ()->shortname ());
-  this->beneath ()->stop_recording ();
-  target_debug_printf_nofunc ("<- %s->stop_recording ()",
-             this->beneath ()->shortname ());
+  bool result
+    = this->beneath ()->stop_recording ();
+  target_debug_printf_nofunc ("<- %s->stop_recording () = %s",
+             this->beneath ()->shortname (),
+             target_debug_print_bool (result).c_str ());
+  return result;
 }
 
 void
index 40823253a0f8c8ab949d6f685644f8bcc13ea8c0..eb8ead4a33c1bc64a05bb7d370b1672e8c8189e1 100644 (file)
@@ -1236,9 +1236,9 @@ struct target_ops
     virtual enum record_method record_method (ptid_t ptid)
       TARGET_DEFAULT_RETURN (RECORD_METHOD_NONE);
 
-    /* Stop trace recording.  */
-    virtual void stop_recording ()
-      TARGET_DEFAULT_IGNORE ();
+    /* Stop trace recording.  Return whether the selected thread moved.  */
+    virtual bool stop_recording ()
+      TARGET_DEFAULT_RETURN (false);
 
     /* Print information about the recording.  */
     virtual void info_record ()
index aba43ae4f3dd962f7b5dcae87c15dae80691a7f0..55b8b5d0b697f08caa5d85a0755354697bfa472f 100644 (file)
@@ -50,7 +50,7 @@ with_test_prefix "replay" {
 
 # Stop recording and try to step live (pr19340).
 with_test_prefix "live" {
-    gdb_test "record stop" "Process record is stopped.*"
+    gdb_test "record stop" "Process record is stopped.*fun4\.4.*"
     gdb_test "reverse-next" "Reverse execution is not currently supported.*"
     gdb_test "step" ".*fun3\.2.*"
 }