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];
}
}
}
ループ内でfeature_mask[i]
のみを使用するため、コンパイルされたコードから最適化されている可能性があります。
コンパイラーを呼び出すときに最適化レベルを指定しましたか? gccを使用していた場合は、-O
オプションを省略して、再試行してください。
最近この問題が発生しました。 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と互換性がないと思います。
プログラムが最適化なしでコンパイルされ、デバッグ情報が有効になっていることを確認してください。ループカウンターがレジスタになってしまう可能性が非常に高いです。
Iをvolatile
として宣言してみてください。これにより、一部のコンパイラの最適化が妨げられます(デバッガ内でi
が表示されることを期待しています)。
最適化オプションを確認してください。 GCCが変数をfeature_mask
へのポインターに置き換える可能性があります。