From: Hui Zhu <teawater@gmail.com>
To: Pedro Alves <pedro@codesourcery.com>
Cc: Michael Snyder <msnyder@vmware.com>,
"gdb-patches@sourceware.org" <gdb-patches@sourceware.org>,
Eli Zaretskii <eliz@gnu.org>
Subject: Re: [RFA/RFC] tracepoint gdbrsp: add -1 introduce for QTFrame:@var{n}
Date: Thu, 19 Aug 2010 07:44:00 -0000 [thread overview]
Message-ID: <AANLkTi=6ZV6Tv9oNouF=fxc3rM2ZrKEOkiaEFgossLO5@mail.gmail.com> (raw)
In-Reply-To: <201008160009.57924.pedro@codesourcery.com>
On Mon, Aug 16, 2010 at 07:09, Pedro Alves <pedro@codesourcery.com> wrote:
> On Sunday 15 August 2010 20:05:16, Michael Snyder wrote:
>> Pedro Alves wrote:
>> > On Sunday 15 August 2010 08:16:34, Hui Zhu wrote:
>> >> Sending packet: $QTFrame:ffffffff#fa...Packet received: OK
>> >
>> > I think it is a bug that this is assuming 32-bit, two's complement
>> > on both client/server sides. (not sure it that was what you were
>> > referring to).
>>
>> It's not really assuming that -- it's just assuming that no
>> legitimate frame ID will ever be as high as ffffffff.
>
> I don't know where you're getting that from. If you believe that
> to be true, then you also have to believe Hui's patch is wrong,
> as it documents "-1", not the magic hard limit of "0xffffffff".
>
> Start here:
>
> /* tfind end */
> static void
> trace_find_end_command (char *args, int from_tty)
> {
> trace_find_command ("-1", from_tty);
> ^^
> }
>
> through here:
>
> /* Worker function for the various flavors of the tfind command. */
> void
> tfind_1 (enum trace_find_type type, int num,
> ^^^^^^^
> ULONGEST addr1, ULONGEST addr2,
> int from_tty)
> {
> int target_frameno = -1, target_tracept = -1;
> struct frame_id old_frame_id = null_frame_id;
> struct breakpoint *tp;
>
> /* Only try to get the current stack frame if we have a chance of
> succeeding. In particular, if we're trying to get a first trace
> frame while all threads are running, it's not going to succeed,
> so leave it with a default value and let the frame comparison
> below (correctly) decide to print out the source location of the
> trace frame. */
> if (!(type == tfind_number && num == -1)
> && (has_stack_frames () || traceframe_number >= 0))
> old_frame_id = get_frame_id (get_current_frame ());
>
> target_frameno = target_trace_find (type, num, addr1, addr2,
> &target_tracept);
>
> if (type == tfind_number
> && num == -1
> ^^^^^^^^^
> && target_frameno == -1)
> {
> /* We told the target to get out of tfind mode, and it did. */
> }
> else if (target_frameno == -1)
> {
> /* A request for a non-existent trace frame has failed.
> Our response will be different, depending on FROM_TTY:
>
> If FROM_TTY is true, meaning that this command was
> typed interactively by the user, then give an error
> and DO NOT change the state of traceframe_number etc.
>
> However if FROM_TTY is false, meaning that we're either
> in a script, a loop, or a user-defined command, then
> DON'T give an error, but DO change the state of
> traceframe_number etc. to invalid.
>
> The rationalle is that if you typed the command, you
> might just have committed a typo or something, and you'd
> like to NOT lose your current debugging state. However
> if you're in a user-defined command or especially in a
> loop, then you need a way to detect that the command
> failed WITHOUT aborting. This allows you to write
> scripts that search thru the trace buffer until the end,
> and then continue on to do something else. */
>
> if (from_tty)
> error (_("Target failed to find requested trace frame."));
>
>
> Notice how you get to the "else if" branch. Choosing any other
> "high enough" random frame id that doesn't exist errors
> out. Only the special case of 0xffffffff being parsed as -1 on
> both target and host actually gets out of tfind mode.
>
> Continuing, the target_trace_find call ends up here:
>
> static int
> remote_trace_find (enum trace_find_type type, int num,
> ULONGEST addr1, ULONGEST addr2,
> int *tpp)
> {
> struct remote_state *rs = get_remote_state ();
> char *p, *reply;
> int target_frameno = -1, target_tracept = -1;
>
> p = rs->buf;
> strcpy (p, "QTFrame:");
> p = strchr (p, '\0');
> switch (type)
> {
> case tfind_number:
> sprintf (p, "%x", num);
> ^^^^^^^^^
> break;
>
> ... and here, NUM, is an int, and, is printed with %x. Assuming
> that prints 0xffffffff is actually host dependent (e.g., consider
> ILP64). Granted, likely not a concern on all hosts we care
> about. Still a needless assumption.
>
> The gdbserver side does:
>
> ...
> unpack_varlen_hex (packet, &frame);
> tfnum = (int) frame;
> if (tfnum == -1)
> {
> trace_debug ("Want to stop looking at traceframes");
> current_traceframe = -1;
> write_ok (own_buf);
> return;
> }
>
> Again would break if the target is ILP64, and host is not.
>
> And below that bit of code you'll see that trying to select any
> other high enough frame number that does not exist
> does not get out of tfind mode, but instead returns an error.
>
>> That might also be iffy, but less so....
>
> I should have mentioned that I consider this a _design_ bug we
> get to live with. Fixing it like I suggested would be incompatible
> with current targets, so, best leave this alone until it actually
> becomes a problem.
>
> Though, this raises the point that Hui's docs don't
> actually match what GDB sends. Not sure what to do. I guess
> I'll just pretend I didn't spot this. ;-)
>
>> IMO, negatives should have an explicit '-' encoding; in
>> > this case, "$QTFrame:-1". Note sure if the RSP docs mention something
>> > about this. We are careful in some cases (passing thread id's,
>> > I think, is one case), though clearly not everywhere.
>
> --
> Pedro Alves
>
Hi,
I am not sure we need keep this bug in the GDB. Make gdb and
gdbserver support the old version is not a very hard thing.
I make 3 patch for gdb, gdbserver and doc.
For the gdbserver, it can support the old gdb that use 0xffffffff and
new gdb that use -1.
For the gdb, if you think we need, I can add a switch or something to
make it send 0xffffffff.
What do you think about it?
Thanks,
Hui
2010-08-19 Hui Zhu <teawater@gmail.com>
* remote.c(remote_trace_find): Handle the negative.
2010-08-19 Hui Zhu <teawater@gmail.com>
* tracepoint.c(cmd_qtframe): Handle the negative.
2010-08-19 Hui Zhu <teawater@gmail.com>
* gdb.texinfo (Tracepoint Packets): add introduce for -1.
---
remote.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
--- a/remote.c
+++ b/remote.c
@@ -9979,7 +9979,10 @@ remote_trace_find (enum trace_find_type
switch (type)
{
case tfind_number:
- sprintf (p, "%x", num);
+ if (num < 0)
+ sprintf (p, "-%x", -num);
+ else
+ sprintf (p, "%x", num);
break;
case tfind_pc:
sprintf (p, "pc:%s", phex_nz (addr1, 0));
---
gdbserver/tracepoint.c | 9 +++++++++
1 file changed, 9 insertions(+)
--- a/gdbserver/tracepoint.c
+++ b/gdbserver/tracepoint.c
@@ -3157,8 +3157,17 @@ cmd_qtframe (char *own_buf)
}
else
{
+ int is_negative = 0;
+
+ if (*packet == '-')
+ {
+ is_negative = 1;
+ ++packet;
+ }
unpack_varlen_hex (packet, &frame);
tfnum = (int) frame;
+ if (is_negative)
+ tfnum = -tfnum;
if (tfnum == -1)
{
trace_debug ("Want to stop looking at traceframes");
---
doc/gdb.texinfo | 12 ++++++++++++
1 file changed, 12 insertions(+)
--- a/doc/gdb.texinfo
+++ b/doc/gdb.texinfo
@@ -33133,6 +33133,18 @@ The selected trace frame records a hit o
@end table
+If @var{n} is -1, it mean that stop debugging trace snapshots,
+resume live debugging.
+
+Replies:
+@table @samp
+@item OK
+The packet was understood and carried out.
+@item E @var{NN}
+A badly formed request was detected, or an error was encountered while
+relocating the instruction.
+@end table
+
@item QTFrame:pc:@var{addr}
Like @samp{QTFrame:@var{n}}, but select the first tracepoint frame after the
currently selected frame whose PC is @var{addr};
next prev parent reply other threads:[~2010-08-19 7:44 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-15 7:17 Hui Zhu
2010-08-15 17:20 ` Michael Snyder
2010-08-15 18:07 ` Eli Zaretskii
2010-08-15 18:14 ` Pedro Alves
2010-08-15 18:47 ` Pedro Alves
2010-08-15 19:05 ` Michael Snyder
2010-08-15 23:10 ` Pedro Alves
2010-08-19 7:44 ` Hui Zhu [this message]
2010-08-19 7:49 ` Hui Zhu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='AANLkTi=6ZV6Tv9oNouF=fxc3rM2ZrKEOkiaEFgossLO5@mail.gmail.com' \
--to=teawater@gmail.com \
--cc=eliz@gnu.org \
--cc=gdb-patches@sourceware.org \
--cc=msnyder@vmware.com \
--cc=pedro@codesourcery.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).