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.dovgal...@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); >> + } >> + } >> +} >> >