public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Andrew Burgess <aburgess@redhat.com>
To: Pedro Alves <pedro@palves.net>
Cc: gdb-patches@sourceware.org, Eli Zaretskii <eliz@gnu.org>
Subject: Re: [PATCH v2 1/2] Always show locations for breakpoints & show canonical location spec
Date: Mon, 10 Apr 2023 16:07:49 +0100	[thread overview]
Message-ID: <877cujbwsa.fsf@redhat.com> (raw)
In-Reply-To: <9f7b3fba-f260-7901-ece0-51f377839733@palves.net>

Pedro Alves <pedro@palves.net> writes:

> On 2022-05-26 16:03, Eli Zaretskii wrote:
>>> Date: Thu, 26 May 2022 15:04:21 +0100
>>> Cc: gdb-patches@sourceware.org
>>> From: Pedro Alves <pedro@palves.net>
>>>
>>>> Yes, and that's the point I tried to make: you can enable or disable a
>>>> breakpoint at some location, not enable/disable the location itself,
>>>> which is what the text was saying.
>>>
>>> "enable or disable a breakpoint at some location" is slightly ambiguous because
>>> it doesn't distinguish between the whole breakpoint vs one individual location
>>> the breakpoint is set at.
>> 
>> How so? it says "disable a breakpoint AT SOME LOCATION".  IOW, the
>> breakpoint is disabled/enabled only at some location.
>> 
>>>>> I really think that this is the wrong direction, and working on
>>>>> the patch that I pointed at above really convinced me so even more.
>>>>> I believe that that patch will convince you as well.  Please take a look
>>>>> there.
>>>>
>>>> I did, and it didn't.  It actually convinced me even more that we
>>>> cannot use "location" in both contexts without creating confusion.
>>>
>>> What a mystery.  The current text uses location throughout and it
>>> isn't a problem.
>> 
>> I explained why in another message: we were using "location" in just
>> one sense, now we are supposed to be using it in two senses: one for
>> "specifying" a location, the other for the location itself.  In many
>> situations in life the thing and its specification are one and the
>> same, or tightly coupled.  E.g., we frequently say in the
>> documentation of a program stuff like
>> 
>>   This function deletes the specified FILE...
>> 
>> which doesn't distinguish between FILE and its specification.
>> 
>
> A better example would be:
>
>    This function deletes all files that match GLOB...
>
> and then what is a GLOB is described somewhere, and a glob is very
> obviously different from the actual files the glob matches.
>
>
>> We are now supposed to distinguish between a "location" and its
>> "specification".  This is not easy to do, and I think it risks
>> creating a confusion.  This is based both on experience with other
>> things that are defined through some sort of "specification", and on
>> actual reading the text of your patches.
>> 
>
> I don't think it is, difficult.  A spec looks like one of these strings:
>
>  func
>  source:line
>  *expression
>  -source src -line l
>  -function func -label lab
>
> etc.  You can't confuse this with an actual concrete location.  A spec
> resolves to locations.  But it isn't itself a location.  The documentation
> for each command doesn't say that currently, just uses @var{location}, but
> if you follow the xfer to the "Specify locations" node, it is clear there.
>
> But we'll make it clearer, regardless.
>
>> 
>>>> But now I'm beginning to wonder what is your definition of "location"
>>>> in this context?  What does it entail if two different "locations" can
>>>> be resolved to the same code address?  And where is that meaning of
>>>> "location" described?  The text you proposed uses "location(s) that
>>>> match(es) the location spec", which doesn't seem to imply any
>>>> attributes except the "place" where the breakpoint will be set, since
>>>> "location spec" is just source-level description of one or more such
>>>> "places".  How does "location" imply anything about local variables,
>>>> commands, etc.?
>>>
>>> A location is some actual place in the program, identifiable by
>>> some "coordinates".  Some source line in the program can be a location
>>> in the program, if you have its coordinates.  Line number alone isn't sufficient.
>>> A source location is fully defined by the path to its file and the line number, the
>>> full prototype of its function, and the address of the first instruction that the line was
>>> compiled down to.  Addresses are per-inferior, so add inferior to the coordinate system.  If
>>> you have the same code loaded in multiple inferiors, GDB considers the same code at each
>>> address its own location.  E.g. here's a breakpoint set at handle_inferior_event, with two inferior gdbs loaded:
>>>
>>>  3       breakpoint     keep y   <MULTIPLE>         
>>>  3.1                         y   0x00000000004ea2ac in handle_inferior_event(execution_control_state*) at /home/pedro/gdb/binutils-gdb/src/gdb/infrun.c:5331 inf 1
>>>  3.2                         y   0x00000000004ea2ac in handle_inferior_event(execution_control_state*) at /home/pedro/gdb/binutils-gdb/src/gdb/infrun.c:5331 inf 2
>>>
>>> Note "inf 1" and "inf 2" on the right hand side.  So you have two locations for the same code, in two inferiors.
>> 
>> I don't think we have this described on this level of detail anywhere,
>> do we?  I think if we agree to use "source location" for this, we
>> should have all of the above in the description of the term.
>> 
>>> You may not have debug info for all locations in the program.  So a location
>>> may be missing some coordinates, like the file/line.  It won't be a source location,
>>> but it is still some actual program location.  Or you may lack the full path
>>> to the filename.  Etc.  But the tuple of the coordinates identify some actual spot in
>>> the actual program.  Address alone isn't sufficient to identify source location,
>>> given inlining.  Of course, if you don't have debug info, address is all you got.
>> 
>> So we can also have "incomplete" source locations, right?  And the
>> source location has some minimum set of attributes that _must_ be
>> resolved in order for the source location to be valid, right?  We
>> should then document that as well, including the possibility of its
>> being incomplete.
>> 
>
> I documented all this in the Location Specifications section.  I'll send v4 in a bit.
>
> I did not go for "source locations", however.  I swear I am not trying to be
> difficult...  The issue is that as I tried to describe things, "source location" read
> awkwardly, and kind of a lie-ish.  Because, you can have usable resolved locations without
> sources, even if they are incomplete.  It depends on command if they are usable.  Instead, I
> noticed something.
>
> Here:
>
>   * List::                        Printing source lines
>  -* Specify Location::            How to specify code locations
>  +* Location Specifications::     How to specify code locations
>                                                  ^^^^^^^^^^^^^^
>
> And note what the intro paragraph of that node currently says:
>
>   "Several GDB commands accept arguments that specify a location or locations of your program’s code."
>
> Clearly the arguments specify something, and that something is ... "locations of your program’s code."
>
> So I went with "code locations" instead.  I actually first started by using "program location"
> throughout, or "location in your program", but then as I polished, and polished, and
> polished, I ended up using "code location" everywhere.  I think it reads really nicely.
> Code location is nice for being a superset of "resolved complete source location" and "resolved location
> that is just some address and maybe function name" (because we don't have debug info).  It fits both.
>
> I also went through all the command's documentation again, looked at the code for each,
> checking what exactly GDB looks for in the resolved locations, and switched the manual
> to refer to resolved lines or resolved addresses etc.  Very similar to your earlier comments,
> except that by switching to use "resolved to" instead of "matches", it now looks better
> to me too this way.  For example:
>
> +@itemx info line @var{locspec}
>  Print the starting and ending addresses of the compiled code for
> -source line @var{location}.  You can specify source lines in any of
> -the ways documented in @ref{Specify Location}.  With no @var{location}
> -information about the current source line is printed.
> +source lines that @var{locspec} resolves to.  @xref{Location
> +Specifications}, for the various forms of @var{locspec}.
> +With no @var{locspec}, information about the current source line is
> +printed.
>
>  @kindex info macros
> -@item info macros @var{location}
> -Show all macro definitions that are in effect at the location specified
> -by @var{location},  and describe the source location or compiler
> -command-line where those definitions were established.
> +@item info macros @var{locspec}
> +Show all macro definitions that are in effect at the source line
> +@var{locspec} resolves to, and describe the source location
> +or compiler command-line where those definitions were established.
>
> etc.
>
> For the case where you wanted to add @var{addr}, I removed
> the parenthesis from the sentence, like:
>
> -We can also inquire (using @code{*@var{addr}} as the form for
> -@var{location}) what source line covers a particular address:
> +We can also inquire, using @code{*@var{addr}} as the form for
> +@var{locspec}, what source line covers a particular address
> +@var{addr}:
>
> Oh, and for the "source lines" ambiguity in the "list command", I tweaked it
> by saying something else other than "ambiguous locations".  Like so:
>
>  +                                                            If either
>  +@var{first} or @var{last} resolve to more than one source line in the
>  +program, then the list command will show the list of resolved source
>  +lines and does not proceed with the source code listing.
>
> The trick is to say "source code listing" instead of "print source lines".
>
>
> I did a lot of small changes here and there throughout...
>
> Anyhow, you'll see in v4 in a bit.

Hi Pedro,

I was doing some work in the 'info breakpoints' area, and remembered
this patch.  Was this something you're still working on?

Thanks,
Andrew


  parent reply	other threads:[~2023-04-10 15:07 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-19 21:55 [PATCH 0/2] info breakpoints improvements Pedro Alves
2022-05-19 21:55 ` [PATCH 1/2] Always show locations for breakpoints & show canonical location spec Pedro Alves
2022-05-20  6:45   ` Eli Zaretskii
2022-05-23 17:04     ` [PATCH v2 " Pedro Alves
2022-05-24 13:06       ` Eli Zaretskii
2022-05-25 19:32         ` Pedro Alves
2022-05-26 12:48           ` Eli Zaretskii
2022-05-26 14:04             ` Pedro Alves
2022-05-26 15:03               ` Eli Zaretskii
2022-05-26 15:10                 ` Pedro Alves
2022-05-26 15:33                   ` Eli Zaretskii
2022-05-26 19:29                 ` Pedro Alves
2022-05-26 19:55                   ` Eli Zaretskii
2022-05-26 20:40                     ` Pedro Alves
2023-04-10 15:07                   ` Andrew Burgess [this message]
2022-05-20  7:45   ` [PATCH " Metzger, Markus T
2022-05-23 17:05     ` Lancelot SIX
2022-05-19 21:55 ` [PATCH 2/2] Introduce "info breakpoints -hide-locations" Pedro Alves
2022-05-20  6:48   ` Eli Zaretskii
2022-05-20  5:57 ` [PATCH 0/2] info breakpoints improvements Eli Zaretskii
2022-05-23 17:06   ` Pedro Alves
2022-05-24 13:14     ` Eli Zaretskii
2022-05-24 13:45       ` Pedro Alves
2022-05-24  8:38 ` Luis Machado
2022-05-24 10:02   ` Pedro Alves
2022-05-24 13:20     ` Eli Zaretskii
2022-05-24 13:29       ` Pedro Alves
2022-05-24 13:43         ` Eli Zaretskii
2022-05-24 13:50           ` Pedro Alves
2022-05-24 14:03             ` Eli Zaretskii
2022-05-24 14:09               ` Pedro Alves
2022-05-24 14:25                 ` Eli Zaretskii
2022-05-24 14:33                   ` Pedro Alves
2022-05-24 14:11               ` Andreas Schwab
2022-05-24 14:17                 ` Pedro Alves
2022-05-24 19:49                   ` [PATCH] Show enabled locations with disabled breakpoint parent as "y-" (Re: [PATCH 0/2] info breakpoints improvements) Pedro Alves
2022-05-25 13:57                     ` Eli Zaretskii
2022-05-25 19:19                       ` Pedro Alves
2022-05-24 14:26                 ` [PATCH 0/2] info breakpoints improvements Eli Zaretskii

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=877cujbwsa.fsf@redhat.com \
    --to=aburgess@redhat.com \
    --cc=eliz@gnu.org \
    --cc=gdb-patches@sourceware.org \
    --cc=pedro@palves.net \
    /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).