Re: Help using the GDB C++ STL pretty-printers / xmethods

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



 Am Montag, 9. Mai 2022, 12:47:49 MESZ hat Hannes Domani <ssbssa@xxxxxxxx> Folgendes geschrieben:

> Am Sonntag, 8. Mai 2022, 22:26:37 MESZ hat Paul Smith <paul@xxxxxxxxxxxxxxxxx> Folgendes geschrieben:
>
> > On Sun, 2022-05-08 at 15:44 -0400, Paul Smith wrote:
> > > On Sun, 2022-05-08 at 09:16 +0100, Jonathan Wakely wrote:
> > > > > gdb.set_convenience_variable('mgr', val['mgr'])
> > > > > init = gdb.parse_and_eval('$mgr->initialized')
> > > > >
> > > > > This will use the xmethod to evaluate the expression.
> > > >
> > > > And then:
> > > >
> > > > if init:
> > > >     return gdb.parse_and_eval('*$mgr')
> > >
> > > Unfortunately, this doesn't work :(.  I can't do it from the GDB
> > > command line or python (I have tried both with the same results).
> > > Something about convenience variables doesn't play well with xmethods
> > > (or maybe this xmethod implementation specifically?)
> >
> > Hm.  I have done a fair amount of work writing GDB Python convenience
> > functions and commands, but I've only done a small amount of pretty-
> > printer work and no xmethod implementations.
> >
> > But I don't understand this from the C++ STL xmethods.py:
> >
> >   class UniquePtrGetWorker(gdb.xmethod.XMethodWorker):
> >     ...
> >       def __call__(self, obj):
> >           impl_type = obj.dereference().type.fields()[0].type.tag
> >
> > Why are we using dereference() here?  Aren't we expecting to receive a
> > gdb.Value of type std::unique_ptr here, not _pointer to_
> >
> > std::unique_ptr?
> >
> >
> > But, it definitely doesn't work to remove the dereference(), and also
> > the value we get normally IS a pointer; adding debugging above I see:
> >
> >   type: 'std::unique_ptr<Foo, std::default_delete<Foo> > *'
> >
> > I don't really grok xmethods so I'm not sure how calling "foo->val"
> > when "foo" is std::unique_ptr<> results in the __call__ method being
> > invoked with a gdb.Value of type std::unique_ptr<>*.
> >
> > My suspicion (not based on anything) is that whatever the reason is, is
> > why I can't use these xmethods with a convenience variable.
>
>
> This is documented in the XMethod API, see XMethodWorker.__call__ in [1]:
>
> The first element is always the this pointer value.
>
>
> Why don't you just set the convenience variable to the address?:
>
> (gdb) set $xx=&foo
> (gdb) p (*$xx)->val
> $7 = 0


I forgot to add the link.

[1] https://sourceware.org/gdb/current/onlinedocs/gdb/Xmethod-API.html#index-XMethodWorker_002e_005f_005fcall_005f_005f




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux