Re: GDB returns wrong type when traversing optimized-out Fields

Roman Popov <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <CAATAM3Gu06j32JrVH=c9UU75knn7yUtZtY1hHwe5wLcsRp04Rw@mail.gmail.com>
I apologize for code typo in previous email. Here is correct code sample:

template <unsigned v1, unsigned v2>
struct TRAITS {
    static const unsigned val1 = v1;
    static const unsigned val2 = v2;
};
template < class TRAITS >
struct foo {
    static const unsigned x1 = TRAITS::val1;
    static const unsigned x2 = TRAITS::val2;
};

int main () {
    foo<TRAITS<1,2>> f1;
    // SET BREAKPOINT HERE
    return 0;
}

-Roman


2018-02-04 20:02 GMT-08:00 Roman Popov <[email protected]>:

> Hi all,
> I've encountered strange GDB behavior when requesting a value of
> optimized-away field.
> Instead of returning None or raising exception, GDB returns an
> optimizied-out value of wrong type.
>
> Here is a small reproducer *optimize_out.cpp*:
>
> template <unsigned v1, unsigned v2>
> struct TRAITS {
>     static const unsigned val1 = v1;
>     static const unsigned val2 = v2;
> };
> template < class TRAITS >
> struct foo {
>     static const unsigned x1 = TRAITS::v1;
>     static const unsigned x2 = TRAITS::v2;
> };
>
> int main () {
>     foo<TRAITS<1,2>> f1;
>     // SET BREAKPOINT HERE
>     return 0;
> }
>
> # Using g++ 7.3
> $ g++ -g optimize_out.cpp
>
> # Using gdb 8.1
> $ gdb a.out
>
> (gdb) break optimize_out.cpp:14
> (gdb) r
> (gdb) p f1
> $1 = {static x1 = <optimized out>, static x2 = <optimized out>}
>
> Ok, looks good.  Now traverse fields:
>
> (gdb) python
> >f1 = gdb.parse_and_eval("f1")
> >for field in f1.type.fields():
> >    print ("field name: ", field.name, "field type: ", field.type)
> >    field_val = f1[field]
> >    print ("optout?: ",field_val.is_optimized_out, "type:
> ",field_val.type)
> >end
> field name:  x1 field type:  const unsigned int
> optout?:  True type:  foo<TRAITS<1, 2> >
> field name:  x2 field type:  const unsigned int
> optout?:  True type:  foo<TRAITS<1, 2> >
>
>
>
> So type we get is foo<TRAITS<1, 2> >, not unsigned int.
>
> Looks like GDB-MI has same behavior. At least this code sample totatlly
> confuses GDB GUI I use.
>
> Thanks,
> Roman
>
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.