Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Jim Ingham <jingham@apple.com>
To: gdb-patches@sources.redhat.com
Subject: Re: [RFC] breakpoints and function prologues...
Date: Thu, 15 Aug 2002 15:26:00 -0000	[thread overview]
Message-ID: <157B023C-B09E-11D6-BDB5-00039379E320@apple.com> (raw)
In-Reply-To: <1029446396.15888.ezmlm@sources.redhat.com>


On Thursday, August 15, 2002, at 02:19  PM, 
gdb-patches-digest-help@sources.redhat.com wrote:

> From: Andrew Cagney <ac131313@ges.redhat.com>
> Date: Wed Aug 14, 2002  10:57:13  PM US/Pacific
> To: gdb-patches@sources.redhat.com
> Subject: Re: [RFC] breakpoints and function prologues...
>
>
>> I agree with Jim here.  I think most folks are actually surprised to 
>> find that if they break on the "{" beginning a function (or indeed 
>> anywhere before the first executable line of code) then their 
>> backtrace will not be correct.  Understanding why this is so requires 
>> you to "pay attention to the man behind the curtain", and that we 
>> breaks the illusion that source code maps straight-forwardly onto the 
>> running program.  Where this extra knowledge is helpful (like when 
>> debugging optimized code) it is fine to require folks to have it.  
>> But here, where it really doesn't do any good, I think it is just 
>> confusing.  And, of course, it causes big heartburn for GUIs the 
>> varobj code, as I said earlier.
>> I doubt that "{" breaks on the prologue is a crucial feature of gdb, 
>> and given that there are other ways to do this, I don't think it is 
>> really worth supporting...
>
> Michael is right here.  If a CLI user sets a breakpoint on a line 
> (with code) then that user clearly wants the breakpoint set on that 
> line.

Most users I have talked to think that setting a break on the "{" at 
the beginning of a function means the same thing as setting a 
breakpoint on the function.  But that is not the case.   "break 
funcName" is AFTER the prologue, "break file:<line containing "{"> is 
the true function beginning.

Actually a better representation of the truth is "All the users I have 
talked to have cussed me out when they found out that these two were 
not equivalent".

>
> If an architecture can't unwind the frame for that breakpoint address 
> then that is a bug in the architecture and/or GDB.  The main reason 
> the average prologue analyzer doesn't handle breakpoints in the 
> prologue is, I think, more a factor of not being tested then of being 
> ``hard''.
>

There is another problem that this causes which is again fixable, but 
harder than getting backtraces right, which I mentioned in a previous 
note, but is worth repeating.

The varobj system, which is by far the best way to store variables in 
gdb for use in an IDE, needs to know the frame in which it is creating 
a varobj, when one is made.  That is so you can have varobj's for 
various stack levels at the same time, and when you go to update them, 
they will update themselves in the correct context.  You don't want 
this to be dependant on frame number since we start numbering at the 
top of the stack so the same stack frame changes its number over time, 
but it is very useful to have the varobj's persist till the frame 
actually goes out of scope.

The way the IDE's I have worked on use varobj's is that the user puts a 
breakpoint somewhere.  The IDE stops there, and creates varobj's for 
each of the local variables, so it can populate its local variables 
window.  Then each time the user steps, the IDE just tells gdb to 
update the varobj's it has lying around.

However, suppose the user puts his breakpoint on the "{" beginning a 
function (this is what most folks do when they want to break on a 
function generically, BTW.)  Then when the IDE stops, it creates the 
varobjs for the local variables, which naively get their frame context 
from the frame pointer (which because we stopped at the beginning of 
the prologue hasn't been updated yet).  Then the user steps, and all of 
the variables fail to evaluate correctly, since their frame pointer 
actually points to the previous frame, and there is no such variable in 
the previous frame...

You could imagine ways to work around this - notice you are in the 
prologue when you go to make varobj's and either try to disassemble the 
prologue to figure out what you should do to the frame pointer to make 
it right (which is not necessarily trivial), or suspend making the 
varobj's for real till you happen to end up out of the prologue (though 
then you have to explain to the user why when they first stopped in the 
function all their local variables have no values...).  Or note the 
error when it occurs and just blindly remake all the varobj's.

None of these is very satisfactory...

Jim
--
Jim Ingham                                   jingham@apple.com
Developer Tools - gdb
Apple Computer


       reply	other threads:[~2002-08-15 22:26 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1029446396.15888.ezmlm@sources.redhat.com>
2002-08-15 15:26 ` Jim Ingham [this message]
2002-08-15 18:05   ` Andrew Cagney
2002-08-15 19:11     ` Joel Brobecker
2002-08-16 10:02       ` Jim Blandy
2002-08-16 10:17         ` Joel Brobecker
2002-08-15 19:18     ` Daniel Jacobowitz
2002-08-16  9:34     ` Jim Blandy
2002-08-16 11:34     ` Jim Ingham
2002-08-22 15:38     ` Michael Snyder
2002-08-22 15:56       ` Andrew Cagney
2002-08-22 16:34         ` Michael Snyder
     [not found] <1030059293.13128.ezmlm@sources.redhat.com>
2002-08-23 10:50 ` Jim Ingham
2002-08-23 11:34   ` Andrew Cagney
2002-08-24 18:31     ` Jim Ingham
2002-08-25  7:45       ` Andrew Cagney
2002-08-25  8:21         ` Daniel Jacobowitz
2002-08-25 15:24         ` Jim Ingham
2002-08-23 11:45   ` Michael Snyder
2002-08-23 11:48     ` Daniel Jacobowitz
     [not found] <1028439120.16228.ezmlm@sources.redhat.com>
2002-08-06 13:37 ` Jim Ingham
2002-08-14 22:57   ` Andrew Cagney
2002-08-15  6:53     ` Daniel Jacobowitz
2002-08-22 15:33       ` Michael Snyder
2002-08-22 16:19         ` Joel Brobecker
2002-08-23 11:27         ` Daniel Jacobowitz
     [not found] <1027384602.26926.ezmlm@sources.redhat.com>
2002-07-22 18:54 ` Jim Ingham
2002-07-22 22:49   ` Joel Brobecker
2002-07-22 17:36 Joel Brobecker
2002-07-23 16:53 ` Jim Blandy
2002-07-26  6:12   ` Joel Brobecker
2002-07-29 13:34     ` Daniel Jacobowitz
2002-07-29 23:57     ` Jim Blandy
2002-07-30 20:18       ` Joel Brobecker
2002-07-31 13:55         ` Jim Blandy
2002-08-01 15:44           ` Michael Snyder
2002-08-02 23:48             ` Jim Blandy

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=157B023C-B09E-11D6-BDB5-00039379E320@apple.com \
    --to=jingham@apple.com \
    --cc=gdb-patches@sources.redhat.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