具有非类型参数的类模板的静态成员的 gdb "static field value has been optimized out"



考虑这个简化的 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;
}

gcc clang编译此代码而不进行优化(即 -O0 ),然后在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

请注意,当您尝试打印StaticValue<int*, 0u>::value gdb static field value has been optimized out时,即使禁用了优化,但打印另一个静态值StaticValue<int, 0>::value也没有问题。

如果从StaticValue类模板中删除INITIAL_VALUE非类型模板参数,则此问题将消失,并且 gdb 打印静态value字段没有问题。这使我相信该问题特定于具有某些类型的非类型模板参数的(实例化)类模板的静态字段。

谁能对此有所了解?gdb中的错误吗?如果是这样,有没有一种简单的解决方法,以便我可以调试这些类型的变量?

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

要访问指针版本,我必须使用 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;

相关内容

最新更新