This is the mail archive of the gdb@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Checking if addess is on stack?


On Thu, Apr 20, 2006 at 05:27:51PM +0300, Eli Zaretskii wrote:
> > Date: Thu, 20 Apr 2006 08:49:04 -0400
> > From: Daniel Jacobowitz <drow@false.org>
> > 
> > What he wants is not to stop the watchpoint when ptr goes out of scope,
> > but when ptr->i goes out of scope - if ptr points to a stack allocated
> > variable, in this function or another one.
> 
> Sorry, I'm probably too dumb and so am still in the woods--could you
> provide an example of such a situation?
> 
> Specifically, where is ptr allocated--is it itself on the stack or
> somewhere else?

Everything's clearer with code!  Let's try this.

struct kind {
  int i;
};

void func1 (void)
{
  struct kind kin;

  func2 (&kin);
}

void func2 (struct kind *my_kin)
{
  struct kind *ptr = my_kin;
  /* HERE */
}

We're at HERE.  I believe that what Vladimir wants is:
  (A) a watchpoint on the value referenced by ptr->i, at the moment,
      regardless of future changes to ptr.  I do this all the time
      and wouldn't mind an easier way, but it's just:
         print &ptr->i
         watch *$31
      (Where $31 is the right number.  DON'T try "watch *$"!  It will
      re-evaluate the expression when you next stop and get a different
      value for $ !)

  (B) For that watchpoint to go out of scope when kin.i, the underlying
      object, dies.

      Put this way, it's apparent that there is really no way to do
      this.  We could approximate it; we could figure out that it
      belonged to a frame, but not its scope within that frame.
      Well, I suppose we could... we could calculate the addresses
      of all locals of that frame within the current block and
      work out inside which one it was.

      -> Would that actually be neat and useful for the CLI?

(gdb) print $31
$32 = (int *) 0x44444444 <kin.i in frame #3>

-- 
Daniel Jacobowitz
CodeSourcery


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]