对于具有非类型参数的类模板的静态成员,gdb“静态字段值已被优化”

时间:2013-09-23 22:44:56

标签: c++ gcc c++11 gdb clang

考虑这个简化的C ++ 11代码,除了包装两个静态变量AB之外什么都不做:

template<typename T, T INITIAL_VALUE>
struct StaticValue { static T value; };

template<typename T, T INITIAL_VALUE> T
StaticValue<T, INITIAL_VALUE>::value { INITIAL_VALUE };

int main()
{
    using A = StaticValue< int* , nullptr >;
    using B = StaticValue< int  , 0 >;

    // reference (so code is generated) ...
    static volatile void* p = 0;
    p = &A::value;
    p = &B::value;

    return 0;
}

-O0 gcc中编译此代码而不是优化(即clang),然后在{{ 1}}像这样:

gdb

请注意,当您尝试打印(gdb) break main (gdb) run (gdb) info types StaticValue StaticValue<int*, 0u>; StaticValue<int, 0>; (gdb) print StaticValue<int*, 0u>::value static field value has been optimized out (gdb) print StaticValue<int, 0>::value $1 = 0 时,gdb会显示StaticValue<int*, 0u>::value,即使已禁用优化,但打印其他静态值static field value has been optimized out也没有问题。

如果从StaticValue<int, 0>::value类模板中删除INITIAL_VALUE非类型模板参数,则此问题就会消失,gdb在打印静态StaticValue字段时也没有问题。这使我相信该问题特定于具有某些类型的非类型模板参数的(实例化)类模板的静态字段。

有人可以对此有所了解吗?这是value中的错误吗?如果是这样,有没有一个简单的方法,所以我可以调试这些类型的变量?

注意:我正在使用gdb(7.6.1),gdb(4.8.2),gcc(3.4),这些都是最新版本。

1 个答案:

答案 0 :(得分:2)

要访问指针版本,我必须使用print 'StaticValue<int*, (int*)0>::value'。请注意info variables也使用此名称,因此这似乎是类型名称和符号之间的某些gdb不一致:

(gdb) info variables StaticValue
All variables matching regular expression "StaticValue":

File t.cpp:
int *StaticValue<int*, (int*)0>::value;
int StaticValue<int, 0>::value;