[PATCH v9 21/29] record-btrace: provide xfer_partial target method
Pedro Alves
palves@redhat.com
Mon Jan 13 16:47:00 GMT 2014
On 01/13/2014 12:36 PM, Metzger, Markus T wrote:
>> -----Original Message-----
>> From: Pedro Alves [mailto:palves@redhat.com]
>> Sent: Friday, December 20, 2013 4:56 PM
>
>
>> Can you show the patchlet you did, and the before/after gdb
>> output though? I'd be better to see that, and have any possible
>> follow up discussion discussion here now, rather than fractured
>> to a potential repost of the series.
>
> Here's the current version of the function:
>
> static LONGEST
> record_btrace_xfer_partial (struct target_ops *ops, enum target_object object,
> const char *annex, gdb_byte *readbuf,
> const gdb_byte *writebuf, ULONGEST offset,
> LONGEST len)
> {
> struct target_ops *t;
>
> /* Filter out requests that don't make sense during replay. */
> if (!record_btrace_allow_memory_access && record_btrace_is_replaying ())
> {
> switch (object)
> {
> case TARGET_OBJECT_MEMORY:
> {
> struct target_section *section;
>
> /* We do not allow writing memory in general. */
> if (writebuf != NULL)
> return TARGET_XFER_E_UNAVAILABLE;
>
> /* We allow reading readonly memory. */
> section = target_section_by_addr (ops, offset);
> if (section != NULL)
> {
> /* Check if the section we found is readonly. */
> if ((bfd_get_section_flags (section->the_bfd_section->owner,
> section->the_bfd_section)
> & SEC_READONLY) != 0)
> {
> /* Truncate the request to fit into this section. */
> len = min (len, section->endaddr - offset);
> break;
> }
> }
>
> return TARGET_XFER_E_UNAVAILABLE;
> }
> }
> }
>
> /* Forward the request. */
> for (ops = ops->beneath; ops != NULL; ops = ops->beneath)
> if (ops->to_xfer_partial != NULL)
> return ops->to_xfer_partial (ops, object, annex, readbuf, writebuf,
> offset, len);
>
> return TARGET_XFER_E_UNAVAILABLE;
> }
>
>
> And here's the new GDB output:
>
> (gdb) print glob
> Memory at address 0x601030 unavailable.
>
> This used to be:
>
> (gdb) print glob
> This record target does not record memory.
Alright, thanks. Once Yao is done with changing
the target_xfer_partial interface to return a read length
in an out parameter in addition to TARGET_XFER_E_UNAVAILABLE
we'll be able to make that graceful instead of an error, like:
(gdb) print glob
$1 = <unavailable>
Just like when debugging traceframes. For now, it'll do.
--
Pedro Alves
More information about the Gdb-patches
mailing list