4

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

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

情報をありがとう..

4

3 に答える 3

5

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

最近修正されました。

于 2008-12-05T07:44:09.507 に答える
2

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

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

于 2008-10-22T00:49:10.280 に答える
2

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

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

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

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

于 2008-10-22T01:09:27.650 に答える