replay: create temporary snapshot at debugger connection
authorPavel Dovgalyuk <pavel.dovgalyuk@ispras.ru>
Sat, 3 Oct 2020 17:14:01 +0000 (20:14 +0300)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 6 Oct 2020 06:34:49 +0000 (08:34 +0200)
When record/replay does not uses overlays for storing the snapshots,
user is not capable of issuing reverse debugging commands.
This patch adds creation of the VM snapshot on the temporary
overlay image, when the debugger connects to QEMU.
Therefore the execution can be rewind to the moment
of the debugger connection while debugging the virtual machine.

Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgalyuk@ispras.ru>
--

v6:
 - dropped unused error processing (suggested by Philippe Mathieu-Daudé)
Message-Id: <160174524096.12451.11651270339216758643.stgit@pasha-ThinkPad-X280>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
gdbstub.c
include/sysemu/replay.h
replay/replay-debugging.c

index ac9227301803201ad373bf4250b3968324624781..f19f98ab1ab7d36c53a715bf885c77cfe01675d7 100644 (file)
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -3321,6 +3321,7 @@ static void gdb_chr_event(void *opaque, QEMUChrEvent event)
         s->g_cpu = s->c_cpu;
 
         vm_stop(RUN_STATE_PAUSED);
+        replay_gdb_attached();
         gdb_has_xml = false;
         break;
     default:
index 172b20c60c139861a76545c08c6d548493ebcbd0..56c0c17c30b02a1280ea7f3d3b6782657a07439f 100644 (file)
@@ -94,6 +94,8 @@ bool replay_reverse_continue(void);
 bool replay_running_debug(void);
 /* Called in reverse debugging mode to collect breakpoint information */
 void replay_breakpoint(void);
+/* Called when gdb is attached to gdbstub */
+void replay_gdb_attached(void);
 
 /* Processing the instructions */
 
index 30ca38e5dd1fd831ed9dfa7de3554e3e9c483ef1..ee9e86daa9ba42153a8930510cf5852c9dab9fa9 100644 (file)
@@ -318,3 +318,17 @@ void replay_breakpoint(void)
     assert(replay_mode == REPLAY_MODE_PLAY);
     replay_last_breakpoint = replay_get_current_icount();
 }
+
+void replay_gdb_attached(void)
+{
+    /*
+     * Create VM snapshot on temporary overlay to allow reverse
+     * debugging even if snapshots were not enabled.
+     */
+    if (replay_mode == REPLAY_MODE_PLAY
+        && !replay_snapshot) {
+        if (save_snapshot("start_debugging", NULL) != 0) {
+            /* Can't create the snapshot. Continue conventional debugging. */
+        }
+    }
+}