This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] Do partial xfers from trace file
- From: Stan Shebs <stan at codesourcery dot com>
- To: Mike Frysinger <vapier at gentoo dot org>
- Cc: gdb-patches at sourceware dot org, Stan Shebs <stan at codesourcery dot com>
- Date: Mon, 12 Apr 2010 20:58:10 -0700
- Subject: Re: [PATCH] Do partial xfers from trace file
- References: <4BBA5FE9.2060508@codesourcery.com> <201004122304.39043.vapier@gentoo.org>
Mike Frysinger wrote:
On Monday 05 April 2010 18:10:49 Stan Shebs wrote:
Memory blocks in the trace buffer are limited to 65K (to save a couple
bytes in the length field, since most blocks are small), and a tester
trying to collect a quarter-megabyte(!) C++ object ran into trouble with
that. The fix is really a target-side thing, but the trace file reader
needs to cognizant of this detail also. Fortunately, we can exploit
GDB's partial xfer mechanism, and just return what we find in one block,
expecting that GDB will re-request the remainder.
I also made the tfile target has_all_memory, and added an emulation of
QTro behavior, which lets disassembly and the like work, but rejects
attempts to print non-constant globals that were not collected.
Committed to trunk.
there's some problems with this commit ...
it introduces a warning which breaks with -Werror:
tracepoint.c: In function âtfile_xfer_partialâ:
tracepoint.c:3895: error: ignoring return value of âreadâ, declared with
attribute warn_unused_result
It's a little weird that some people get a complaint and others
don't... In any case, it's just an oversight, all the other read
results are being checked, and so I just committed the fix below.
Stan
2010-04-12 Stan Shebs <stan@codesourcery.com>
* tracepoint.c (tfile_xfer_partial): Check read result.
Index: tracepoint.c
===================================================================
RCS file: /cvs/src/src/gdb/tracepoint.c,v
retrieving revision 1.177
diff -p -r1.177 tracepoint.c
*** tracepoint.c 9 Apr 2010 20:46:40 -0000 1.177
--- tracepoint.c 13 Apr 2010 03:52:28 -0000
*************** tfile_xfer_partial (struct target_ops *o
*** 3892,3898 ****
if (amt > len)
amt = len;
! read (trace_fd, readbuf, amt);
return amt;
}
lseek (trace_fd, mlen, SEEK_CUR);
--- 3892,3905 ----
if (amt > len)
amt = len;
! gotten = read (trace_fd, readbuf, amt);
! if (gotten < 0)
! perror_with_name (trace_filename);
! /* While it's acceptable to return less than was
! originally asked for, it's not acceptable to return
! less than what this block claims to contain. */
! else if (gotten < amt)
! error (_("Premature end of file while reading trace file"));
return amt;
}
lseek (trace_fd, mlen, SEEK_CUR);