diff options
author | Michael Snyder <msnyder@vmware.com> | 2009-08-04 18:19:52 +0000 |
---|---|---|
committer | Michael Snyder <msnyder@vmware.com> | 2009-08-04 18:19:52 +0000 |
commit | afd0cd3fc15852600db10b246ff5ed1dbb48fc66 (patch) | |
tree | cc071e9b27ff4ac23ae437c4d77446cac44d7031 /gdb | |
parent | f86adc0752c2c939c5889ec7ed6ee2d3f20f1fb2 (diff) | |
download | gdb-afd0cd3fc15852600db10b246ff5ed1dbb48fc66.zip gdb-afd0cd3fc15852600db10b246ff5ed1dbb48fc66.tar.gz gdb-afd0cd3fc15852600db10b246ff5ed1dbb48fc66.tar.bz2 |
2009-08-04 Hui Zhu <teawater@gmail.com>
Michael Snyder <msnyder@vmware.com>
* record.c (record_mem_entry): New field 'mem_entry_not_accessible'.
(record_arch_list_add_mem): Initialize 'mem_entry_not_accessible'.
(record_wait): Set 'mem_entry_not_accessible' flag if target
memory not readable. Don't try to change target memory if
'mem_entry_not_accessible' is set.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/record.c | 79 |
2 files changed, 62 insertions, 26 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 42c5a2d..71d73c6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2009-08-04 Hui Zhu <teawater@gmail.com> + Michael Snyder <msnyder@vmware.com> + + * record.c (record_mem_entry): New field 'mem_entry_not_accessible'. + (record_arch_list_add_mem): Initialize 'mem_entry_not_accessible'. + (record_wait): Set 'mem_entry_not_accessible' flag if target + memory not readable. Don't try to change target memory if + 'mem_entry_not_accessible' is set. + 2009-08-03 Richard Guenther <rguenther@suse.de> Jan Kratochvil <jan.kratochvil@redhat.com> diff --git a/gdb/record.c b/gdb/record.c index 85e75a0..e5b8a37 100644 --- a/gdb/record.c +++ b/gdb/record.c @@ -51,6 +51,9 @@ struct record_mem_entry { CORE_ADDR addr; int len; + /* Set this flag if target memory for this entry + can no longer be accessed. */ + int mem_entry_not_accessible; gdb_byte *val; }; @@ -275,6 +278,7 @@ record_arch_list_add_mem (CORE_ADDR addr, int len) rec->type = record_mem; rec->u.mem.addr = addr; rec->u.mem.len = len; + rec->u.mem.mem_entry_not_accessible = 0; if (target_read_memory (addr, rec->u.mem.val, len)) { @@ -727,32 +731,55 @@ record_wait (struct target_ops *ops, else if (record_list->type == record_mem) { /* mem */ - gdb_byte *mem = alloca (record_list->u.mem.len); - if (record_debug > 1) - fprintf_unfiltered (gdb_stdlog, - "Process record: record_mem %s to " - "inferior addr = %s len = %d.\n", - host_address_to_string (record_list), - paddress (gdbarch, record_list->u.mem.addr), - record_list->u.mem.len); - - if (target_read_memory - (record_list->u.mem.addr, mem, record_list->u.mem.len)) - error (_("Process record: error reading memory at " - "addr = %s len = %d."), - paddress (gdbarch, record_list->u.mem.addr), - record_list->u.mem.len); - - if (target_write_memory - (record_list->u.mem.addr, record_list->u.mem.val, - record_list->u.mem.len)) - error (_ - ("Process record: error writing memory at " - "addr = %s len = %d."), - paddress (gdbarch, record_list->u.mem.addr), - record_list->u.mem.len); - - memcpy (record_list->u.mem.val, mem, record_list->u.mem.len); + /* Nothing to do if the entry is flagged not_accessible. */ + if (!record_list->u.mem.mem_entry_not_accessible) + { + gdb_byte *mem = alloca (record_list->u.mem.len); + if (record_debug > 1) + fprintf_unfiltered (gdb_stdlog, + "Process record: record_mem %s to " + "inferior addr = %s len = %d.\n", + host_address_to_string (record_list), + paddress (gdbarch, + record_list->u.mem.addr), + record_list->u.mem.len); + + if (target_read_memory (record_list->u.mem.addr, mem, + record_list->u.mem.len)) + { + if (execution_direction != EXEC_REVERSE) + error (_("Process record: error reading memory at " + "addr = %s len = %d."), + paddress (gdbarch, record_list->u.mem.addr), + record_list->u.mem.len); + else + /* Read failed -- + flag entry as not_accessible. */ + record_list->u.mem.mem_entry_not_accessible = 1; + } + else + { + if (target_write_memory (record_list->u.mem.addr, + record_list->u.mem.val, + record_list->u.mem.len)) + { + if (execution_direction != EXEC_REVERSE) + error (_("Process record: error writing memory at " + "addr = %s len = %d."), + paddress (gdbarch, record_list->u.mem.addr), + record_list->u.mem.len); + else + /* Write failed -- + flag entry as not_accessible. */ + record_list->u.mem.mem_entry_not_accessible = 1; + } + else + { + memcpy (record_list->u.mem.val, mem, + record_list->u.mem.len); + } + } + } } else { |