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