From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32150 invoked by alias); 20 Jun 2010 16:30:27 -0000 Received: (qmail 32127 invoked by uid 22791); 20 Jun 2010 16:30:24 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,TW_EG X-Spam-Check-By: sourceware.org Received: from mail-px0-f169.google.com (HELO mail-px0-f169.google.com) (209.85.212.169) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 20 Jun 2010 16:30:18 +0000 Received: by pxi14 with SMTP id 14so3111643pxi.0 for ; Sun, 20 Jun 2010 09:30:15 -0700 (PDT) Received: by 10.142.202.17 with SMTP id z17mr2582902wff.140.1277051415421; Sun, 20 Jun 2010 09:30:15 -0700 (PDT) MIME-Version: 1.0 Received: by 10.143.32.8 with HTTP; Sun, 20 Jun 2010 09:29:55 -0700 (PDT) In-Reply-To: <83hbkxg2va.fsf@gnu.org> References: <83d3voiyjv.fsf@gnu.org> <83hbkxg2va.fsf@gnu.org> From: Hui Zhu Date: Sun, 20 Jun 2010 16:30:00 -0000 Message-ID: Subject: Re: [PATCH] prec: add a switch for memory doesn't record query To: Eli Zaretskii Cc: gdb-patches@sourceware.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-06/txt/msg00441.txt.bz2 On Sun, Jun 20, 2010 at 23:06, Eli Zaretskii wrote: >> From: Hui Zhu >> Date: Sun, 20 Jun 2010 14:01:38 +0800 >> Cc: gdb-patches@sourceware.org >> >> Thanks Eli. =A0What about following? >> >> @kindex set record memory-query >> @item set record memory-query >> Control the behavior when @value{GDBN} cannot record memory change >> of next instruction. =A0If ON, @value{GDBN} will query when it cannot >> record memory change of next instruction. >> >> If this option is OFF(the default), @value{GDBN} will auto ignore this >> issue. =A0When @value{GDBN} replay to this execution log, it will mark >> this log as not accessible, then it will not affect the replay. > > A slight rewording: > > =A0@kindex set record memory-query > =A0@item set record memory-query > =A0Control the behavior when @value{GDBN} is unable to record memory > =A0changes caused by an instruction. =A0If ON, @value{GDBN} will query > =A0whether to stop the inferior in that case. > > =A0If this option is OFF (the default), @value{GDBN} will automatically > =A0ignore the effect of such instructions on memory. =A0Later, when > =A0@value{GDBN} replays this execution log, it will mark the log of this > =A0instruction as not accessible, and it will not affect the replay resul= ts. > Thanks Eli. I make a new patch according to it. Please help me review it. Best, Hui 2010-06-21 Hui Zhu * i386-tdep.c (i386_record_lea_modrm): Change warning to query. (i386_process_record): Ditto. * record.c (record_memory_query): New variable. (_initialize_record): New command "set record memory-query". * record.h (record_memory_query): New extern. 2010-06-21 Hui Zhu * gdb.texinfo: (Process Record and Replay): Add documentation for command "set record memory-query". --- doc/gdb.texinfo | 13 +++++++ i386-tdep.c | 97 ++++++++++++++++++++++++++++++++++++++++-----------= ----- linux-record.c | 25 ++++++++------ record.c | 15 ++++++++ record.h | 1 5 files changed, 115 insertions(+), 36 deletions(-) Index: gdb/doc/gdb.texinfo =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gdb.orig/doc/gdb.texinfo 2010-06-21 00:24:59.322968516 +0800 +++ gdb/doc/gdb.texinfo 2010-06-21 00:26:05.818973067 +0800 @@ -5694,6 +5694,22 @@ @item show record stop-at-limit Show the current setting of @code{stop-at-limit}. +@kindex set record memory-query +@item set record memory-query +Control the behavior when @value{GDBN} is unable to record memory +changes caused by an instruction. If ON, @value{GDBN} will query +whether to stop the inferior in that case. + +If this option is OFF (the default), @value{GDBN} will automatically +ignore the effect of such instructions on memory. Later, when +@value{GDBN} replays this execution log, it will mark the log of this +instruction as not accessible, and it will not affect the replay +results. + +@kindex show record memory-query +@item show record memory-query +Show the current setting of @code{memory-query}. + @kindex info record @item info record Show various statistics about the state of process record and its Index: gdb/i386-tdep.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gdb.orig/i386-tdep.c 2010-06-21 00:24:59.246972280 +0800 +++ gdb/i386-tdep.c 2010-06-21 00:25:05.174970362 +0800 @@ -3461,10 +3461,21 @@ if (irp->override >=3D 0) { - warning (_("Process record ignores the memory change " - "of instruction at address %s because it " - "can't get the value of the segment register."), - paddress (gdbarch, irp->orig_addr)); + if (record_memory_query) + { + int q; + + target_terminal_ours (); + q =3D yquery (_("\ +Process record ignores the memory change of instruction at address %s\n\ +because it can't get the value of the segment register.\n\ +Do you want to stop the program?"), + paddress (gdbarch, irp->orig_addr)); + target_terminal_inferior (); + if (q) + return -1; + } + return 0; } @@ -4355,11 +4366,20 @@ case 0xa3: if (ir.override >=3D 0) { - warning (_("Process record ignores the memory change " - "of instruction at address %s because " - "it can't get the value of the segment " - "register."), - paddress (gdbarch, ir.orig_addr)); + if (record_memory_query) + { + int q; + + target_terminal_ours (); + q =3D yquery (_("\ +Process record ignores the memory change of instruction at address %s\n\ +because it can't get the value of the segment register.\n\ +Do you want to stop the program?"), + paddress (gdbarch, ir.orig_addr)); + target_terminal_inferior (); + if (q) + return -1; + } } else { @@ -5036,11 +5056,20 @@ if (ir.aflag && (es !=3D ds)) { /* addr +=3D ((uint32_t) read_register (I386_ES_REGNUM)) << = 4; */ - warning (_("Process record ignores the memory " - "change of instruction at address %s " - "because it can't get the value of the " - "ES segment register."), - paddress (gdbarch, ir.orig_addr)); + if (record_memory_query) + { + int q; + + target_terminal_ours (); + q =3D yquery (_("\ +Process record ignores the memory change of instruction at address %s\n\ +because it can't get the value of the segment register.\n\ +Do you want to stop the program?"), + paddress (gdbarch, ir.orig_addr)); + target_terminal_inferior (); + if (q) + return -1; + } } else { @@ -5593,12 +5622,20 @@ } if (ir.override >=3D 0) { - warning (_("Process record ignores the memory " - "change of instruction at " - "address %s because it can't get " - "the value of the segment " - "register."), - paddress (gdbarch, ir.orig_addr)); + if (record_memory_query) + { + int q; + + target_terminal_ours (); + q =3D yquery (_("\ +Process record ignores the memory change of instruction at address %s\n\ +because it can't get the value of the segment register.\n\ +Do you want to stop the program?"), + paddress (gdbarch, ir.orig_addr)); + target_terminal_inferior (); + if (q) + return -1; + } } else { @@ -5642,12 +5679,20 @@ /* sidt */ if (ir.override >=3D 0) { - warning (_("Process record ignores the memory " - "change of instruction at " - "address %s because it can't get " - "the value of the segment " - "register."), - paddress (gdbarch, ir.orig_addr)); + if (record_memory_query) + { + int q; + + target_terminal_ours (); + q =3D yquery (_("\ +Process record ignores the memory change of instruction at address %s\n\ +because it can't get the value of the segment register.\n\ +Do you want to stop the program?"), + paddress (gdbarch, ir.orig_addr)); + target_terminal_inferior (); + if (q) + return -1; + } } else { Index: gdb/linux-record.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gdb.orig/linux-record.c 2010-06-21 00:24:59.190969857 +0800 +++ gdb/linux-record.c 2010-06-21 00:25:05.174970362 +0800 @@ -695,21 +695,26 @@ case gdb_sys_munmap: { - int q; ULONGEST len; regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); regcache_raw_read_unsigned (regcache, tdep->arg2, &len); - target_terminal_ours (); - q =3D yquery (_("The next instruction is syscall munmap. " - "It will free the memory addr =3D 0x%s len =3D %u. " - "It will make record target get error. " - "Do you want to stop the program?"), - OUTPUT_REG (tmpulongest, tdep->arg1), (int) len); - target_terminal_inferior (); - if (q) - return 1; + if (record_memory_query) + { + int q; + + target_terminal_ours (); + q =3D yquery (_("\ +The next instruction is syscall munmap.\n\ +It will free the memory addr =3D 0x%s len =3D %u.\n\ +It will make record target cannot record some memory change.\n\ +Do you want to stop the program?"), + OUTPUT_REG (tmpulongest, tdep->arg1), (int) len); + target_terminal_inferior (); + if (q) + return 1; + } } break; Index: gdb/record.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gdb.orig/record.c 2010-06-21 00:24:59.430973471 +0800 +++ gdb/record.c 2010-06-21 00:25:05.178973118 +0800 @@ -152,6 +152,10 @@ /* This is the debug switch for process record. */ int record_debug =3D 0; +/* If true, query if PREC cannot record memory + change of next instruction. */ +int record_memory_query =3D 0; + struct record_core_buf_entry { struct record_core_buf_entry *prev; @@ -2730,4 +2734,15 @@ Restore the program to its state at instruction number N.\n\ Argument is instruction number, as shown by 'info record'."), &record_cmdlist); + + add_setshow_boolean_cmd ("memory-query", no_class, + &record_memory_query, _("\ +Set whether query if PREC cannot record memory change of next instruction.= "), + _("\ +Show whether query if PREC cannot record memory change of next instruction= ."), + _("\ +Default is OFF.\n\ +When ON, query if PREC cannot record memory change of next instruction."), + NULL, NULL, + &set_record_cmdlist, &show_record_cmdlist); } Index: gdb/record.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gdb.orig/record.h 2010-06-21 00:24:59.358971401 +0800 +++ gdb/record.h 2010-06-21 00:25:05.178973118 +0800 @@ -23,6 +23,7 @@ #define RECORD_IS_USED (current_target.to_stratum =3D=3D record_stratum) extern int record_debug; +extern int record_memory_query; extern int record_arch_list_add_reg (struct regcache *regcache, int num); extern int record_arch_list_add_mem (CORE_ADDR addr, int len);