2010-06-22 Hui Zhu <teawater@gmail.com>
authorHui Zhu <teawater@gmail.com>
Tue, 22 Jun 2010 02:15:46 +0000 (02:15 +0000)
committerHui Zhu <teawater@gmail.com>
Tue, 22 Jun 2010 02:15:46 +0000 (02:15 +0000)
* 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-22  Hui Zhu  <teawater@gmail.com>

* gdb.texinfo: (Process Record and Replay): Add documentation
for command "set record memory-query".

gdb/ChangeLog
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/i386-tdep.c
gdb/linux-record.c
gdb/record.c
gdb/record.h

index 568f55c..1591aa6 100644 (file)
@@ -1,3 +1,11 @@
+2010-06-22  Hui Zhu  <teawater@gmail.com>
+
+       * 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  Doug Evans  <dje@google.com>
 
        * i386-tdep.h (i386_displaced_step_copy_insn): Declare.
index cc85752..9736fd8 100644 (file)
@@ -1,3 +1,8 @@
+2010-06-22  Hui Zhu  <teawater@gmail.com>
+
+       * gdb.texinfo: (Process Record and Replay): Add documentation
+       for command "set record memory-query".
+
 2010-06-21  Stan Shebs  <stan@codesourcery.com>
 
        * gdb.texinfo: Relicense under GFDL version 1.3.
index bc1dbec..2f5ba45 100644 (file)
@@ -5694,6 +5694,22 @@ oldest record to make room for each new one, without asking.
 @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 e0f519d..435b623 100644 (file)
@@ -3503,10 +3503,21 @@ i386_record_lea_modrm (struct i386_record_s *irp)
 
   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;
     }
 
@@ -4397,11 +4408,20 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
     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
        {
@@ -5078,11 +5098,20 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
           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
             {
@@ -5635,12 +5664,20 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
              }
            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
              {
@@ -5684,12 +5721,20 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
              /* 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
                {
index 1311f00..f07a889 100644 (file)
@@ -695,21 +695,26 @@ record_linux_system_call (enum gdb_syscall syscall,
 
     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;
 
index b3d11b6..595e087 100644 (file)
@@ -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 unlimited.  Default is 200000."),
 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 36fbfd6..a4b20d2 100644 (file)
@@ -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);