libstdc++ pretty-printers vs. inspecting objects
Avi Kivity
avi@cloudius-systems.com
Mon Jul 27 08:55:00 GMT 2015
On 07/26/2015 10:45 PM, Jonathan Wakely wrote:
> On 26 July 2015 at 16:06, Avi Kivity wrote:
>> libstdc++ pretty-printers are a life-saver when inspecting containers.
>> However, they also hide information: the type of the element being inspected
>> (can often be inferred by the user) and the address of the element (which
>> cannot).
>>
>> Is there a way to add this information to the pretty-printers output?
> In principle we can add anything, the difficulty is figuring out how
> to present it clearly without cluttering or obscuring the output.
>
> Suggestions for improving the printers are very welcome.
Well, with gdb support, I can go wild:
(gdb) print /addresses $container
$5 = std::map<std::string, myvalue> with 5 elements {
(std::pair<const std::string, myvalue>*)0x46374672 { "foo":
whatever },
...
}
(the address printout is designed for easy cut'n'paste)
or even
(gdb) print $container
$5 = std::map<std::string, myvalue> with 5 elements {
$6 = { "foo": whatever },
$7 = { "bar": another one },
...
}
(gdb) print &$6
$8 = (std::pair<const std::string, myvalue>*)0x46374672
Without gdb support, we could have a user-defined flag to toggle address
printing
(gdb) glibcxx set print addresses on
(gdb) print $container
$5 = std::map<std::string, myvalue> with 5 elements {
(std::pair<const std::string, myvalue>*)0x46374672 { "foo":
whatever },
...
}
xmethods for operator[] would also help, but these would require the
user to write xmethods for user-defined constructors if used as a
container key.
I realize this is a lot of work, but as it is, debugging modern C++
programs is quite a headache with g++/gdb. gdb won't even load binaries
compiled with -O0, and with -O2, you're either in the maze that is
libstdc++, or you see nice output from the prettyprinters but you can't
inspect the data further.
More information about the Gcc-help
mailing list