ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
Oracle Solaris Studio 12.3: パフォーマンスアナライザ Oracle Solaris Studio 12.3 Information Library (日本語) |
ハードウェアカウンタオーバーフローのプロファイルに関する制限事項
ハードウェアカウンタオーバーフローのプロファイルによる実行時のひずみと実行時間の拡大
Java プログラミング言語で書かれたアプリケーションの実行時のひずみと実行時間の拡大
-h counter_definition_1...[, counter_definition_n]
collect ユーティリティーによる動作中のプロセスからのデータの収集
collect ユーティリティーを使用して動作中のプロセスからデータを収集する
Oracle Solaris プラットフォーム上での dbx による動作中のプロセスからのデータの収集
プログラムのコンパイル時には、ほとんどのコンパイラオプションを使用してデータの収集および解析を行うことができますが、収集対象とパフォーマンスアナライザでの表示対象に影響するオプションがいくつかあります。プログラムのコンパイルとリンクを行う際に考慮すべき事柄について、このあとの各項で説明します。
注釈付きの「ソース」および「逆アセンブリ」の解析にソースコードを表示し、「行」解析にソース行を表示するには、-g コンパイラオプション (C++ でフロントエンドインライン化を有効にするには -g0) で対象のソースファイルをコンパイルし、デバッグシンボル情報を作成します。デバッグシンボル情報の形式は、-xdebugformat=(dwarf|stabs) によって、DWARF2 またはスタブに指定することができます。デフォルトのデバッグ形式は dwarf です。
データ領域プロファイルを許可するデバッグ情報を使ってコンパイルオブジェクトを準備する場合 (現在のところは SPARC プロセッサ専用)、 -xhwcprof および任意の最適化レベルを指定してコンパイルを行います。現在は、最適化を行わないと、この機能は使用できません。データオブジェクトの解析にプログラムデータオブジェクトを表示するには、-g (また、C++ の場合は -g0) も追加して、完全なシンボリック情報を取得します。
一部の SPARC プロセッサでは、正確なハードウェアカウンタのメモリー領域プロファイリングを行うのに、-xhwcprof および最適化を指定してコンパイルする必要はありません。詳細は、「データ領域プロファイリングとメモリー領域プロファイリング」を参照してください。
DWARF 形式のデバッグ用シンボルで構築された実行可能ファイルやライブラリには、構成要素である各オブジェクトファイルのデバッグシンボルのコピーが自動的に取り込まれます。スタブ形式のデバッグ用シンボルを使用して構築された実行可能ファイルとライブラリの場合、デバッグシンボルのリンク時に -xs オプションが指定され、各種のオブジェクトファイルおよび実行可能ファイル内にスタブシンボルが残されていれば、構成要素である各オブジェクトファイルのデバッグシンボルのコピーが取り込まれます。この情報の取り込みは、オブジェクトファイルを移動したり、削除したりする必要がある場合に特に有用です。すべてのデバッグ用シンボルが実行可能ファイルとライブラリ自体にあるので、実験とプログラム関連ファイルを別の場所に容易に移動できます。
プログラムをコンパイルするときに、-dn および -Bstatic コンパイラオプションを使用して動的リンクを無効にしないでください。完全に静的にリンクされたプログラムのデータを収集しようとしても、コレクタからエラーメッセージが返され、データは収集されません。このエラーが発生する原因は、コレクタを実行したときに、コレクタライブラリが動的に読み込まれるためです。
システムライブラリを静的リンクしないでください。システムライブラリを静的リンクしてしまうと、トレースデータを何も収集できなくなることがあります。また、コレクタライブラリ libcollector.so へもリンクしないでください。
通常、collect コマンドではターゲットのアドレス空間に含まれているすべての共有オブジェクトのデータが、初期ライブラリリストに含まれているものか、dlopen() によって明示的に読み込まれたものかにかかわらず、収集されます。ただし、特定の条件では一部の共有オブジェクトのプロファイリングが行われないことがあります。
遅延読み込みにより指定プログラムが呼び出された場合。この場合、起動時にはライブラリが読み込まれず、dlopen() の呼び出しによって明示的にも読み込まれないため、共有オブジェクトは実験に含まれず、共有されたオブジェクトからの PC はすべて <Unknown> 関数にマップされます。対策として、環境変数 LD_BIND_NOW を設定すると、起動時にライブラリが強制的に読み込まれます。
実行可能ファイルが -B オプションを指定して構築された場合。この場合、オブジェクトは特に dlopen()() の動的リンカーのエントリポイントへの呼び出しによって動的に読み込まれるため、libcollector 割り込みがバイパスされます。共有オブジェクト名は実験には含まれず、共有されたオブジェクトからの PC はすべて <Unknown>() 関数にマップされます。対策は、-B オプションを使用しないことです。
何らかのレベルの最適化を有効にしてプログラムをコンパイルすると、コンパイラにより実行順序が変更され、プログラム内の行の順序と実行順序が厳密に一致しなくなることがあります。この場合、パフォーマンスアナライザは、最適化されたコードについて収集された実験データを解析できますが、しばしば、逆アセンブリレベルでパフォーマンスアナライザが提供するデータを元のソースコード行に対応付けることが困難になります。また、コンパイラが末尾呼び出しの最適化を行う場合には、呼び出しシーケンスが予想とは異なっているように見えることがあります。詳細は、「末尾呼び出しの最適化」を参照してください。