[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v10 12/24] replay: introduce breakpoint at the s
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH v10 12/24] replay: introduce breakpoint at the specified step |
Date: |
Thu, 17 Jan 2019 14:24:42 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) |
Pavel Dovgalyuk <address@hidden> writes:
> This patch introduces replay_break, replay_delete_break
> qmp and hmp commands.
> These commands allow stopping at the specified instruction.
> It may be useful for debugging when there are some known
> events that should be investigated.
> replay_break command has one argument - number of instructions
> executed since the start of the replay.
> replay_delete_break removes previously set breakpoint.
>
> Signed-off-by: Pavel Dovgalyuk <address@hidden>
>
> --
>
> v2:
> - renamed replay_break qmp command into replay-break
> (suggested by Eric Blake)
> v7:
> - introduces replay_delete_break command
> v9:
> - changed 'step' parameter name to 'icount'
> - moved json stuff to replay.json and updated the description
> (suggested by Markus Armbruster)
> v10:
> - updated descriptions (suggested by Markus Armbruster)
> ---
> hmp-commands.hx | 34 ++++++++++++++++++
> hmp.h | 2 +
> qapi/replay.json | 36 +++++++++++++++++++
> replay/replay-debugging.c | 86
> +++++++++++++++++++++++++++++++++++++++++++++
> replay/replay-internal.h | 4 ++
> replay/replay.c | 17 +++++++++
> 6 files changed, 179 insertions(+)
>
> diff --git a/hmp-commands.hx b/hmp-commands.hx
> index ba71558..d529f24 100644
> --- a/hmp-commands.hx
> +++ b/hmp-commands.hx
> @@ -1890,6 +1890,40 @@ Set QOM property @var{property} of object at location
> @var{path} to value @var{v
> ETEXI
>
> {
> + .name = "replay_break",
> + .args_type = "icount:i",
> + .params = "icount",
> + .help = "set breakpoint at the specified instruction count",
> + .cmd = hmp_replay_break,
> + },
> +
> +STEXI
> address@hidden replay_break @var{icount}
> address@hidden replay_break
> +Set replay breakpoint at instruction count @var{icount}.
> +Execution stops when the specified instruction is reached.
> +There can be at most one breakpoint. When breakpoint is set, any prior
> +one is removed. The breakpoint may be set only in replay mode and only
> +"in the future", i.e. at instruction counts greater than the current one.
> +The current instruction count can be observed with 'info replay'.
> +ETEXI
> +
> + {
> + .name = "replay_delete_break",
> + .args_type = "",
> + .params = "",
> + .help = "removes replay breakpoint",
> + .cmd = hmp_replay_delete_break,
> + },
> +
> +STEXI
> address@hidden replay_delete_break
> address@hidden replay_delete_break
> +Removes replay breakpoint which was previously set with replay_break.
> +The command is ignored when there are no replay breakpoints.
> +ETEXI
> +
> + {
> .name = "info",
> .args_type = "item:s?",
> .params = "[subcommand]",
> diff --git a/hmp.h b/hmp.h
> index d792149..c9b9b4f 100644
> --- a/hmp.h
> +++ b/hmp.h
> @@ -149,5 +149,7 @@ void hmp_info_vm_generation_id(Monitor *mon, const QDict
> *qdict);
> void hmp_info_memory_size_summary(Monitor *mon, const QDict *qdict);
> void hmp_info_sev(Monitor *mon, const QDict *qdict);
> void hmp_info_replay(Monitor *mon, const QDict *qdict);
> +void hmp_replay_break(Monitor *mon, const QDict *qdict);
> +void hmp_replay_delete_break(Monitor *mon, const QDict *qdict);
>
> #endif
> diff --git a/qapi/replay.json b/qapi/replay.json
> index ef2fb4b..cb94991 100644
> --- a/qapi/replay.json
> +++ b/qapi/replay.json
> @@ -63,3 +63,39 @@
> ##
> { 'command': 'query-replay',
> 'returns': 'ReplayInfo' }
> +
> +##
> +# @replay-break:
> +#
> +# Set replay breakpoint at instruction count @icount.
> +# Execution stops when the specified instruction is reached.
> +# There can be at most one breakpoint. When breakpoint is set, any prior
> +# one is removed. The breakpoint may be set only in replay mode and only
> +# "in the future", i.e. at instruction counts greater than the current one.
> +# The current instruction count can be observed with @query-replay.
> +#
> +# @icount: instruction count to stop at
> +#
> +# Since: 4.0
> +#
> +# Example:
> +#
> +# -> { "execute": "replay-break", "data": { "icount": 220414 } }
> +#
> +##
> +{ 'command': 'replay-break', 'data': { 'icount': 'int' } }
> +
> +##
> +# @replay-delete-break:
> +#
> +# Removes replay breakpoint which was set with @replay-break.
> +# The command is ignored when there are no replay breakpoints.
> +#
> +# Since: 4.0
> +#
> +# Example:
> +#
> +# -> { "execute": "replay-delete-break" }
> +#
> +##
> +{ 'command': 'replay-delete-break' }
> diff --git a/replay/replay-debugging.c b/replay/replay-debugging.c
> index 51f1c4d..a94685e 100644
> --- a/replay/replay-debugging.c
> +++ b/replay/replay-debugging.c
> @@ -16,6 +16,8 @@
> #include "hmp.h"
> #include "monitor/monitor.h"
> #include "qapi/qapi-commands-replay.h"
> +#include "qapi/qmp/qdict.h"
> +#include "qemu/timer.h"
>
> void hmp_info_replay(Monitor *mon, const QDict *qdict)
> {
> @@ -41,3 +43,87 @@ ReplayInfo *qmp_query_replay(Error **errp)
> retval->icount = replay_get_current_step();
> return retval;
> }
> +
> +static void replay_break(uint64_t icount, QEMUTimerCB callback, void *opaque)
> +{
> + assert(replay_mode == REPLAY_MODE_PLAY);
> + assert(replay_mutex_locked());
> + assert(replay_break_icount >= replay_get_current_step());
The identifier replay_get_current_step() is one of the few remaining
instances of "step" terminology. Whether to normalize them to "icount"
is entirely up to you.
> + assert(callback);
> +
> + replay_break_icount = icount;
> +
> + if (replay_break_timer) {
> + timer_del(replay_break_timer);
> + } else {
> + replay_break_timer = timer_new_ns(QEMU_CLOCK_REALTIME,
> + callback, opaque);
> + }
> +}
[...]
QAPI schema part
Acked-by: Markus Armbruster <address@hidden>
- [Qemu-devel] [PATCH v10 06/24] replay: finish record/replay before closing the disks, (continued)
- [Qemu-devel] [PATCH v10 06/24] replay: finish record/replay before closing the disks, Pavel Dovgalyuk, 2019/01/17
- [Qemu-devel] [PATCH v10 07/24] qcow2: introduce icount field for snapshots, Pavel Dovgalyuk, 2019/01/17
- [Qemu-devel] [PATCH v10 09/24] replay: provide an accessor for rr filename, Pavel Dovgalyuk, 2019/01/17
- [Qemu-devel] [PATCH v10 08/24] migration: introduce icount field for snapshots, Pavel Dovgalyuk, 2019/01/17
- [Qemu-devel] [PATCH v10 10/24] qapi: introduce replay.json for record/replay-related stuff, Pavel Dovgalyuk, 2019/01/17
- [Qemu-devel] [PATCH v10 11/24] replay: introduce info hmp/qmp command, Pavel Dovgalyuk, 2019/01/17
- [Qemu-devel] [PATCH v10 12/24] replay: introduce breakpoint at the specified step, Pavel Dovgalyuk, 2019/01/17
- Re: [Qemu-devel] [PATCH v10 12/24] replay: introduce breakpoint at the specified step,
Markus Armbruster <=
- [Qemu-devel] [PATCH v10 13/24] replay: implement replay-seek command, Pavel Dovgalyuk, 2019/01/17
- [Qemu-devel] [PATCH v10 14/24] replay: refine replay-time module, Pavel Dovgalyuk, 2019/01/17
- [Qemu-devel] [PATCH v10 15/24] replay: flush rr queue before loading the vmstate, Pavel Dovgalyuk, 2019/01/17
- [Qemu-devel] [PATCH v10 16/24] gdbstub: add reverse step support in replay mode, Pavel Dovgalyuk, 2019/01/17
- [Qemu-devel] [PATCH v10 18/24] replay: describe reverse debugging in docs/replay.txt, Pavel Dovgalyuk, 2019/01/17
- [Qemu-devel] [PATCH v10 17/24] gdbstub: add reverse continue support in replay mode, Pavel Dovgalyuk, 2019/01/17
- [Qemu-devel] [PATCH v10 19/24] replay: add BH oneshot event for block layer, Pavel Dovgalyuk, 2019/01/17
- [Qemu-devel] [PATCH v10 20/24] replay: init rtc after enabling the replay, Pavel Dovgalyuk, 2019/01/17