web-dev-qa-db-ja.com

gdb:現在のコンテキストに記号「i」がありません

Cプログラムをgdbでデバッグしているときに、forループにブレークポイントがあります。 「i」の値を出力できません(現在のコンテキストでは「i」記号がありません)。他のすべての変数の値を出力できます。正常ですか?

ここにループがあります:

for (i=0; i < datasize; i++){  
    if ( feature_mask[i] > 0 ){  
        k = feature_mask[i] - 1;  
        if (neighbors[k][nmax-1] != 0){
            neighbors[k][nmax-1] = bvalue;  
            feature_mask[i] = -feature_mask[i];
        }
    }
}
23
Ben2209

ループ内でfeature_mask[i]のみを使用するため、コンパイルされたコードから最適化されている可能性があります。

コンパイラーを呼び出すときに最適化レベルを指定しましたか? gccを使用していた場合は、-Oオプションを省略して、再試行してください。

22
a'r

最近この問題が発生しました。 GCC 5.1をコンパイルし、それを使用してC++ 11コードベースをコンパイルしました。そして、gdbでプログラムのコードをステップスルーすることはできましたが、変数の値を出力できませんでしたevery変数の場合、「現在のコンテキストにシンボル「xyz」がありません」というエラーが発生し続けました。

私はgdb 7.4を使用していましたが、その時点で入手可能な最新バージョンは7.9でした。最新バージョンのgdbをダウンロードしてコンパイルし(GCC 5.1を使用)、gdb 7.9を使用すると、変数値を再度正常に検査できました。

GCC 5.1のデバッグ情報はgdb 7.4と互換性がないと思います。

23
dreamlax

プログラムが最適化なしでコンパイルされ、デバッグ情報が有効になっていることを確認してください。ループカウンターがレジスタになってしまう可能性が非常に高いです。

4
unwind

Iをvolatileとして宣言してみてください。これにより、一部のコンパイラの最適化が妨げられます(デバッガ内でiが表示されることを期待しています)。

3
pmg

最適化オプションを確認してください。 GCCが変数をfeature_maskへのポインターに置き換える可能性があります。

2
Aaron Digulla