Sun Studio 12: dbx コマンドによるデバッグ

最適化コードのデバッグ

dbx は、最適化コードのデバッグを部分的にサポートしています。サポートの範囲は、プログラムのコンパイル方法によって大幅に異なります。

最適化コードを分析する場合、次のことができます。

最適化によりプログラムがコンパイルされ、同時に (-O -g オプションを使用して) デバッグが有効になると、dbx は制限されたモードで操作します。

どのような環境下でどのコンパイラがどの種類のシンボリック情報を発行したかについての詳細は、不安定なインタフェースとみなされ、リリース移行時に変更される可能性があります。

ソース行についての情報が提供されます。 ただし最適化プログラムについては、1 つのソース行に対するコードが複数の異なる場所で表示される場合があります。 そのため、ソース行ごとにプログラムをステップすると、オプティマイザによってどのようにコードがスケジュールされたかに依存して、ソースファイルの周りで現在の行のジャンプが発生します。

末尾呼び出しを最適化すると、関数の最後の有効な操作が別の関数への呼び出しである場合、スタックフレームがなくなります。

通常、パラメータ、局所変数、および大域変数のシンボリック情報は、最適化プログラムで利用できます。構造体、共用体、および C++ クラスの型情報と局所変数、大域変数、およびパラメータの型と名前を利用できるはずです。C++ コンパイラは、局所変数のシンボリック型情報を提供しません。 ただし、C コンパイラは、それらの情報を提供します。

パラメータと局所変数の位置に関する情報は、最適化コード内で欠落していることがよくあります。コンパイラが DWRF 位置リストを生成する場合、dbx はこの情報を使用して局所変数とパラメータの値を出力します。最適化関数の最初の命令で停止する場合、パラメータの値は ABI 適合レジスタまたはスタックの位置に格納されるため、dbx はその値を出力できます。局所変数の値を調べるには、dbx の環境変数 optim_local_vars の設定が必要な場合もあります。

デバッグ情報内の単純位置は、1 つのレジスタまたはスタックの位置を示しています。位置リストは、コード内の異なるところにある変数の別の位置を記述しており、最適化コードを記述するのにより適しています。

Sun Studio 12 以降のリリースの Sun Studio コンパイラは、位置リストを生成しませんが、一部の最適化コード用に単純位置を生成します。新しいバージョンの GNU コンパイラは、フレームポインタおよび一部のパラメータや局所変数を記述するのに位置リストを使用します。コンパイラがこの情報を記録する方法は、リリースによって異なる可能性があります。

最後のレジスタからメモリーへのストアがまだ発生していない場合、値は正確でない可能性がありますが、大域変数は表示したり、値を割り当てたりできます。

Sun Studio 11 パフォーマンスアナライザのマニュアルの 8 章には、最適化プログラムのデバッグ時に役立つ、コンパイラの最適化に関する情報が含まれています。

OpenMP プログラムの場合、-xopenmp=noopt オプションを使用してコンパイルすると、コンパイラは最適化を適用しないように指示されます。ただし、オプティマイザは OpenMp 指令を実装するために引き続きコードを処理するので、記述された問題のいくつかは、-xopenmp=noopt を使用してコンパイルされたプログラムで発生する可能性があります。

-g オプションを使用しないでコンパイルされたコード

ほとんどのデバッグサポートでは、-g を使用してプログラムをコンパイルすることを要求していますが、dbx では、-g を使用しないでコンパイルされたコードに対し、次のレベルのサポートを提供しています。

ただし、dbx では、-g オプションでコンパイルされたコードを除いては、ソースコードを表示できません。これは、strip -x が適用されたコードについてもあてはまります。

dbx を完全にサポートするために -g オプションを必要とする共有ライブラリ

完全なサポートを提供するためには、共有ライブラリも -g オプションを使用してコンパイルする必要があります。-g オプションを使用してコンパイルされていない共有ライブラリモジュールを使用してプログラムを作成した場合でも、そのプログラムをデバッグすることはできます。ただし、これらのライブラリモジュールに関する情報が生成されていないため、dbx の機能を完全に使用することはできません。

完全にストリップされたプログラム

dbx は、完全にストリップされた (制御データなどが取り除かれた) プログラムをデバッグすることができます。これらのプログラムには、プログラムをデバッグするために使用できる情報がいくつか含まれますが、外部から識別できる関数しか使用できません。一部の実行時検査は、ストリップされたプログラムまたはロードオブジェクトに対して動作します。メモリー使用状況検査およびアクセス検査は、strip -x でストリップされたコードに対して動作します。ただし、strip でストリップされたコードに対しては動作しません。