Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
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};


      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