Re: [PATCH] PR59170 make pretty printers check for singular iterators

Jonathan Wakely <[email protected]>
Newsgroups gmane.comp.gdb.devel,gmane.comp.gcc.libstdc++.devel,gmane.comp.gcc.patches
Message-ID <[email protected]>
On 16/12/16 14:06 +0100, Jan Kratochvil wrote:
>On Fri, 16 Dec 2016 13:33:52 +0100, Jonathan Wakely wrote:
>> We don't do auto-deref for std::shared_ptr or std::unique_ptr, even
>> though we know the object they point to definitely is live and safe to
>> access, and that's because those types have pointer semantics not
>> reference semantics.
>
>This is wrong std::shared_ptr or std::unique_ptr is not auto-dereferenced for
>GDB printing.  But it may be more a GDB problem, not libstdc++ pretty printers
>problem.
>
>For example glib pretty printers already auto-dereference data structures:
>	5  GList* list = NULL;
>	(gdb) p/r list
>	$1 = (GList *) 0x607a00
>	(gdb) p list
>	$2 = 0x607a00 = {0x400810}
>	/usr/share/glib-2.0/gdb/glib.py
>	    if type.code == gdb.TYPE_CODE_PTR:
>		type = type.target().unqualified()
>		t = str(type)
>		if t == "GList":
>		    return GListPrinter(val, "GList")
>
>But that is more a GDB bug that should be solved even for generic pointers.
>Currently while traversing through data structures one has to randomly add or
>remove '*' from the beginning of the GDB print expression:
>
>	1	class E { int a[1000]; int i=42; } ee;
>	2	class D { E *e=&ee; } dd;
>	3	class C { D &d=dd; } cc;
>	4	class B { C *c=&cc; } bb;
>	5	int main() {}
>	(gdb) p bb
>	$1 = {c = 0x601030 <cc>}
>	(gdb) p bb.c
>	$2 = (C *) 0x601030 <cc>
>Oops, I need to add a dereference:
>	(gdb) p *bb.c
>	$3 = {d = @0x601028}
>	(gdb) p *bb.c.d
>	No symbol "operator*" in current context.
>Oops, I need to remove a dereference:
>	(gdb) p bb.c.d
>	$4 = (D &) @0x601028: {e = 0x601060 <ee>}

Wat?

bb.c.d is not a valid expression.

B::c is a pointer, it should be bb.c->d

Is it GDB policy to make invalid expressions like that "work"?

Because I'm not comfortable emulating that in the libstdc++ printers.


>	(gdb) p bb.c.d.e
>	$5 = (E *) 0x601060 <ee>
>Oops, I need to add a dereference:
>	(gdb) p *bb.c.d.e
>	$6 = {a = {0 <repeats 1000 times>}, i = 42}
>	(gdb) p *bb.c.d.e.i
>	Cannot access memory at address 0x2a
>Oops, I need to remove a dereference:
>	(gdb) p bb.c.d.e.i
>	$7 = 42

I had no idea this even worked, I'd have used bb.c->d.e->i because
that's the correct expression for accessing that variable.
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.