デバッグと最適化

ここでは、デバッグと最適化を制御するさまざまなコマンドライン・オプションの関係について説明します。

-g (Linux* および Mac OS* X) または /debug:full (Windows*) を使用してデバッグを有効にすると、最適化が無効になります。この場合、コマンドラインで、最適化のコンパイラー・オプションを明示的に指定することで、最適化を有効にできます。

次の表は、一般的なデバッグオプションと最適化オプションをまとめたものです。

-O0 (Linux および Mac OS X) または /Od (Windows)

/Od オプションはすべての最適化をオフにするため、最適化が行われる前にプログラムをデバッグすることができます。デバッグを行う場合のデフォルトの動作です。

Linux および Mac OS X では、-O0 (または -g) オプションを指定すると、-fno-omit-frame-pointer が設定されます。

詳細は、次のトピックを参照してください。

  • -O0 (Linux および Mac OS X) または /Od (Windows) コンパイラー・オプション

/O1 または /O1

-O2 または /O2 -O3 または /O3

コードの最適化レベルを指定します。これらのオプションを使用する場合、デバッグを行うには -debug extended を使用することを推奨します。

詳細は、次のトピックを参照してください。

  • -O1-O2-O3 (Linux および Mac OS X) または /O (Windows) コンパイラー・オプション

-g または /debug:full

ソースレベルのデバッガーで使用するため、オブジェクト・コードの中にシンボリック・デバッグ情報と行番号を生成します。-O2 (Linux および Mac OS X) または /O2 (Windows) をオフにして、-O0 (Linux および Mac OS X) または /Od (Windows) をデフォルトにします。ただし、コマンドラインで -O2-O1-O3 (Linux および Mac OS X) または /O2/O1/O3 (Windows および Mac OS X) を明示的に指定する場合は除きます。

詳細は、次のトピックを参照してください。

  • -g コンパイラー・オプション (Linux および Mac OS X) または /debug:full コンパイラー・オプション (Windows)

-debug extended (Linux および Mac OS X)

拡張デバッグの設定を指定します。

詳細は、次のトピックを参照してください。

  • -debug extended (Linux および Mac OS X)

-fp または /Oy-

(IA-32 アーキテクチャーのみ)

最適化で ebp レジスターの使用を無効にし、ebp レジスターをフレームポインターとして使用するように設定します。

詳細は、次のトピックを参照してください。

  • -fp (Linux および Mac OS X) または /Oy (Windows) コンパイラー・オプション

-traceback (Linux および Mac OS X) または /traceback (Windows)

コンパイラーがオブジェクト・ファイルに追加情報を生成するので、シンボリック・スタック・トレースバックが可能になります。

詳細は、次のトピックを参照してください。

  • -traceback コンパイラー・オプション

最適化とデバッグの組み合わせ

コマンドラインで、オブジェクト・ファイルにシンボリック・デバッグ情報を生成する -g (Linux および Mac OS X) または /debug:full (Windows) とともに、最適化オプション O1O2、または O3 を指定すると、シンボリック・デバッグ対応のコードを生成します。

-g オプションまたは /debug:full オプションとともに O1O2、または O3 オプションを指定すると、最適化の影響でデバッグ情報の一部が不正確になることがあります。Linux および Mac OS X でこの問題を回避するには、-debug extended オプションも指定します。

最適化とデバッグは明示的に選択するようにしてください。

Note icon

最適化レベルを指定しない場合、-g オプションまたは /debug:full オプションは、速度を低下させる -O0 または /Od を設定するため、プログラムの実行速度を低下させます。ただし、-O2 (Linux および Mac OS X) または /O2 (Windows) と、-g (Linux および Mac OS X) または /debug:full (Windows) の両方を指定すると、速度はそれほど低下しません。

次の表は、-g オプションまたは /debug:full オプションと、最適化オプションを組み合わせて使用した場合の効果を説明したものです。

オプション

結果

-g (Linux および Mac OS X) または /debug:full (Windows)

デバッグ情報が生成され、-O0 または /Od が有効になります (最適化が無効になります)。Linux および Mac OS X システムでは、IA-32 アーキテクチャーを対象にコンパイルする場合は、-fp が有効になります。

-g -O1 (Linux および Mac OS X) または /debug:full /O1 (Windows)

デバッグ情報が生成され、O1 による最適化が有効になります。

-g -O2 (Linux および Mac OS X) または

/debug:full /O2 (Windows)

デバッグ情報が生成され、O2 による最適化が有効になります。

-g -O2 (Linux および Mac OS X) または

/debug:full /O2 /Oy- (Windows)

デバッグ情報が生成され、O2 による最適化が有効になります。IA-32 アーキテクチャー・ベースの Windows システムでは、/Oy が無効になります。

-g -O3 -fp (Linux および Mac OS X) または /debug:full /O3 (Windows)

デバッグ情報が生成され、O3 による最適化が有効になります。Linux システムでは、IA-32 アーキテクチャーを対象にコンパイルする場合は、-fp が有効になります。

Note icon

最適化されたプログラムで debug extended を使用しても、最適化処理中にコードが移動または削除されるため、すべての変数を確認したり、すべての行にブレークポイントを設定することはできません。