diff mbox series

[v5,14/15] replay: create temporary snapshot at debugger connection

Message ID 160077701869.10249.1932448449161159554.stgit@pasha-ThinkPad-X280
State Superseded
Headers show
Series Reverse debugging | expand

Commit Message

Pavel Dovgalyuk Sept. 22, 2020, 12:16 p.m. UTC
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>
---
 gdbstub.c                 |    1 +
 include/sysemu/replay.h   |    2 ++
 replay/replay-debugging.c |   16 ++++++++++++++++
 3 files changed, 19 insertions(+)

Comments

Philippe Mathieu-Daudé Sept. 22, 2020, 12:55 p.m. UTC | #1
Hi Pavel,

On 9/22/20 2:16 PM, Pavel Dovgalyuk wrote:
> 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>
> ---
>  gdbstub.c                 |    1 +
>  include/sysemu/replay.h   |    2 ++
>  replay/replay-debugging.c |   16 ++++++++++++++++
>  3 files changed, 19 insertions(+)
> 
> diff --git a/gdbstub.c b/gdbstub.c
> index ac92273018..f19f98ab1a 100644
> --- 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:
> diff --git a/include/sysemu/replay.h b/include/sysemu/replay.h
> index b6cac175c4..2aa34b8919 100644
> --- a/include/sysemu/replay.h
> +++ b/include/sysemu/replay.h
> @@ -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 */
>  
> diff --git a/replay/replay-debugging.c b/replay/replay-debugging.c
> index d02d4e0766..bb9110707a 100644
> --- a/replay/replay-debugging.c
> +++ b/replay/replay-debugging.c
> @@ -316,3 +316,19 @@ 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) {
> +        Error *err = NULL;
> +        if (save_snapshot("start_debugging", &err) != 0) {
> +            /* Can't create the snapshot. Continue conventional debugging. */

If you deliberately ignore the error, then use NULL;
else display the error.

> +            error_free(err);
> +        }
> +    }
> +}
>
Philippe Mathieu-Daudé Sept. 22, 2020, 1:15 p.m. UTC | #2
On 9/22/20 2:55 PM, Philippe Mathieu-Daudé wrote:
> Hi Pavel,

> 

> On 9/22/20 2:16 PM, Pavel Dovgalyuk wrote:

>> 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>

>> ---

>>  gdbstub.c                 |    1 +

>>  include/sysemu/replay.h   |    2 ++

>>  replay/replay-debugging.c |   16 ++++++++++++++++

>>  3 files changed, 19 insertions(+)

>>

>> diff --git a/gdbstub.c b/gdbstub.c

>> index ac92273018..f19f98ab1a 100644

>> --- 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:

>> diff --git a/include/sysemu/replay.h b/include/sysemu/replay.h

>> index b6cac175c4..2aa34b8919 100644

>> --- a/include/sysemu/replay.h

>> +++ b/include/sysemu/replay.h

>> @@ -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 */

>>  

>> diff --git a/replay/replay-debugging.c b/replay/replay-debugging.c

>> index d02d4e0766..bb9110707a 100644

>> --- a/replay/replay-debugging.c

>> +++ b/replay/replay-debugging.c

>> @@ -316,3 +316,19 @@ 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) {

>> +        Error *err = NULL;

>> +        if (save_snapshot("start_debugging", &err) != 0) {

>> +            /* Can't create the snapshot. Continue conventional debugging. */

> 

> If you deliberately ignore the error, then use NULL;

> else display the error.


Can be cleaned on top, if Paolo is already OK with this series.

> 

>> +            error_free(err);

>> +        }

>> +    }

>> +}

>>

>
diff mbox series

Patch

diff --git a/gdbstub.c b/gdbstub.c
index ac92273018..f19f98ab1a 100644
--- 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:
diff --git a/include/sysemu/replay.h b/include/sysemu/replay.h
index b6cac175c4..2aa34b8919 100644
--- a/include/sysemu/replay.h
+++ b/include/sysemu/replay.h
@@ -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 */
 
diff --git a/replay/replay-debugging.c b/replay/replay-debugging.c
index d02d4e0766..bb9110707a 100644
--- a/replay/replay-debugging.c
+++ b/replay/replay-debugging.c
@@ -316,3 +316,19 @@  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) {
+        Error *err = NULL;
+        if (save_snapshot("start_debugging", &err) != 0) {
+            /* Can't create the snapshot. Continue conventional debugging. */
+            error_free(err);
+        }
+    }
+}