On Sun, 8 May 2022, 09:13 Jonathan Wakely, <jwakely.gcc@xxxxxxxxx> wrote: > > > On Sun, 8 May 2022, 00:09 Paul Smith, <paul@xxxxxxxxxxxxxxxxx> wrote: > >> On Sat, 2022-05-07 at 20:51 +0100, Jonathan Wakely wrote: >> > On Sat, 7 May 2022 at 20:07, Paul Smith <paul@xxxxxxxxxxxxxxxxx> >> > wrote: >> > GCC's 'make install' should do everything needed. That installs >> > $prefix/lib64/libstdc++.so.6.0.30-gdb.py alongside the .so file, and >> > gdb auto-loads that when debugging a process linked to the >> > libstdc++.so.6.0.30 library. That python script imports the >> > register_libstdcxx_printers function and runs it. >> > >> > Maybe you're only linking statically to libstdc++.a? >> >> Ah. Yes I'm linking statically. >> >> > Hmm, that's reminiscent of >> > https://sourceware.org/bugzilla/show_bug.cgi?id=25234 >> >> I checked and when I first attach I do see: >> >> (gdb) show lang >> The current source language is "auto; currently c". >> >> and things don't work, then after I change to a C++ frame I see: >> >> (gdb) show lang >> The current source language is "auto; currently c++". >> >> and things work. >> >> I discovered that if I add: >> >> set language c++ >> >> to my init, that it all works properly. For my purposes this is a >> sufficient workaround. >> >> It's a bit strange (confusing) that the C++ pretty-printers work >> without having to do that, but the C++ xmethods do not. >> >> Also just a data point, my previous GDB (10.2) didn't require this: >> when I attach with that version, GDB chose the auto language as "c++" >> immediately. I suppose it's worth a bugzilla report. >> >> > All the logic to do that in Python is already present in the >> > printers, >> >> I figured so I'd hoped there was something here already. I get what >> you're saying of course. Maybe I'll find some time to dig into this... >> at some point... >> >> > > (b) Ways to access the contents of containers like unique_ptr, >> > > shared_ptr, etc. from python functions. So if in my class I have >> > > "std::unique_ptr<Foo> fooPtr" and in my python functions I have a >> > > variable "fooPtr" which refers to this object, I would like a way >> > > to retrieve a gdb.Value containing its pointer. >> > >> > The UniquePtrGetWorker Xmethod already does that. You should be able >> > to just do: >> > >> > py ptr = gdb.parse_and_eval('uniqptr.get()') >> >> xmethods don't help me (IIUC) because I'm in the middle of some Python >> function and the value I want to retrieve is in a Python variable, not >> in a GDB variable, so I can't easily access it with parse_and_eval(). >> >> For instance in my examples here I'd have a python method: >> >> def find_obj(val): >> if val['mgr']['initialized']: >> return val['mgr'] >> return val['otherMgr'] >> >> or whatever, but of course I can't do this because val['mgr'] is a >> std::unique_ptr and I don't know how to dig out the object it points >> to. The above doesn't need to work as-is: something like: >> >> def find_obj(val): >> mgr = StdUnique(val['mgr']).get() >> if mgr['initialized']: >> return mgr >> return val['otherMgr'] >> >> or whatever would be fine. >> > > > 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')