Re: How to load C++ pretty-printers

Simon Marchi <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
On 2019-03-16 08:58, Eli Zaretskii wrote:
>> From: asmwarrior <[email protected]>
>> Date: Sat, 16 Mar 2019 20:41:13 +0800
>> 
>> Under My Windows 7 system, I'm using such commands(I put them in a 
>> my.gdb script file) to load and register the pretty printers.
>> I put the libstdcxx folder in the same folder as the my.gdb file.
>> 
>> 
>> set auto-load safe-path $debugdir;$datadir/auto-load
>> python
>> import sys
>> sys.path.insert(0, '')
>> from libstdcxx.v6.printers import register_libstdcxx_printers
>> # load other pretty printers
>> end
> 
> Thanks, but I don't think I understand which part(s) of this are
> necessary in my case.  E.g., is the "set auto-load" command
> needed/relevant?  And what is the my.gdb file, I don't think I have
> such a file on my system.  The pretty-printers that came with GCC are
> installed where the GCC installation puts them, and I'd prefer not to
> change that if possible.
> 
> Also, which of the commands you've shown actually loads the
> pretty-printers from their file?
> 
> Thanks again for your response.

If it can help, I have something similar to that in my .gdbinit (whereas 
asmwarrior has put the same content in a separate file, my.gdb, which 
they then source by hand).

When libstdc++ is linked dynamically with a program and you debug that 
program, GDB will "auto-load" the file corresponding to the libstdc++ 
shared library.  In my case, it's at 
"/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.25-gdb.py".  This 
file tries to find where the GCC-provided libstdc++ pretty printers are 
installed, and adds this path to the Python import path.  It then calls 
register_libstdcxx_printers, a function provided by the libstdc++ pretty 
printers.

When libstdc++ is linked statically, the auto-load does not happen, as 
you mentioned.  So the idea here is to replicate what the auto-load 
script does, but by hand.

In my case, I have these lines to adjust the Python import path to add 
GCC's pretty printers directory:

   python import sys
   python sys.path.insert(0, '/usr/share/gcc-8.2.1/python')

And then I manually trigger the GDB auto-load script, that would 
normally be sourced automatically when loading the libstdc++ shared lib:

   source /usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.25-gdb.py

The "set auto-load safe-path" line is to define it is safe to auto-load 
things from.  If you are missing something, you should know quickly 
enough, as GDB will print you a warning, saying it didn't auto-load X, 
because X is not in a safe path (as well as information about how to 
adjust it).

Hope this helps,

Simon
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.