(57)【要約】【課題】ＯＳ環境下で命令単位での細かいプロファイル情報を取得すること。仮想記憶機構を備えたＯＳ環境下でプロファイリング対象プログラム（共用ライブラリを含む）のプロファイル情報のみを取得すること。【解決手段】コンピュータシステムは、プロファイリング対象プログラム１、ＯＳ２およびプロセッサ３を備えている。プロファイリング対象のアプリケーションプログラム１１と、サンプリング情報を収集するプロファイル取得関数ライブラリ１２とを同一プロセスで起動する。プロセッサ３の内蔵タイマ１５から割り込みが発生するたびに、ＯＳ２に予め組み込まれたプロファイル取得ドライバ１３により、プログラムカウンタ１６の値やハードウェアカウンタ１７の値を収集する。仮想記憶システム上で複数のプロセスが実行される場合には、割り込みの発生時にプロファイリング対象プロセスが実行されているときにサンプリング情報を収集する。【選択図】図１
2010079508.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションのソースプログラムにプロファイル取得関数の呼び出し命令を追加したソースコードを生成する第１ステップと、
前記ソースコードにプロファイル取得関数ライブラリを結合して実行形式のプロファイリング対象プログラムを生成する第２ステップと、
ターゲットシステムのオペレーティングシステム環境下で前記プロファイリング対象プログラムを実行し、前記プロファイル取得関数の呼び出し命令の実行によって前記プロファイル取得関数ライブラリ経由でプロファイル取得ドライバを呼び出し、割り込みの発生に基づいて前記プロファイル取得ドライバにより前記プロファイリング対象プログラムの実行状況に関するサンプリング情報を収集する第３ステップと、
をコンピュータに実行させることを特徴とするプロファイリング方法。
【請求項２】
前記第３ステップの前に、前記ターゲットシステムに前記プロファイル取得ドライバを組み込むことを特徴とする請求項１に記載のプロファイリング方法。
【請求項３】
前記第３ステップでは、仮想記憶システム上で複数のプロセスが実行される場合、前記割り込みの発生時にプロファイリング対象プロセスが実行されているときに前記サンプリング情報を収集することを特徴とする請求項１または２に記載のプロファイリング方法。
【請求項４】
前記第３ステップでは、仮想記憶システム上で複数のプロセスが実行され、かつ共用ライブラリが実行される場合、前記割り込みの発生時にプロファイリング対象プロセスが実行されているときに共用ライブラリの実行状況に関する前記サンプリング情報を収集することを特徴とする請求項１または２に記載のプロファイリング方法。
【請求項５】
前記第３ステップでは、前記プロファイル取得関数により指定されたプロファイリング対象範囲で、前記ターゲットシステムのプロセッサの内蔵タイマに基づいて、前記オペレーティングシステムのシステムタイマの単位時間よりも短い時間で前記割り込みを発生し、前記割り込みによって前記サンプリング情報を収集することを特徴とする請求項１〜４のいずれか一つに記載のプロファイリング方法。
【請求項６】
プロファイル取得関数の呼び出し命令が埋め込まれ、かつプロファイル取得関数ライブラリが結合された実行形式のプロファイリング対象プログラムを、ターゲットシステムのオペレーティングシステム環境下で実行する第１ステップと、
前記プロファイル取得関数の呼び出し命令の実行によって前記プロファイル取得関数ライブラリ経由でプロファイル取得ドライバを呼び出す第２ステップと、
割り込みの発生に基づいて前記プロファイル取得ドライバを介して前記プロファイリング対象プログラムの実行状況に関するサンプリング情報を収集する第３ステップと、
をコンピュータに実行させることを特徴とするプロファイリングプログラム。
【請求項７】
前記第３ステップでは、仮想記憶システム上で複数のプロセスが実行される場合、前記割り込みの発生時にプロファイリング対象プロセスが実行されているときに前記サンプリング情報を収集することを特徴とする請求項６に記載のプロファイリングプログラム。
【請求項８】
前記第３ステップでは、仮想記憶システム上で複数のプロセスが実行され、かつ共用ライブラリが実行される場合、前記割り込みの発生時にプロファイリング対象プロセスが実行されているときに共用ライブラリの実行状況に関する前記サンプリング情報を収集することを特徴とする請求項６に記載のプロファイリングプログラム。
【請求項９】
前記第３ステップでは、前記プロファイル取得関数により指定されたプロファイリング対象範囲で、前記ターゲットシステムのプロセッサの内蔵タイマに基づいて、前記オペレーティングシステムのシステムタイマの単位時間よりも短い時間で前記割り込みを発生し、前記割り込みによって前記サンプリング情報を収集することを特徴とする請求項６〜８のいずれか一つに記載のプロファイリングプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、コンピュータシステムにおいてプログラムの実行状況に関するプロファイル情報を取得するプロファイリング方法およびプロファイリングプログラムに関する。
【背景技術】
【０００２】
コンピュータシステムにおいて、プロファイリング手法が用いられている。例えば、ターゲット範囲指定インタフェースが情報収集対象範囲の指定をアプリケーションプログラムから受け取ってフラグ管理テーブルに登録し、フラグ設定インタフェースがフラグ値をアプリケーションプログラムから受け取ってフラグ管理テーブルに設定し、割り込みハンドラが割り込み発生時の実行アドレスがフラグ管理テーブルに登録された情報収集対象範囲のいずれかに該当する場合には、実行アドレスとともにフラグ管理テーブルのその時点のフラグ値を割り込みハンドラ記録テーブルに記録するプロファイリング手法が知られている（例えば、特許文献１参照。）。
【０００３】
【特許文献１】特開２００７−２７２６９２号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
しかしながら、従来のプロファイリング手法では、次のような問題点がある。オペレーティングシステム（以下、ＯＳとする。ＯＳ：Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）環境下では、プロファイリング対象プログラムと、プロファイリング対象プログラムをプロファイルするためのプログラムとを別のプロセスとして起動し、プロセス監視用のシステムコールによりシステム割り込みを発生させてプログラムカウンタの値を採取する。その際、システム割り込みの間隔は、システムタイマの最小割り込み時間となる。この最小割り込み時間は、ＵＮＩＸ（Ｔｈｅ  Ｏｐｅｎ  Ｇｒｏｕｐの登録商標）やＬｉｎｕｘ（Ｌｉｎｕｓ  Ｔｏｒｖａｌｄｓ氏の登録商標）では１０ｍｓである。システムタイマでは、システム処理のための時間がかかる。そのため、システムタイマの最小割り込み時間でプロファイリングをしても、関数単位でのプロファイル情報を得ることはできるが、命令単位での細かいプロファイル情報を得ることができない。
【０００５】
また、仮想記憶機構を備えたＯＳ環境下で複数のプロセスが同時に実行されている場合、プログラムカウンタの値を採取する際に、プロファイリング対象プロセスとそうでない他のプロセスとの区別をすることができない。そのため、取得されたプロファイル情報には、プロファイリング対象プログラムのプロファイル情報だけでなく、プロファイリング対象でないプログラムのプロファイル情報も含まれてしまう。つまり、プロファイリング対象プログラムのプロファイル情報のみを取得することはできない。このことは、複数のプロセス間で共通に実行される共用ライブラリについても同様であり、プロファイリング対象プロセスで実行される共用ライブラリのプロファイル情報のみを取得することはできない。
【０００６】
ＯＳ環境下で命令単位での細かいプロファイル情報を取得することができるプロファイリング方法およびプロファイリングプログラムを提供することを目的とする。また、仮想記憶機構を備えたＯＳ環境下でプロファイリング対象プログラム（共用ライブラリを含む）のプロファイル情報のみを取得することができるプロファイリング方法およびプロファイリングプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
このプロファイリング方法およびプロファイリングプログラムは、アプリケーションのソースプログラムにプロファイル取得関数の呼び出し命令を追加したソースコードを生成し、そのソースコードにプロファイル取得関数ライブラリを結合して実行形式のプロファイリング対象プログラムを生成する。このプロファイリング対象プログラムを、ターゲットシステムのＯＳ環境下で実行する。その実行中に、プロファイル取得関数の呼び出し命令からプロファイル取得関数ライブラリ経由で、予めターゲットシステムに組み込んでおいたプロファイル取得ドライバを呼び出す。このプロファイル取得ドライバにより、ターゲットシステムのプロセッサの内蔵タイマに基づいて、ＯＳのシステムタイマの単位時間よりも短い時間で割り込みを発生させて、プロファイリング対象プログラムの実行状況に関するサンプリング情報を収集する。仮想記憶システム上で複数のプロセスが実行される場合には、割り込みの発生時にプロファイリング対象プロセスが実行されているときにのみ、プロファイリング対象プログラムの実行状況に関するサンプリング情報、またはプロファイリング対象プログラムが利用している共用ライブラリの実行状況に関するサンプリング情報を収集する。
【０００８】
このプロファイリング方法およびプロファイリングプログラムによれば、アプリケーションプログラムとこれに対してサンプリング情報の収集処理を実行するプロファイル用プログラムとが同一プロセスで起動されるので、ＯＳの最小割り込み時間よりも短い間隔でサンプリング情報が収集される。また、プロファイリング対象プロセスが実行されているときにのみ、サンプリング情報が収集される。
【発明の効果】
【０００９】
このプロファイリング方法およびプロファイリングプログラムによれば、ＯＳ環境下で命令単位での細かいプロファイル情報を取得することができる。また、仮想記憶機構を備えたＯＳ環境下でプロファイリング対象プログラム（共用ライブラリを含む）のプロファイル情報のみを取得することができる。
【発明を実施するための最良の形態】
【００１０】
以下に添付図面を参照して、このプロファイリング方法およびプロファイリングプログラムの好適な実施の形態を詳細に説明する。以下の例では、ＯＳとしてＬｉｎｕｘを使用した場合について説明するが、これに限定されるものではなく、プロファイリング方法およびプロファイリングプログラムは、Ｗｉｎｄｏｗｓ（米国Ｍｉｃｒｏｓｏｆｔ社の登録商標）やその他のリアルタイムＯＳにも適用することができる。
【００１１】
（概略）
図１は、実施の形態にかかるプロファイリング方法を適用したコンピュータシステムの構成を示す説明図である。図１に示すように、このコンピュータシステムは、プロファイリング対象プログラム１、ＯＳ２およびプロセッサ３を備えている。ＯＳ環境下で、プロファイリング対象のアプリケーションプログラムと、これに対してサンプリング情報を収集するプロファイル用のプログラムとを同一プロセスで起動する。予め、ＯＳ２にプロファイル取得ドライバ１３を組み込んでおき、プロセッサ３の内蔵タイマ１５から割り込みが発生するたびに、プロファイル取得ドライバ１３によりプロセッサ３のプログラムカウンタ１６の値やハードウェアカウンタ１７の値を収集する。仮想記憶システム上で複数のプロセスが実行される場合には、割り込み発生時に実行しているプロセスがプロファイリング対象プロセスであるときにのみサンプリング情報を収集する。
【００１２】
（システムの構成）
プロファイリング対象プログラム１は、実行形式のプログラムであり、プロファイリング対象のアプリケーションプログラム１１にプロファイル取得関数ライブラリ１２が結合されている。アプリケーションプログラム１１には、プロファイル取得関数の呼び出し命令が埋め込まれている。プロファイル取得関数の呼び出し命令は、例えばプロファイルの測定開始を指示する「Ｃａｌｌ  ｓｔａｒｔ（）」や測定終了を指示する「Ｃａｌｌ  ｓｔｏｐ（）」などである。プロファイル取得関数ライブラリ１２は、プロファイル情報の取得に必要な機能を提供する種々のプロファイル取得関数をまとめたものである。プロファイル取得関数は、プロファイルを取得するための命令群であり、例えばプロファイルの測定を開始する「ｓｔａｒｔ」や測定を終了する「ｓｔｏｐ」などである。プロファイル取得関数は、対応するプロファイル取得関数の呼び出し命令により呼び出される。
【００１３】
ＯＳ２には、プロファイル取得ドライバ１３が組み込まれている。また、ＯＳ２には、サンプリング情報を格納するメモリ領域１４が設けられている。プロファイル取得ドライバ１３は、「ｓｔａｒｔ」と「ｓｔｏｐ」のプロファイル取得関数により指定されたプロファイリング対象範囲で、プロセッサ３の内蔵タイマ１５から割り込みが発生されるたびに、割り込みハンドラを呼び出し、プロセッサ３のプログラムカウンタ１６の値やイベントカウンタなどのハードウェアカウンタ１７の値をサンプリング情報としてメモリ領域１４に格納する。その際、プロファイル取得ドライバ１３は、仮想記憶システム上で実行されている複数のプロセスのうち、プロファイリング対象プロセスのプログラムまたはプロファイリング対象プロセスで利用されている共用ライブラリに対して、サンプリング情報を収集する。
【００１４】
プロセッサ３は、内蔵タイマ１５、プログラムカウンタ１６およびハードウェアカウンタ１７を備えている。ハードウェアカウンタ１７は、プロセッサ３内部のイベントの発生回数や、プロセッサ３が外部とやり取りする際のイベントの発生回数をカウントする。イベントとしては、例えば、実行サイクル数、キャッシュミス数、ＴＬＢ（Ｔｒａｎｓｌａｔｉｏｎ  Ｌｏｏｋ−ａｓｉｄｅ  Ｂｕｆｆｅｒ）ミス数、実行命令数、実行命令並列度、分岐命令実行数、特定命令の実行数、パイプラインストール要因、レジスタ干渉サイクル数またはバスアクセス情報などである。
【００１５】
また、コンピュータシステムは、解析ツール４を備えている。解析ツール４は、プロファイル情報ファイル１８および実行ファイル１９に基づいて、プロファイル情報の解析を行い、その結果２０を出力する。プロファイル情報ファイル１８は、前記メモリ領域１４に格納されたサンプリング情報に基づいて作成される。実行ファイル１９は、プロファイリング対象プログラム１と同じものである。
【００１６】
（プロファイリング方法の処理手順）
図２は、実施の形態にかかるプロファイリング方法の処理手順を示す説明図である。図２に示すように、プロファイリング対象のアプリケーションプログラムに対してプロファイリング処理を行うにあたって、まず、アプリケーションのソースプログラムにプロファイル取得関数の呼び出し命令を追加し、プロファイル取得関数の呼び出し命令が埋め込まれたソースコードを作成する（ステップＳ１）。次いで、作成されたソースコードを翻訳してオブジェクトプログラムを作成する（ステップＳ２）。次いで、作成されたオブジェクトプログラムにプロファイル取得関数ライブラリを結合（リンク）して、プロファイリング対象プログラムを作成する（ステップＳ３）。一方、プロファイル取得ドライバを作成し、ターゲットシステムのＯＳにプロファイル取得ドライバを組み込む（ステップＳ４）。プロファイル取得ドライバを、ターゲットシステムを作成する際にターゲットシステムに組み込んでもよいし、プロファイリング処理を実行する際に例えば「ｉｎｓｍｏｄ」コマンドを使用してターゲットシステムに組み込んでもよい。
【００１７】
次いで、ターゲットシステムで前記プロファイリング対象プログラムを実行する（ステップＳ５）。その実行中にプロファイリング対象範囲の開始点に達すると、プロファイル取得関数ライブラリからプロファイルの測定を開始する関数を呼び出し、その関数によってプロファイル取得ドライバを呼び出す（ステップＳ６）。プロファイル取得ドライバは、プロセッサの内蔵タイマによる割り込みが発生するたびに、割り込みハンドラを呼び出し、プロセッサのプログラムカウンタの値やハードウェアカウンタの値をサンプリング情報として収集する（ステップＳ７）。
【００１８】
収集されたサンプリング情報は、ＯＳのメモリ領域に格納される。メモリ領域には、プロファイリング対象範囲のコードサイズに対応したサンプリング情報を格納可能な領域が予め確保されている。プロファイリング対象範囲のコードサイズは、前記ステップＳ３での結合時に、セクション情報を定義するリンカスクリプトで定義されているシンボル名アドレスをプロファイルツールから参照し、プログラム終了シンボル（例えば「＿ｆｉｎｉｔ」）から開始シンボル（例えば「＿ｓｔａｒｔ」）を減算することによって、求められる。従って、プロファイルツールのユーザは、プログラムコードサイズを明示的に指定しなくてよい。ここで、サンプリング情報を格納するファイルやサンプリングの割り込み指定方法を、例えば「ＦＪＳＡＭＰ」などの環境変数で指定してもよいし、プロファイル取得関数のパラメータで指定してもよい。
【００１９】
前記ステップＳ７において、仮想記憶システム上で複数のプロセスが実行されている場合、実行中の全てのプロセスに対して割り込みが発生する。その場合、プロファイル取得ドライバは、図３に示すような処理を行い、プロファイリング対象プロセスのみのプログラムカウンタの値やハードウェアカウンタの値を収集する。
【００２０】
図３は、プロファイリング対象プロセスのみのサンプリング情報を収集する手順を示す説明図である。図３に示すように、プロファイリング対象範囲の実行中に割り込みが発生すると、プロファイル取得ドライバは、プログラムカウンタの値を取得する（ステップＳ１１）。このときのプログラムカウンタの値を、サンプリングアドレスとする。そして、プロファイル取得ドライバは、割り込み発生時に実行していたプロセスの識別子であるプロセスｉｄとプロファイリング対象プロセスのプロセスｉｄとを比較し、実行中のプロセスがプロファイリング対象プロセスであるか否かを判断する（ステップＳ１２）。プロセスｉｄは、プロファイル取得関数によって取得され、プロファイル取得ドライバに渡される。プロセスｉｄが等しければ、実行中のプロセスは、プロファイリング対象プロセスであり、プロセスｉｄが異なっていれば、プロファイリング対象プロセスでない。
【００２１】
実行中のプロセスがプロファイリング対象プロセスである場合（ステップＳ１２：Ｙｅｓ）、メモリ領域の、前記サンプリングアドレスに対応する割り込み発生回数に１を足して、割り込み発生回数を更新する。あるサンプリングアドレスでの最初の割り込みである場合には、該当するサンプリングアドレスがメモリ領域にないので、メモリ領域に、そのサンプリングアドレスとそのサンプリングアドレスでの割り込み発生回数とを対応付けて格納する領域を設定してから、割り込み発生回数を１にする（ステップＳ１３）。そして、呼び出し元に復帰する。一方、実行中のプロセスがプロファイリング対象プロセスでない場合（ステップＳ１２：Ｎｏ）、割り込み発生回数を更新しないで呼び出し元に復帰する。仮想記憶システム上の複数のプロセスで共用ライブラリを実行している場合も同様であり、プロセスｉｄが一致する場合にのみ共用ライブラリのサンプリング情報を取得する。
【００２２】
図４は、メモリ領域のデータ構成を示す説明図である。図４に示すように、メモリ領域１４には、割り込みが発生したときのサンプリングアドレス（割り込みアドレス）と、そのサンプリングアドレスで割り込みが発生した回数（割り込み回数）とが、命令ごとに対応付けられて格納される。
【００２３】
図２に戻り、前記プロファイリング対象プログラムの実行中にプロファイリング対象範囲の終了点に達すると、プロファイル取得関数ライブラリからプロファイルの測定を終了する関数を呼び出す。その関数は、メモリ領域に格納されているサンプリング情報を出力し、プロファイル情報ファイルを作成する（ステップＳ８）。その際、プロファイル取得関数は、図５に示すように、サンプリングアドレスがどのモジュール（共用ライブラリ含む）に属するアドレスであるかを判断する。そして、対応するモジュール先頭アドレスおよびモジュール先頭からの相対オフセットアドレスを求め、それらをモジュール単位でプロファイル情報ファイルに格納する。
【００２４】
図５は、サンプリングアドレスと対応するモジュールとの関係を示す説明図である。図５において、サンプリングアドレスに対応するモジュールのモジュール先頭アドレスは、システムロードマップ情報２１から得られる。システムロードマップ情報２１は、ロードモジュール管理情報にあり、システムがロードモジュール単位にメモリマップを行うときに作成される。図５に示す例では、実行形式ファイル（「ａ．ｏｕｔ」）がシステムにロードされると、システムは、ロードしたモジュールのメモリ２２内の配置アドレスを管理する。そして、この実行形式ファイル（「ａ．ｏｕｔ」）の実行中に、プログラムカウンタの値がｐｃ１であるときに割り込みが発生した場合、プロファイル情報ファイル１８には、モジュール名「ａ．ｏｕｔ」、メモリ２２上のロードアドレス（モジュール先頭アドレスｍａｐ）、モジュール先頭からの相対アドレスｍｐｃ１（＝ｐｃ１−ｍａｐ）および割り込み発生回数が格納される。共用ライブラリの場合も同様である。
【００２５】
また、同一のプロファイリング対象プログラムに対してプロファイリング処理を複数回、実行した場合、各回で取得した個々のプロファイル情報ファイルの、同一割り込みアドレスのサンプリング結果同士を加算して、複数のプロファイル情報ファイルを結合した新たなプロファイル情報ファイルを作成することができるようになっていてもよい。その場合には、例えば、結合用のコマンド（例えば、「ｆｒｖｐｒｏｆ−ｍｅｒｇｅ」とする）を用意しておけばよい。このコマンドを用いて、例えばプロファイル情報ファイルＡとプロファイル情報ファイルＢとを結合してプロファイル情報ファイルＣを作成する場合には、「Ｆｒｖｐｒｏｆ−ｍｅｒｇｅ  ａ  ｂ  −ｏ  ｃ」のように記述すればよい。
【００２６】
図２に戻り、ステップＳ８でプロファイル情報ファイルが作成されると、解析ツールは、図６に示すように、サンプリングアドレスがどのモジュール（共用ライブラリ含む）のどの関数に属するアドレスであるかを判断し、実行形式ファイルのシンボル情報と照らし合わせることによって、解析結果として、対応するモジュール名、関数名およびサンプリング情報を、高コスト関数、高コスト処理または高コスト命令ごとに表示する（ステップＳ９）。解析ツールは、プロファイル情報ファイルに格納されているサンプリングアドレスと関数との対応付けを、専用コマンド（例えば、「ｆｒｖｐｒｏｆ」コマンドと称する）によって行う。「ｆｒｖｐｒｏｆ」コマンドでは、コストを算出する対象であるロードモジュール名を明示的に指定できるようになっている。
【００２７】
図６は、解析ツールによる解析手順を示す説明図である。また、図７は、解析ツールによる解析処理を示す説明図である。図６および図７に示すように、解析処理が開始されると、解析ツール４は、例えばシンボル表示コマンド（「ｎｍ」コマンド）を内部的に起動するか、またはロードモジュールのシンボル参照用の関数（ＵＮＩＸでは、ｅｌｆアクセスライブラリ）を使用して、モジュール内のシンボル情報（例えば、関数Ｆｕｎｃ１に対応するアドレスα）を取得する（ステップＳ２１）。次いで、プロファイル情報ファイル１８からモジュール内相対アドレス（例えば、ｍｐｃ１）とそれに対応する割り込み回数を取得する（ステップＳ２２）。次いで、モジュール内相対アドレス（例えば、ｍｐｃ１）とモジュール内のシンボル情報（例えば、関数Ｆｕｎｃ１に対応するアドレスα）とを照合し、対応する関数内での割り込み発生時のオフセットアドレス（プログラム位置）を求める。そして、プログラム位置とそれに対応する割り込み回数を２次元的または３次元的に表示し（ステップＳ２３）、呼び出し元に復帰する。
【００２８】
解析ツール４は、関数ごとのコストや関数内の命令ごとの実行コストを、コスト順や定義順などの任意の順序で、コンピュータシステムのディスプレイに表示したり、プリンタにより印刷して出力することができる。以下に、解析結果の出力例を示すが、解析結果の出力形態はこれらの例に限られるものではない。
【００２９】
図８〜図１０は、解析結果をテキスト形式で２次元的に表示した出力例を示す説明図である。図８に示す解析結果２３は、共通ロードモジュール（「ｌｉｂ＿ｓｕｂ．ｓｏ」）の関数ごとのサンプリングカウント（割り込み回数）を、例えば降順で表示した例である。図８に示す例では、関数「ＦｕｎｃＳ」が全体のサンプリングカウントの１０％を占めており、最も実行コストが高いことがわかる。図９に示す解析結果２４は、プログラム全体でのロードモジュールごとのサンプリングカウント（割り込み回数）を表示した例である。図９に示す例では、「ｌｉｂ＿ｓｕｂ．ｓｏ」モジュールの実行コストがプログラム全体の９０．３％を占めていることがわかる。図１０に示す解析結果２５は、指定した関数内での命令レベルの実行コストを表示した例である。図１０に示す例では、関数「ＦｕｎｃＴ」内のアドレス２Ｃ命令の実行コストが関数全体の６９．５％を占めることがわかる。なお、テキスト形式での出力に限らず、ＧＵＩ（Ｇｒａｐｈｉｃａｌ  Ｕｓｅｒ  Ｉｎｔｅｒｆａｃｅ）を使用し、操作性を改善した手法で解析結果を出力するようにしてもよい。
【００３０】
図１１は、解析結果をＧＵＩで２次元的に表示した出力例を示す説明図である。図１１に示す解析結果２６は、ＧＵＩを使用して、図８に示す解析結果２３と同様に、関数ごとのサンプリングカウント（割り込み回数）を、例えば降順で表示した例である。表示されたいずれかの関数を、例えばマウスのダブルクリック等の操作により選択すると、解析ツールは、その選択された関数内の命令について、さらに詳細な解析結果２７を表示する。図１１に示す解析結果２７は、選択された関数内の命令ごとに実行コストを表示した例である。この解析結果２７において、「関数内実行頻度グラフ」とある領域の横軸は関数内オフセットであり、縦軸はサンプリングカウント（割り込み回数）である。例えば、「関数内実行頻度グラフ」を見れば、黒帯線が表示されたアドレス近辺でアクセスコストが高いことがわかる。解析結果２７に表示されたいずれかの命令位置を、例えばマウスのダブルクリック等の操作により照合すると、例えば、対応するＣソースやアセンブラソースを処理するためのデバッガやエディタやツール等が起動する。これにより、ボトルネック箇所を特定することができるので、アプリケーションプログラムのチューニングを施すことが可能となる。また、上述した構成のターゲットシステムに上述したプロファイリング方法を適用して、データアクセス回数やデータ定義位置などのデータアクセスコストの情報を取得することができる。
【００３１】
図１２は、データアクセスのサンプリング情報を収集する手順を示す説明図である。図１２に示すように、プロファイリング対象範囲の実行中に割り込みが発生すると、プロファイル取得ドライバは、以下の処理を行う。まず、プログラムカウンタの値（サンプリングアドレス）を取得する（ステップＳ３１）。次いで、プロファイル取得ドライバは、サンプリングアドレスに対応する命令を読み込み、その命令を解析する（ステップＳ３２）。その命令がロード命令またはストア命令であるか否かを判断する（ステップＳ３３）。ロード命令またはストア命令である場合（ステップＳ３３：Ｙｅｓ）、その命令を逆アセンブルし、データの参照先またはデータの格納先に関する情報として、データの参照先またはデータの格納先を示すレジスタ番号と即値を取得する（ステップＳ３４）。次いで、レジスタ番号に格納されているレジスタ値と、ＯＳに格納されている割り込み発生時のレジスタ値とを参照して、データの参照先またはデータの格納先のメモリアドレスを求める。サンプリング情報が格納されるメモリ領域に、プロファイリング対象のデータ域相対オフセット（データアドレス）と、それに対応する割り込み回数の累積値を登録する（ステップＳ３５）。そして、呼び出し元に復帰する。一方、ロード命令またはストア命令でない場合（ステップＳ３３：Ｎｏ）、そのまま呼び出し元に復帰する。
【００３２】
図１３は、メモリ領域に格納されたデータアクセスのサンプリング情報のデータ構成を示す説明図である。図１３に示すように、メモリ領域１４には、割り込みが発生したときのデータアドレスと、そのデータアドレスで割り込みが発生した回数（割り込み回数）とが対応付けられて格納される。データアクセスのサンプリング情報に基づいてプロファイル情報ファイルが作成される。解析ツールは、そのプロファイル情報ファイルに基づいて、図６に示す解析処理と同様の処理を行い、解析結果を出力する。図１４に、データアクセスのサンプリング情報を含めた解析結果の一例を示す。
【００３３】
図１４は、解析結果をグラフで３次元的に表示した出力例を示す説明図である。図１４に示す解析結果２８は、プログラムの実行コストを示す割り込みアドレス回数、関数単位や処理単位や命令単位でのプログラム位置、およびデータ定義位置やアクセスコスト等の割り込みデータアクセスに関する情報を３次元的に表示した例である。図１４に示す例より、どのプログラム位置で、またどのデータアクセス位置で実行コストがかかっているか、ということがわかるので、性能向上や省電力を図るためのチューニングを適用することができる。
【００３４】
以上説明したように、本実施の形態によれば、ＯＳの最小割り込み時間よりも短い間隔でサンプリング情報を収集することができるので、命令単位での細かいプロファイル情報を取得することができる。従って、命令単位でプログラムチューニングを行うことができるという効果を奏する。また、仮想記憶機構を備えたＯＳ環境下で、プロファイリング対象プロセスが実行されているときにのみ、サンプリング情報を収集することができるので、プロファイリング対象プログラム（共用ライブラリを含む）のプロファイル情報のみを取得することができる。さらに、共用ライブラリに着目したプロファイル情報を取得することができるので、共用ライブラリに着目したプログラムチューニングを行うことができるという効果を奏する。また、ＯＳの最小割り込み時間よりも短い間隔で、ハードウェアイベントに着目したプロファイル情報を取得することができる。また、ＯＳの最小割り込み時間よりも短い間隔で、データアクセスのプロファイル情報を取得することができるので、例えば、高コスト変数のみを抽出して、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）に内蔵されたＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）などの高速メモリ領域に優先的にデータ配置するなど、メモリ階層を意識した配置を適用することが可能となる。
【００３５】
コンピュータシステムの性能向上や省電力化を図るため、得られたプロファイル情報に基づいて、次のようなチューニングを行うことができる。例えば、あるセクションをＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）からＲＡＭへ配置することができる。データ域やスタック域やヒープ域などの特定の作業域をＣＰＵ内蔵ＲＡＭなどの高速域メモリ領域に配置することができる。特定の作業域をＳＤＲＡＭ（Ｓｙｎｃｈｒｏｎｏｕｓ  Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）の別バンクへ配置することができる。特定の変数をレジスタ割り当てへ配置することができる。高コスト変数をＣＰＵに常駐させてキャッシュロックすることができる。
【００３６】
なお、ハードウェアカウンタの任意のイベント発生時の状態をトリガとして、サンプリング情報を収集するようにしてもよい。例えば、ハードウェアカウンタのデータキャッシュミス発生イベントに着目すれば、キャッシュミスの発生した命令で割り込みが発生するので、キャッシュミスの命令を解析してキャッシュミスのアクセス先を解析することができる。その際、キャッシュミスが発生するたびに割り込みを発生させてサンプリング情報を収集してもよいし、キャッシュミスの発生回数が所定回数に達するたびに割り込みを発生させてサンプリング情報を収集するようにしてもよい。
【００３７】
また、本実施の形態で説明したプロファイリング方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。このプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。またこのプログラムは、インターネット等のネットワークを介して配布することが可能な伝送媒体であってもよい。
【００３８】
上述した実施の形態に関し、さらに以下の付記を開示する。
【００３９】
（付記１）アプリケーションのソースプログラムにプロファイル取得関数の呼び出し命令を追加したソースコードを生成する第１ステップと、前記ソースコードにプロファイル取得関数ライブラリを結合して実行形式のプロファイリング対象プログラムを生成する第２ステップと、ターゲットシステムのオペレーティングシステム環境下で前記プロファイリング対象プログラムを実行し、前記プロファイル取得関数の呼び出し命令の実行によって前記プロファイル取得関数ライブラリ経由でプロファイル取得ドライバを呼び出し、割り込みの発生に基づいて前記プロファイル取得ドライバにより前記プロファイリング対象プログラムの実行状況に関するサンプリング情報を収集する第３ステップと、をコンピュータに実行させることを特徴とするプロファイリング方法。
【００４０】
（付記２）前記第３ステップの前に、前記ターゲットシステムに前記プロファイル取得ドライバを組み込むことを特徴とする付記１に記載のプロファイリング方法。
【００４１】
（付記３）前記第３ステップでは、仮想記憶システム上で複数のプロセスが実行される場合、前記割り込みの発生時にプロファイリング対象プロセスが実行されているときに前記サンプリング情報を収集することを特徴とする付記１または２に記載のプロファイリング方法。
【００４２】
（付記４）前記第３ステップでは、仮想記憶システム上で複数のプロセスが実行され、かつ共用ライブラリが実行される場合、前記割り込みの発生時にプロファイリング対象プロセスが実行されているときに共用ライブラリの実行状況に関する前記サンプリング情報を収集することを特徴とする付記１または２に記載のプロファイリング方法。
【００４３】
（付記５）前記第３ステップでは、前記プロファイル取得関数により指定されたプロファイリング対象範囲で、前記ターゲットシステムのプロセッサの内蔵タイマに基づいて、前記オペレーティングシステムのシステムタイマの単位時間よりも短い時間で前記割り込みを発生し、前記割り込みによって前記サンプリング情報を収集することを特徴とする付記１〜４のいずれか一つに記載のプロファイリング方法。
【００４４】
（付記６）前記第３ステップでは、前記プロファイル取得関数により指定されたプロファイリング対象範囲で、前記ターゲットシステムのプロセッサのハードウェアカウンタに基づいて前記割り込みを発生し、前記割り込みによって前記サンプリング情報を収集することを特徴とする付記１〜４のいずれか一つに記載のプロファイリング方法。
【００４５】
（付記７）収集された前記サンプリング情報およびハードウェアイベント情報を、命令ごとに対応付けた領域に実行回数として設定することを特徴とする付記１〜６のいずれか一つに記載のプロファイリング方法。
【００４６】
（付記８）収集された前記サンプリング情報およびデータアクセスに関する情報を、命令ごとに対応付けた領域に実行回数として設定することを特徴とする付記１〜６のいずれか一つに記載のプロファイリング方法。
【００４７】
（付記９）前記サンプリング情報として収集された割り込みアドレス、前記割り込みアドレスの割り込み発生回数、およびオペレーティングシステム情報から収集したモジュールのロードアドレス情報と、前記プロファイリング対象プログラムまたは共用ライブラリのシンボル情報とを照合することを特徴とする付記１〜８のいずれか一つに記載のプロファイリング方法。
【００４８】
（付記１０）前記サンプリング情報として収集された割り込みアドレス、ハードウェアイベント発生回数、およびオペレーティングシステム情報から収集したモジュールのロードアドレス情報と、前記プロファイリング対象プログラムまたは共用ライブラリのシンボル情報とを照合することを特徴とする付記１〜８のいずれか一つに記載のプロファイリング方法。
【００４９】
（付記１１）前記サンプリング情報として収集された割り込みアドレス、データアクセスに関する情報、およびオペレーティングシステム情報から収集したモジュールのロードアドレス情報と、前記プロファイリング対象プログラムまたは共用ライブラリのシンボル情報とを照合することを特徴とする付記１〜８のいずれか一つに記載のプロファイリング方法。
【００５０】
（付記１２）前記サンプリング情報、ハードウェアイベント情報およびデータアクセスに関する情報をマージすることを特徴とする付記１〜１１のいずれか一つに記載のプロファイリング方法。
【００５１】
（付記１３）プロファイル取得関数の呼び出し命令が埋め込まれ、かつプロファイル取得関数ライブラリが結合された実行形式のプロファイリング対象プログラムを、ターゲットシステムのオペレーティングシステム環境下で実行する第１ステップと、前記プロファイル取得関数の呼び出し命令の実行によって前記プロファイル取得関数ライブラリ経由でプロファイル取得ドライバを呼び出す第２ステップと、割り込みの発生に基づいて前記プロファイル取得ドライバを介して前記プロファイリング対象プログラムの実行状況に関するサンプリング情報を収集する第３ステップと、をコンピュータに実行させることを特徴とするプロファイリングプログラム。
【００５２】
（付記１４）前記第３ステップでは、仮想記憶システム上で複数のプロセスが実行される場合、前記割り込みの発生時にプロファイリング対象プロセスが実行されているときに前記サンプリング情報を収集することを特徴とする付記１３に記載のプロファイリングプログラム。
【００５３】
（付記１５）前記第３ステップでは、仮想記憶システム上で複数のプロセスが実行され、かつ共用ライブラリが実行される場合、前記割り込みの発生時にプロファイリング対象プロセスが実行されているときに共用ライブラリの実行状況に関する前記サンプリング情報を収集することを特徴とする付記１３に記載のプロファイリングプログラム。
【００５４】
（付記１６）前記第３ステップでは、前記プロファイル取得関数により指定されたプロファイリング対象範囲で、前記ターゲットシステムのプロセッサの内蔵タイマに基づいて、前記オペレーティングシステムのシステムタイマの単位時間よりも短い時間で前記割り込みを発生し、前記割り込みによって前記サンプリング情報を収集することを特徴とする付記１３〜１５のいずれか一つに記載のプロファイリングプログラム。
【００５５】
（付記１７）前記第３ステップでは、前記プロファイル取得関数により指定されたプロファイリング対象範囲で、前記ターゲットシステムのプロセッサのハードウェアカウンタに基づいて前記割り込みを発生し、前記割り込みによって前記サンプリング情報を収集することを特徴とする付記１３〜１５のいずれか一つに記載のプロファイリングプログラム。
【図面の簡単な説明】
【００５６】
【図１】実施の形態にかかるプロファイリング方法を適用したコンピュータシステムの構成を示す説明図である。
【図２】実施の形態にかかるプロファイリング方法の処理手順を示す説明図である。
【図３】プロファイリング対象プロセスのみのサンプリング情報を収集する手順を示す説明図である。
【図４】メモリ領域に格納されたサンプリング情報のデータ構成を示す説明図である。
【図５】サンプリングアドレスと対応するモジュールとの関係を示す説明図である。
【図６】解析ツールによる解析手順を示す説明図である。
【図７】解析ツールによる処理を示す説明図である。
【図８】解析結果をテキスト形式で２次元的に表示した出力例を示す説明図である。
【図９】解析結果をテキスト形式で２次元的に表示した別の出力例を示す説明図である。
【図１０】解析結果をテキスト形式で２次元的に表示したさらに別の出力例を示す説明図である。
【図１１】解析結果をＧＵＩで２次元的に表示した出力例を示す説明図である。
【図１２】データアクセスのサンプリング情報を収集する手順を示す説明図である。
【図１３】メモリ領域に格納されたデータアクセスのサンプリング情報のデータ構成を示す説明図である。
【図１４】解析結果をグラフで３次元的に表示した出力例を示す説明図である。
【符号の説明】
【００５７】
１  プロファイリング対象プログラム
２  ＯＳ
３  プロセッサ
１２  プロファイル取得関数ライブラリ
１３  プロファイル取得ドライバ
１５  内蔵タイマ
１７  ハードウェアカウンタ
【図１】
2010079508.tif 000003
【図２】
2010079508.tif 000004
【図３】
2010079508.tif 000005
【図４】
2010079508.tif 000006
【図５】
2010079508.tif 000007
【図６】
2010079508.tif 000008
【図７】
2010079508.tif 000009
【図８】
2010079508.tif 000010
【図９】
2010079508.tif 000011
【図１０】
2010079508.tif 000012
【図１１】
2010079508.tif 000013
【図１２】
2010079508.tif 000014
【図１３】
2010079508.tif 000015
【図１４】
2010079508.tif 000016