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:49:00 -0000 [thread overview]
Message-ID: <AANLkTikaEpTRZLRAXvqpyhk+zOOZTyFrMwsMn9Bd5Lzw@mail.gmail.com> (raw)
In-Reply-To: <AANLkTi=6ZV6Tv9oNouF=fxc3rM2ZrKEOkiaEFgossLO5@mail.gmail.com>
On Thu, Aug 19, 2010 at 15:43, Hui Zhu <teawater@gmail.com> wrote:
> 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};
>
Sorry the doc patch is not the right version. following is the current version.
Thanks,
Hui
2010-08-19 Hui Zhu <teawater@gmail.com>
* gdb.texinfo (Tracepoint Packets): add introduce for -1.
---
doc/gdb.texinfo | 9 +++++++++
1 file changed, 9 insertions(+)
--- a/doc/gdb.texinfo
+++ b/doc/gdb.texinfo
@@ -33155,6 +33155,15 @@ 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.
+@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};
prev parent reply other threads:[~2010-08-19 7:49 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
2010-08-19 7:49 ` Hui Zhu [this message]
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=AANLkTikaEpTRZLRAXvqpyhk+zOOZTyFrMwsMn9Bd5Lzw@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