From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 22366 invoked by alias); 18 Jun 2010 05:00:21 -0000 Received: (qmail 22338 invoked by uid 22791); 18 Jun 2010 05:00:18 -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-pv0-f169.google.com (HELO mail-pv0-f169.google.com) (74.125.83.169) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 18 Jun 2010 05:00:10 +0000 Received: by pvg16 with SMTP id 16so15144pvg.0 for ; Thu, 17 Jun 2010 22:00:09 -0700 (PDT) Received: by 10.143.21.34 with SMTP id y34mr373399wfi.85.1276837209217; Thu, 17 Jun 2010 22:00:09 -0700 (PDT) MIME-Version: 1.0 Received: by 10.143.33.14 with HTTP; Thu, 17 Jun 2010 21:59:49 -0700 (PDT) In-Reply-To: References: From: Hui Zhu Date: Fri, 18 Jun 2010 05:00:00 -0000 Message-ID: Subject: Re: [PATCH] prec: add a switch for memory doesn't record query To: gdb-patches ml Content-Type: text/plain; charset=ISO-8859-1 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/msg00394.txt.bz2 Some words in the doc is not very well. Did some small change. 2010-06-18 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-18 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(-) --- a/doc/gdb.texinfo +++ b/doc/gdb.texinfo @@ -5676,6 +5676,19 @@ oldest record to make room for each new @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 PREC cannot record memory change of next +instruction. If 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. It can handle it with itself. + +@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 --- a/i386-tdep.c +++ b/i386-tdep.c @@ -3461,10 +3461,21 @@ i386_record_lea_modrm (struct i386_recor if (irp->override >= 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 = 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 @@ i386_process_record (struct gdbarch *gdb case 0xa3: if (ir.override >= 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 = 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 @@ i386_process_record (struct gdbarch *gdb if (ir.aflag && (es != ds)) { /* addr += ((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 = 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 @@ i386_process_record (struct gdbarch *gdb } if (ir.override >= 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 = 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 @@ i386_process_record (struct gdbarch *gdb /* sidt */ if (ir.override >= 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 = 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 { --- a/linux-record.c +++ b/linux-record.c @@ -695,21 +695,26 @@ record_linux_system_call (enum gdb_sysca 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 = yquery (_("The next instruction is syscall munmap. " - "It will free the memory addr = 0x%s len = %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 = yquery (_("\ +The next instruction is syscall munmap.\n\ +It will free the memory addr = 0x%s len = %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; --- a/record.c +++ b/record.c @@ -152,6 +152,10 @@ struct record_entry /* This is the debug switch for process record. */ int record_debug = 0; +/* If true, query if PREC cannot record memory + change of next instruction. */ +int record_memory_query = 0; + struct record_core_buf_entry { struct record_core_buf_entry *prev; @@ -2730,4 +2734,15 @@ record/replay buffer. Zero means unlimi 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); } --- a/record.h +++ b/record.h @@ -23,6 +23,7 @@ #define RECORD_IS_USED (current_target.to_stratum == 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);