mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:54:41 +08:00
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-22 Hui Zhu <teawater@gmail.com> * gdb.texinfo: (Process Record and Replay): Add documentation for command "set record memory-query".
This commit is contained in:
parent
b55078be0a
commit
bb08c43207
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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;
|
||||
|
||||
|
15
gdb/record.c
15
gdb/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 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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user