2

この単純化された C++11 コードを考えてみましょう。これは、2 つの静的変数Aと をラップするだけBです。

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に実行します。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>::valuegdbを出力しようとするとstatic field value has been optimized out、最適化が無効になっていても、他の静的な値を出力するのに問題がないことに注意してくださいStaticValue<int, 0>::value

INITIAL_VALUEクラス テンプレートから型ではないテンプレート パラメータを削除するとStaticValue、この問題は解消され、gdb は staticvalueフィールドを問題なく出力できます。これにより、この問題は、特定の型の非型テンプレート パラメーターを持つ (インスタンス化された) クラス テンプレートの静的フィールドに固有のものであると思われます。

誰でもこれに光を当てることができますか?のバグgdbですか?もしそうなら、これらのタイプの変数をデバッグできるように簡単な方法はありますか?

注:私はgdb(7.6.1)、gcc(4.8.2)、clang(3.4) を使用しています。これらはすべて最新バージョンです。

4

1 に答える 1

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;
于 2013-09-25T18:43:56.457 に答える