コンストラクター内のローカル変数は追跡されません。これはgdbのバグですか?

StackOverflow https://stackoverflow.com/questions/224090

  •  03-07-2019
  •  | 
  •  

質問

現在、Ubuntu Linuxでgdbバージョン6.7.1を実行しており、C ++プロジェクトで作業しています。

驚いたことに、コンストラクターをデバッグしようとしていたのですが、コンストラクターのスコープ内で宣言されたローカル変数はgdbによって追跡または認識されないことがわかりました。これはバグですか?

情報をありがとう..

役に立ちましたか?

解決

これは、GDBではなくGCCのバグです。

最近修正

他のヒント

最適化(-O)を使用している場合は、無効にします(-Oを削除するか、-O0を使用します)。コンパイラーは時々スマートすぎて、必要のない変数を推測したり、コンパイル時に計算を行ったり、変数のスコープを変更したり、その他いくつかのトリックを行ったりします。

「最適化なし」であっても、いくつかの些細な最適化はまだ行われますが、デバッグをあまり妨げないことに注意してください。また、インラインで大量にC ++(STLを含む)を使用すると、プログラムは最適化なしで非常に遅くなる可能性があります。

最適化されたビルドをデバッグしているようです。

デバッガはローカル変数の値を「認識」します。これは、シンボルファイルが関数スタックフレーム内の位置を記述するためです。

デバッガーは、ターゲットプロセスのメモリから変数を読み取ることができます。ただし、これにはスタックフレームにローカル変数の最新のコピーが含まれている必要があります。最適化せずにコンパイルすると、生成されたコードは、変更されるたびに常にローカル変数をスタックフレームの場所に書き戻します。これによりデバッグが簡単になりますが、実行時にコストがかかります。

最適化されたビルドでは、コンパイラはこれらの手順が不要であると頻繁に推測し、必要な限りCPUレジスタに値を保持します。ローカル変数は、スタックに書き込まれた値をまったく取得しない可能性があります。この場合のデバッガーは変数の値を追跡する方法がありませんが、これも知らず、多くの場合、スタックからのデータを変数値であるかのように報告します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top