How to load C++ pretty-printers
Simon Marchi
simon.marchi@polymtl.ca
Sat Mar 16 14:25:00 GMT 2019
On 2019-03-16 08:58, Eli Zaretskii wrote:
>> From: asmwarrior <asmwarrior@gmail.com>
>> 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
More information about the Gdb
mailing list