web-dev-qa-db-ja.com

C ++で<optimized out>変数の値を表示するにはどうすればよいですか?

Gdbを使用してC++プログラムをデバッグしています。

私はこのコードを持っています:

int x = floor(sqrt(3));

そして、xの値を表示したいと思います。ただし、gdbは、xが「<optimized_out>」であると主張しています。 xの値を表示するにはどうすればよいですか?コンパイラフラグを変更する必要がありますか?

34

ここで見たように、高い最適化レベルでは、コンパイラーは中間値を削除できます。多くのオプションがあります:

  • 最適化レベルを下げると、デバッガーが物事を追跡しやすくなります。 -O0は確実に動作します(ただし、かなり遅くなります)、-O1も同様に機能する可能性があります。
  • いくつかの明示的なprintステートメントを追加して、出力値を記録できます。
  • 通常、揮発性にすることでコンパイラにこの特定の値を保持するように強制することもできます(ただし、完了したら揮発性を解除することを忘れないでください!)。ただし、制御フローは最適化されたコードでも変更される可能性があるため、変数の値を確認できたとしても、コードを見ているときにコードのどのポイントにいるかが完全にはわからない場合があります問題の変数。
38
bdonlan

最適化を無効にできない場合、または無効にしたくない場合は、変数をvolatileとして宣言してみてください。これは通常、コンパイラに最終コードの変数を保存させるのに十分です。

または、最新のGCCバージョンでは、次のように関数のみの最適化を無効にできます。

void my_function() __attribute__((optimize(0)))
{
  int x = floor(sqrt(3));
}
14
Gigi

独自の「グローバル変数」を作成し、最適化された出力変数をこのグローバル変数に出力します。デバッグが完了したら、作成したこれらのグローバルを必ず削除してください!

0