Oracle Solaris Studio 12.2: dbx コマンドによるデバッグ

最適化コードのデバッグ

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

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

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

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

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

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

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

パラメータと変数

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

パラメータと局所変数の位置に関する情報は、最適化コード内で欠落していることがあります。dbx が値を発見できない場合、発見できないことが報告されます。値は一時的に消失する場合があるため、再びシングルステップおよび出力を実行してください。

SPARC ベースシステムおよび x86 ベースシステム向けの Oracle Solaris Studio 12.2 コンパイラは、パラメータおよびローカル変数の場所を特定するための情報を提供しています。GNU コンパイラの最近のバージョンも、この情報を提供しています。

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

インライン関数

SPARC プラットフォームで dbx を使用すると、インライン関数にブレークポイントを設定できます。呼び出し側で、インライン関数からの最初の命令の停止を制御します。インライン関数で、非インライン関数と同様に dbx 操作 (stepnextlist コマンドなど) を実行できます。

where コマンドを実行すると、呼び出しスタックがインライン関数とともに表示されます。また、インラインパラメータの場所情報がある場合は、パラメータも表示されます。

呼び出しスタックを上下に移動する up および down コマンドも、インライン関数でサポートされています。

呼び出し側からのローカル変数は、インラインフレームにはありません。

レジスタがある場合は、これらは呼び出し側のウィンドウから表示されます。

コンパイラがインライン化する関数には、C++ インライン関数、C99 インラインキーワードを持つ C 関数、およびパフォーマンスにメリットがあるとコンパイラによって判断されたその他の関数が含まれます。

マニュアル『パフォーマンスアナライザ』の第 8 章にあるセクション「関数のインライン化」および「並列化」には、最適化されたプログラムをデバッグするために役立つ情報が含まれています。

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

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

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

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

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

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

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