プログラムを効率的にデバッグするためには、 そのプログラムのコンパイル時にデバッグ情報を生成する必要があります。 このデバッグ情報はオブジェクト・ファイルに格納されます。 この情報は、 個々の変数や関数の型、 ソース・コード内の行番号と実行形式コードのアドレスとの対応などを含みます。
デバッグ情報の生成を要求するには、 コンパイラの実行時に`-g'オプションを指定します。
多くのCコンパイラでは、 `-g'オプションと`-O'オプションを同時に指定することができません。 このようなコンパイラでは、 デバッグ情報付きの最適化された実行ファイルを生成することができません。
gnuのCコンパイラであるGCCは、 `-O'オプションの有無にかかわらず、 `-g'オプションが指定できます。 したがって、 最適化されたコードをデバッグすることが可能です。 プログラムをコンパイルするときには、 常に`-g'オプションを指定することをお勧めします。 自分のプログラムは正しいと思うかもしれませんが、 自分の幸運を信じて疑わないというのは無意味なことです。
`-g -O'オプションを指定してコンパイルされたプログラムをデバッグするときには、 オプティマイザがコードを再調整していることを忘れないでください。 デバッガは、 実際に存在するコードの情報を表示します。 実行されるパスがソース・ファイルの記述と一致していなくても、 あまり驚かないでください。 これは極端な例ですが、 定義されているが実際には使われていない変数を、 GDBは認識しません。 なぜなら、 コンパイラの最適化処理により、 そのような変数は削除されるからです。
命令スケジューリング機能を持つマシンなどでは、 `-g'を指定してコンパイルされたプログラムでは正しく動作することが、 `-g -O'を指定してコンパイルされたプログラムでは正しく動作しないということがあります。 `-g -O'を指定してコンパイルされたプログラムのデバッグで何かおかしな点があれば、 `-g'だけを指定してコンパイルしてみてください。 これで問題が解決するようであれば、 (再現環境と一緒に) 障害として私たちに報告してください。
古いバージョンのgnu Cコンパイラは、 デバッグ情報の生成のためのオプションの1つとして `-gg'をサポートしていました。 現在のGDBはこのオプションをサポートしていません。 お手元のgnu Cコンパイラにこのオプションがあるようであれば、 それは使わないでください。