デバッガーは、-g オプションでコンパイルされた最適化プログラムをデバッグするのに役立ちます。しかし、プログラムに関する情報の一部は、正確ではない場合があります。特に、変数の場所や値が正しくないことがよくあります。これは、デバッグ情報の共通フォームが、-O1、-O2、-O3 オプションやその他の最適化オプションで提供される最適化の複雑性を完全に表していないためです。
この制限を回避するため、-O1、-O2、または -O3 の最適化オプションに加えて、-g および -debug 拡張オプションの両方を指定して、インテル® コンパイラーでプログラムをコンパイルしてください。これにより、より詳細ですが、より少ない共通の対応デバッグ情報が生成されます。これは、次のことを可能にします。
レジスター内でも、また別々のコンパイル時での異なる場所でも、変数の正しい場所と値を報告します。次の点に注意してください。
変数によっては、最適化と離され、別の型のデータに変換されるか、場所がプログラムのすべてのポイントで記録されません。このような場合、変数の出力は <no value> になります。
そうでない場合、値と場所は正確です。レジスターにはアドレスがないので、print &i コマンドでは、警告が出力される場合があります。
ほとんどの変数と引数は、関数のプロローグおよびエピローグでは未定義です。ただし、break main コマンドは通常、プロローグの後、プログラムを停止します。
inline キーワードで識別し、スタックトレースのインライン関数を表示します。次の点に注意してください。
スタックの一番上の関数と、通常の呼び出し (非インライン) を行う関数のみが命令ポインターを表示します。これは、ほかの関数は、呼び出されたインライン関数とハードウェアで定義されたスタックフレームを共有するためです。
リターン命令は、非インライン呼び出しを行った関数へのみ、コントロールを返します。インライン呼び出しには定義されたリターンアドレスがないためです。
up、down、call コマンドは通常どおりに動作します。
インライン展開された関数にブレークポイントを設定できます。
次の制限事項があります。
最適化では、ソース行の命令が、ソースの順序とは異なる順で生成されることがよくあります。1 つのソース行の命令は、他のソース行の命令と混在されます。そのようなコードをステップ実行すると、プログラムは各ソース行で順に停止せず、ソース行が変わるたびに停止します。