浏览代码

replay: create temporary snapshot at debugger connection

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>
Pavel Dovgalyuk 4 年之前
父节点
当前提交
56357d80fc
共有 3 个文件被更改,包括 17 次插入0 次删除
  1. 1 0
      gdbstub.c
  2. 2 0
      include/sysemu/replay.h
  3. 14 0
      replay/replay-debugging.c

+ 1 - 0
gdbstub.c

@@ -3321,6 +3321,7 @@ static void gdb_chr_event(void *opaque, QEMUChrEvent event)
         s->g_cpu = s->c_cpu;
         s->g_cpu = s->c_cpu;
 
 
         vm_stop(RUN_STATE_PAUSED);
         vm_stop(RUN_STATE_PAUSED);
+        replay_gdb_attached();
         gdb_has_xml = false;
         gdb_has_xml = false;
         break;
         break;
     default:
     default:

+ 2 - 0
include/sysemu/replay.h

@@ -94,6 +94,8 @@ bool replay_reverse_continue(void);
 bool replay_running_debug(void);
 bool replay_running_debug(void);
 /* Called in reverse debugging mode to collect breakpoint information */
 /* Called in reverse debugging mode to collect breakpoint information */
 void replay_breakpoint(void);
 void replay_breakpoint(void);
+/* Called when gdb is attached to gdbstub */
+void replay_gdb_attached(void);
 
 
 /* Processing the instructions */
 /* Processing the instructions */
 
 

+ 14 - 0
replay/replay-debugging.c

@@ -318,3 +318,17 @@ void replay_breakpoint(void)
     assert(replay_mode == REPLAY_MODE_PLAY);
     assert(replay_mode == REPLAY_MODE_PLAY);
     replay_last_breakpoint = replay_get_current_icount();
     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. */
+        }
+    }
+}