On 26/06/2014 04:50, lig.f...@cn.fujitsu.com wrote: > Hi, > > Why not a gdb record support? > > Thanks! > Li Guang Hi,
Good idea. We didn't think about that yet. It might be done in a futur patch-set. Thanks, Fred >> -----邮件原件----- >> 发件人: qemu-devel-bounces+lig.fnst=cn.fujitsu....@nongnu.org >> [mailto:qemu-devel-bounces+lig.fnst=cn.fujitsu....@nongnu.org] 代表 >> fred.kon...@greensocs.com >> 发送时间: 2014年6月25日 23:20 >> 收件人: qemu-devel@nongnu.org >> 抄送: peter.mayd...@linaro.org; quint...@redhat.com; >> mark.bur...@greensocs.com; dgilb...@redhat.com; amit.s...@redhat.com; >> pbonz...@redhat.com; vilan...@ac.upc.edu; fred.kon...@greensocs.com >> 主题: [Qemu-devel] [RFC PATCH v5 10/13] gdbstub: allow reverse execution in >> gdb stub. >> >> From: KONRAD Frederic <fred.kon...@greensocs.com> >> >> This allows gdb to reverse step QEMU: reverse-stepi and reverse-cont >> commands are allowed. >> >> When step_backward is called, QEMU restores a snapshot before the actual >> instruction and stops (with a debug exit) when the previous instruction is >> reached. >> >> Signed-off-by: KONRAD Frederic <fred.kon...@greensocs.com> >> --- >> gdbstub.c | 31 ++++++++++++++++++++++++++++++- >> 1 file changed, 30 insertions(+), 1 deletion(-) >> >> diff --git a/gdbstub.c b/gdbstub.c >> index 8afe0b7..99769af 100644 >> --- a/gdbstub.c >> +++ b/gdbstub.c >> @@ -33,6 +33,7 @@ >> #include "sysemu/char.h" >> #include "sysemu/sysemu.h" >> #include "exec/gdbstub.h" >> +#include "reverse-execution.h" >> #endif >> >> #define MAX_PACKET_LENGTH 4096 >> @@ -1113,6 +1114,17 @@ static int gdb_handle_packet(GDBState *s, const >> char *line_buf) >> if (cc->gdb_core_xml_file != NULL) { >> pstrcat(buf, sizeof(buf), ";qXfer:features:read+"); >> } >> + >> + #ifndef CONFIG_USER_ONLY >> + /* >> + * When reverse execution is enabled those additional >> features must >> + * be set so GDB allows reverse-stepi and reverse-continue >> command. >> + */ >> + if (cexe_is_enabled()) { >> + pstrcat(buf, sizeof(buf), >> ";ReverseStep+;ReverseContinue+"); >> + } >> + #endif /* !CONFIG_USER_ONLY */ >> + >> put_packet(s, buf); >> break; >> } >> @@ -1161,7 +1173,23 @@ static int gdb_handle_packet(GDBState *s, const >> char *line_buf) >> } >> /* Unrecognised 'q' command. */ >> goto unknown_command; >> - >> + #ifndef CONFIG_USER_ONLY >> + case 'b': >> + /* Reverse execution. */ >> + switch (*p) { >> + case 's': >> + cexe_step_backward(s->c_cpu, 1); >> + break; >> + case 'c': >> + cexe_continue_backward(s->c_cpu); >> + break; >> + default: >> + buf[0] = '\0'; >> + put_packet(s, buf); >> + break; >> + } >> + break; >> + #endif /* !CONFIG_USER_ONLY */ >> default: >> unknown_command: >> /* put empty packet */ >> @@ -1221,6 +1249,7 @@ static void gdb_vm_state_change(void *opaque, int >> running, RunState state) >> ret = GDB_SIGNAL_TRAP; >> break; >> case RUN_STATE_PAUSED: >> + cexe_stop_reverse_continue(); >> ret = GDB_SIGNAL_INT; >> break; >> case RUN_STATE_SHUTDOWN: >> -- >> 1.9.0 >>