dbx は、最適化されたコードに対する部分的なデバッグサポートを提供しています。サポートの範囲は、プログラムをコンパイルした方法によって大幅に異なります。
最適化されたコードを分析する場合は、次のことが可能です。
任意の関数の開始時に実行を停止する ( stop in function コマンド)
引数を評価、表示、または変更する
大域変数、局所変数、または静的変数を、評価、表示、または変更する
ある行から別の行までシングルステップ実行する (next または step コマンド)
プログラムが (–O および –g オプションを使用して) 最適化とデバッグを同時に有効にしてコンパイルされている場合、dbx は制限モードで動作します。
どのコンパイラが、どのような環境下でどの種類のシンボリック情報を発行するかについての詳細情報は、リリースごとに変更される可能性があります。
ソース行の情報は使用できますが、あるソース行のコードが最適化されたプログラムの複数の異なる場所に現れる可能性があるため、ソース行でプログラムをステップ実行すると、オプティマイザがコードをどのようにスケジュールしたかによって、現在の行がソースファイル内の別の場所に移動します。
末尾呼び出しを最適化すると、関数の最後の有効な操作が別の関数への呼び出しである場合、スタックフレームがなくなります。
OpenMP プログラムの場合、–xopenmp=noopt オプションを使用してコンパイルすると、コンパイラは最適化を適用しないように指示されます。ただし、オプティマイザは OpenMP ディレクティブを実装するために引き続きコードを処理するため、説明された問題のいくつかは –xopenmp=noopt でコンパイルされたプログラムで発生する可能性があります。
通常、パラメータ、局所変数、および大域変数のシンボリック情報は、最適化プログラムで利用できます。構造体、共用体、および C++ クラスの型情報と局所変数、大域変数、およびパラメータの型と名前を利用できるはずです。
パラメータと局所変数の位置に関する情報は、最適化コード内で欠落していることがあります。dbx が値を発見できない場合、発見できないことが報告されます。値は一時的に消失する場合があるため、再びシングルステップおよび出力を実行してください。
SPARC ベースのシステムおよび x86 ベースのシステム向けの Oracle Developer Studio 12.2 コンパイラやそれ以降の Oracle Developer Studio 更新は、パラメータおよび局所変数の場所を特定するための情報を提供しています。GNU コンパイラの最近のバージョンも、この情報を提供しています。
最後のレジスタからメモリーへのストアがまだ発生していない場合、値は正確でない可能性がありますが、大域変数は表示したり、値を割り当てたりできます。
dbx を使用すると、インライン関数にブレークポイントを設定できます。呼び出し側で、インライン関数からの最初の命令の停止を制御します。インライン関数では、非インライン関数で実行できるのと同じ dbx 操作 (step、next、list の各コマンドなど) を実行できます。
where コマンドを実行すると、呼び出しスタックがインライン関数とともに表示されます。また、インラインパラメータの場所情報がある場合は、パラメータも表示されます。
呼び出しスタックを上下に移動する up および down コマンドも、インライン関数でサポートされています。
呼び出し側からのローカル変数は、インラインフレームにはありません。
レジスタがある場合は、これらは呼び出し側のウィンドウから表示されます。
コンパイラがインライン化する関数には、C++ インライン関数、C99 インラインキーワードを持つ C 関数、およびパフォーマンスにメリットがあるとコンパイラによって判断されたその他の関数が含まれます。
Oracle Developer Studio 12.5: パフォーマンスアナライザには、最適化されたプログラムをデバッグするときに役立つ可能性のある情報が含まれています。
ほとんどのデバッグサポートでは -g を使用してプログラムをコンパイルする必要がありますが、dbx では引き続き、-g なしでコンパイルされたコードに対する次のレベルのサポートが提供されます。
バックトレース (dbx where コマンド)
関数の呼び出し (ただし、パラメータはチェックしない)
大域変数のチェック
ただし、dbx では、-g オプションでコンパイルされたコードを除いては、ソースコードを表示できません。これは、strip -x が適用されたコードについてもあてはまります。
完全なサポートを受けるには、共有ライブラリも -g オプションでコンパイルする必要があります。-g オプションを使用してコンパイルされていない共有ライブラリモジュールを使用してプログラムを作成した場合でも、そのプログラムをデバッグすることはできます。ただし、これらのライブラリモジュールに関する情報が生成されていないため、dbx の機能を完全に使用することはできません。
dbx は、完全にストリップされたプログラムをデバッグすることができます。これらのプログラムには、プログラムをデバッグするために使用できる情報がいくつか含まれますが、外部から識別できる関数しか使用できません。一部の実行時検査は、ストリップされたプログラムまたはロードオブジェクトに対して機能します。たとえば、メモリー使用状況検査とアクセス検査は、strip -x でストリップされたコードで機能しますが、strip でストリップされたコードでは機能しません。