(57)【要約】【課題】第１の関数と対に実行されている可能性が高い関数を特定可能にすること。【解決手段】情報処理装置１００は、プログラムＰ内の第１の関数の指定を受け付ける。情報処理装置１００は、実行情報１１０に基づいて、指定された第１の関数と同じ呼び出しの深さの他の関数を抽出する。実行情報１１０は、プログラムＰの実行時に呼び出される各関数について、プログラムＰの実行開始点（エントリーポイント）となる関数からの呼び出しの深さを示す情報である。情報処理装置１００は、抽出した他の関数の情報を出力する。【選択図】図１
2017162026.tif 000002
【特許請求の範囲】
【請求項１】
プログラム内の第１の関数の指定を受け付け、
前記プログラムの実行時に呼び出される各関数について、前記プログラムの実行開始点となる関数からの呼び出しの深さを示す実行情報に基づいて、指定された前記第１の関数と同じ呼び出しの深さの他の関数を抽出し、
抽出した前記他の関数の情報を出力する、
制御部を有することを特徴とする情報処理装置。
【請求項２】
前記制御部は、
前記第１の関数が複数の異なる深さで呼び出される関数である場合には、前記第１の関数の最小の呼び出しの深さと同じ呼び出しの深さの他の関数を抽出する、ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記制御部は、
前記プログラムを実行中の所定のタイミングで、スタックエリアの情報に基づいて、プログラムカウンタの情報から特定される現在の関数から前記実行開始点となる関数に至るまでの関数の呼び出しの深さをそれぞれ特定し、
特定した前記関数の呼び出しの深さに基づいて、前記実行情報を生成する、ことを特徴とする請求項１または２に記載の情報処理装置。
【請求項４】
前記制御部は、
前記関数の呼び出しの深さを特定したことに応じて、当該呼び出しの深さに対応する前記関数の処理時間の長さを示す値をカウントアップしていくことにより、前記プログラムの実行終了時における前記値を含む前記実行情報を生成し、
生成した前記実行情報を参照して、前記同じ呼び出しの深さに対応する、前記第１の関数の処理時間の長さを示す値と、前記他の関数の処理時間の長さを示す値とを出力する、ことを特徴とする請求項３に記載の情報処理装置。
【請求項５】
前記制御部は、
生成した前記実行情報を参照して、前記同じ呼び出しの深さの各関数の処理時間の長さを示す値に基づいて、当該各関数の処理時間の長さを示す値の比率を算出し、
算出した前記各関数の処理時間の長さを示す値の比率を出力する、ことを特徴とする請求項４に記載の情報処理装置。
【請求項６】
コンピュータが、
プログラム内の第１の関数の指定を受け付け、
前記プログラムの実行時に呼び出される各関数について、前記プログラムの実行開始点となる関数からの呼び出しの深さを示す実行情報に基づいて、指定された前記第１の関数と同じ呼び出しの深さの他の関数を抽出し、
抽出した前記他の関数の情報を出力する、
処理を実行することを特徴とするプログラム実行状態表示方法。
【請求項７】
コンピュータに、
プログラム内の第１の関数の指定を受け付け、
前記プログラムの実行時に呼び出される各関数について、前記プログラムの実行開始点となる関数からの呼び出しの深さを示す実行情報に基づいて、指定された前記第１の関数と同じ呼び出しの深さの他の関数を抽出し、
抽出した前記他の関数の情報を出力する、
処理を実行させることを特徴とするプログラム実行状態表示プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、プログラム実行状態表示方法、およびプログラム実行状態表示プログラムに関する。
【背景技術】
【０００２】
従来、アプリケーションのボトルネック箇所の特定に用いるプロファイル情報を採取する方式として、例えば、サンプリング方式や関数呼び出し履歴記録方式がある。サンプリング方式は、プログラムに割り込みをあげ、そのときのプログラムカウンタを記録し、スタック上の関数呼び出し元、呼び出し元スタックの情報を用いて関数の呼び出し関係を記録する方式である。関数呼び出し履歴記録方式は、コンパイル時に情報採取用コードを埋め込む方式であり、例えば、コンパイル時にプロファイルオプションを指定して、特別なオブジェクトを生成する。
【０００３】
先行技術としては、例えば、アプリケーションプログラムの実行中に割り込みが発生した場合に、メイン関数からその時点において実行中であった関数までの経路を示す呼び出し情報を取得し、アプリケーションプログラムの実行が終了した場合に、取得した呼び出し情報を集計してＣＲＴ（Ｃａｔｈｏｄｅ  Ｒａｙ  Ｔｕｂｅ）モニタに表示させるものがある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０００−２５０７８０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来技術では、ある機能を実現するいくつかの処理がまとまった処理フェーズ単位での実行時間の内訳解析を行うことが難しく、アプリケーションのボトルネック箇所を特定するための分析作業が困難なものとなる場合がある。例えば、サンプリング方式では、現在実行している関数と呼び出し元の関数しか特定することができず、処理フェーズごとの処理時間の見積もりを行うことが難しい。また、関数呼び出し履歴記録方式では、オブジェクトコードを変更することになる。
【０００６】
一つの側面では、本発明は、第１の関数と対に実行されている可能性が高い関数を特定可能にする情報処理装置、プログラム実行状態表示方法、およびプログラム実行状態表示プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一態様によれば、プログラム内の第１の関数の指定を受け付け、前記プログラムの実行時に呼び出される各関数について、前記プログラムの実行開始点となる関数からの呼び出しの深さを示す実行情報に基づいて、指定された前記第１の関数と同じ呼び出しの深さの他の関数を抽出し、抽出した前記他の関数の情報を出力する情報処理装置、プログラム実行状態表示方法、およびプログラム実行状態表示プログラムが提案される。
【発明の効果】
【０００８】
本発明の一側面によれば、第１の関数と対に実行されている可能性が高い関数を特定可能にすることができるという効果を奏する。
【図面の簡単な説明】
【０００９】
【図１】図１は、実施の形態にかかるプログラム実行状態表示方法の一実施例を示す説明図である。
【図２】図２は、情報処理装置１００のハードウェア構成例を示すブロック図である。
【図３】図３は、プロファイル情報ＤＢ３００のデータ構造例を示す説明図である。
【図４】図４は、情報処理装置１００の機能的構成例を示すブロック図である。
【図５】図５は、プログラムＰを実行中のスタックエリアｓａの記憶内容の一例を示す説明図である。
【図６】図６は、プロファイル情報ＤＢ３００の記憶内容の一例を示す説明図である。
【図７】図７は、実行状態情報ＥＤの具体例を示す説明図である。
【図８】図８は、情報処理装置１００のプロファイル情報生成処理手順の一例を示すフローチャートである。
【図９】図９は、ＣＯＵＮＴ処理の具体的処理手順の一例を示すフローチャート（その１）である。
【図１０】図１０は、ＣＯＵＮＴ処理の具体的処理手順の一例を示すフローチャート（その２）である。
【図１１】図１１は、プログラム実行状態表示処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下に図面を参照して、本発明にかかる情報処理装置、プログラム実行状態表示方法、およびプログラム実行状態表示プログラムの実施の形態を詳細に説明する。
【００１１】
（プログラム実行状態表示方法の一実施例）
図１は、実施の形態にかかるプログラム実行状態表示方法の一実施例を示す説明図である。図１において、情報処理装置１００は、プログラムＰの分析を支援するコンピュータである。プログラムＰは、分析対象となるコンピュータプログラムであり、例えば、アプリケーションである。情報処理装置１００は、例えば、サーバであってもよく、また、プログラムＰの開発者Ｍが使用するＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）などの汎用演算装置であってもよい。
【００１２】
ここで、プログラムＰのボトルネック箇所を特定するには、処理フェーズ単位の実行時間を把握することが有効である。処理フェーズとは、ある機能を実現するいくつかの処理をまとめたものである。例えば、処理フェーズ単位の実行時間を比較することで、プログラムＰ内での処理フェーズがどういう配分になっているのかを把握可能となり、ボトルネック箇所の特定を特定しやすくすることができる。
【００１３】
しかしながら、プログラムＰ内の全ての処理フェーズを人手で把握するには、解説書などを参照しながらプログラムＰを網羅することになり手間がかかる。例えば、データベースであれば、パージング、プランニング、実行という処理フェーズがある。ところが、データベースによっては、最適化フェーズ、動的コンパイルフェーズといった処理フェーズを持つものもあり、プログラム内部の知識がなければ処理フェーズのリストを作成することは困難である。
【００１４】
一方で、プログラムＰ内のある一つの処理フェーズに相当する関数名はわかることが多い。また、同じ呼び出しの深さの関数は、それぞれ処理フェーズを担当している関数であることが多い。呼び出しの深さとは、プログラムＰの実行開始点（エントリーポイント）となる関数（例えば、ｍａｉｎ関数）からの呼び出しの深さである。すなわち、ある処理フェーズを担当する関数と同じ呼び出しの深さの他の関数は、他の処理フェーズを担当している可能性が高い。
【００１５】
そこで、本実施の形態では、プログラムＰを実行して得られる実行情報に基づいて、ユーザ（例えば、開発者Ｍ）から指定された関数と同じ呼び出しの深さの他の関数を抽出して、抽出した他の関数の情報を出力するプログラム実行状態表示方法について説明する。以下、情報処理装置１００の処理例について説明する。
【００１６】
（１）情報処理装置１００は、プログラムＰ内の第１の関数の指定を受け付ける。ここで、関数は、引数と呼ばれるデータを受け取ると、決められた処理を実行して結果を出力する命令群である。関数は、プログラムＰの構成要素の一つであり、例えば、サブルーチン、メソッドなどである。
【００１７】
図１の例では、プログラムＰのソースコードの一例が示されている。ただし、図面では、ソースコードの一部を抜粋して表示している。第１の関数の指定は、例えば、関数名を指定することにより行われる。ここでは、開発者Ｍにより、プログラムＰのある処理フェーズを担当するＣ（）が、第１の関数として指定された場合を想定する。
【００１８】
（２）情報処理装置１００は、実行情報１１０に基づいて、指定された第１の関数と同じ呼び出しの深さの他の関数を抽出する。ここで、実行情報１１０は、プログラムＰの実行時に呼び出される各関数について、プログラムＰの実行開始点（エントリーポイント）となる関数からの呼び出しの深さを示す情報である。実行情報１１０は、例えば、プログラムＰの実行時に生成される。
【００１９】
図１の例では、プログラムＰの実行開始点となる関数は、ｍａｉｎ（）である。また、第１の関数として指定されたＣ（）の呼び出しの深さは「４」である。このため、情報処理装置１００は、実行情報１１０に基づいて、第１の関数であるＣ（）と同じ呼び出しの深さ「４」の他の関数を抽出する。ここでは、プログラムＰ内のＤ（）が他の関数として抽出される。
【００２０】
（３）情報処理装置１００は、抽出した他の関数の情報を出力する。ここで、他の関数の情報は、第１の関数と同じ呼び出しの深さの関数を識別可能な情報であり、例えば、他の関数の関数名を含む。図１の例では、情報処理装置１００は、例えば、他の関数として抽出したＤ（）の関数名「Ｄ」を含む実行状態情報１２０をディスプレイ１３０に表示する。
【００２１】
なお、ディスプレイ１３０は、情報処理装置１００が有していてもよく、また、情報処理装置１００に接続された他の装置が有していてもよい。
【００２２】
このように、情報処理装置１００によれば、プログラムＰ内の第１の関数の指定を受け付けたことに応じて、第１の関数と同じ呼び出しの深さで呼び出されている他の関数を抽出して、抽出した他の関数の情報を出力することができる。これにより、第１の関数と対に実行されている可能性が高い他の関数の情報を提供することができる。
【００２３】
図１の例では、開発者Ｍは、第１の関数として指定したＣ（）と対に実行されている可能性が高いＤ（）を把握することができる。換言すれば、Ｃ（）が担当する処理フェーズだけでなく、Ｄ（）が担当する他の処理フェーズを把握することができる。これにより、Ｃ（）、Ｄ（）の各関数が担当する処理フェーズ単位での内訳計算を行うことが可能となり、例えば、プログラムＰ内で各処理フェーズがどういう配分で実行されているのかを判断可能にして、ボトルネック箇所の特定を支援することができる。
【００２４】
（情報処理装置１００のハードウェア構成例）
つぎに、情報処理装置１００のハードウェア構成例について説明する。
【００２５】
図２は、情報処理装置１００のハードウェア構成例を示すブロック図である。図２において、情報処理装置１００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）２０１と、メモリ２０２と、ディスクドライブ２０３と、ディスク２０４と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）２０５と、ディスプレイ２０６と、入力装置２０７と、を有する。また、各構成部はバス２００によってそれぞれ接続される。
【００２６】
ここで、ＣＰＵ２０１は、情報処理装置１００の全体の制御を司る。メモリ２０２は、例えば、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）およびフラッシュＲＯＭなどを有する。具体的には、例えば、フラッシュＲＯＭやＲＯＭが各種プログラムを記憶し、ＲＡＭがＣＰＵ２０１のワークエリアとして使用される。メモリ２０２に記憶されるプログラムは、ＣＰＵ２０１にロードされることで、コーディングされている処理をＣＰＵ２０１に実行させる。
【００２７】
ディスクドライブ２０３は、ＣＰＵ２０１の制御に従ってディスク２０４に対するデータのリード／ライトを制御する。ディスク２０４は、ディスクドライブ２０３の制御で書き込まれたデータを記憶する。ディスク２０４としては、例えば、磁気ディスク、光ディスクなどが挙げられる。
【００２８】
Ｉ／Ｆ２０５は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク２１０に接続され、ネットワーク２１０を介して他の装置に接続される。そして、Ｉ／Ｆ２０５は、ネットワーク２１０と自装置内部とのインターフェースを司り、他の装置からのデータの入出力を制御する。
【００２９】
ディスプレイ２０６は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ２０６は、例えば、液晶ディスプレイ、ＣＲＴなどを採用することができる。図１に示したディスプレイ１３０は、例えば、ディスプレイ２０６に相当する。
【００３０】
入力装置２０７は、文字、数字、各種指示などの入力のためのキーを有し、データの入力を行う。入力装置２０７は、キーボードやマウスなどであってもよく、また、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００３１】
なお、情報処理装置１００は、上述した構成部のほかに、例えば、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）やプリンタなどを有することにしてもよい。また、情報処理装置１００は、例えば、ディスプレイ２０６や入力装置２０７を有さないことにしてもよい。
【００３２】
（プロファイル情報ＤＢ３００のデータ構造例）
つぎに、情報処理装置１００が有するプロファイル情報ＤＢ（ＤａｔａＢａｓｅ）３００のデータ構造例について説明する。プロファイル情報ＤＢ３００は、例えば、図２に示したメモリ２０２、ディスク２０４などの記憶装置により実現される。
【００３３】
図３は、プロファイル情報ＤＢ３００のデータ構造例を示す説明図である。図３において、プロファイル情報ＤＢ３００は、呼び出しの深さ、サブルーチン名およびカウントのフィールドを有し、各フィールドに情報を設定することで、プロファイル情報をレコードとして記憶する。
【００３４】
ここで、呼び出しの深さは、プログラムＰ内の関数の呼び出しの深さであり、プログラムＰの実行開始点（エントリーポイント）となる関数からの呼び出しの深さを示す。呼び出しの深さは、最も呼び出し元側に位置する関数、すなわち、プログラムＰの実行開始点となる関数が最も小さい値となり、当該関数から呼び出し先側にいくにつれて大きい値となる。
【００３５】
サブルーチン名は、プログラムＰ内の関数の関数名に相当する。カウントは、プログラムＰ内の関数について、それぞれ対応する呼び出しの深さでの処理時間の長さを示す指標値である。カウントは、初期状態では「０」である。なお、プロファイル情報の具体例については、図６を用いて後述する。
【００３６】
（情報処理装置１００の機能的構成例）
図４は、情報処理装置１００の機能的構成例を示すブロック図である。図４において、情報処理装置１００は、受付部４０１と、実行制御部４０２と、分析部４０３と、抽出部４０４と、算出部４０５と、出力部４０６と、を含む構成である。受付部４０１〜出力部４０６は制御部となる機能であり、具体的には、例えば、図２に示したメモリ２０２、ディスク２０４などの記憶装置に記憶されたプログラムをＣＰＵ２０１に実行させることにより、または、Ｉ／Ｆ２０５により、その機能を実現する。各機能部の処理結果は、例えば、メモリ２０２、ディスク２０４などの記憶装置に記憶される。
【００３７】
受付部４０１は、分析対象となるプログラムＰ（ソースコード）の入力を受け付ける。具体的には、例えば、受付部４０１は、図２に示した入力装置２０７を用いたユーザの操作入力により、プログラムＰの入力を受け付ける。また、例えば、受付部４０１は、ネットワーク２１０を介して、他の装置からプログラムＰを受信することにより、プログラムＰの入力を受け付けることにしてもよい。
【００３８】
実行制御部４０２は、プログラムＰの実行を制御する。具体的には、例えば、実行制御部４０２は、プログラムＰの実行開始指示を受け付けたことに応じて、プログラムＰの実行を開始する。プログラムＰの実行開始指示は、例えば、入力装置２０７を用いたユーザの操作入力により入力される。
【００３９】
分析部４０３は、プログラムＰを実行時のプログラムカウンタｐｃの情報とスタックエリアｓａの情報とに基づいて、プログラムＰのプロファイル情報を生成する。ここで、プロファイル情報は、プログラムＰの実行状態を表す情報であり、例えば、図１に示した実行情報１１０に相当する。
【００４０】
プログラムカウンタｐｃは、次に実行する命令のメモリ番地（例えば、図２に示したメモリ２０２上のアドレス）を記憶するレジスタである。スタックエリアｓａは、最後に格納したデータを最初に取り出せるようにしたデータ構造を有するメモリ上の領域である。スタックエリアｓａには、プログラムＰ内の関数が呼び出される度に生成されるスタックフレームが記憶される。また、関数から復帰すると、当該関数を呼び出したときに生成されたスタックフレームが削除される。
【００４１】
スタックフレームには、例えば、戻り番地（呼び出しが発生した場所）、関数への引数（関数呼び出しの引数）、関数のローカル変数（呼び出された関数内部のローカル変数）などが含まれる。したがって、スタックエリアｓａ内のスタックフレームを参照することで、次々と関数を呼び出したとしても、呼び出し元に順番に戻ることができる。
【００４２】
具体的には、例えば、分析部４０３は、プログラムＰを実行中の所定のタイミングで、プログラムＰのプロファイル情報を生成する、あるいは、生成したプロファイル情報を更新する。所定のタイミングは、例えば、予め決められた一定時間ごとのタイミングであってもよく、また、新たに関数が呼び出されたタイミングであってもよい。
【００４３】
なお、一定時間ごとのタイミングは、例えば、一定時間ごとにシグナルを発生させることで特定することができる。また、関数呼び出しのタイミングは、例えば、関数呼び出しに応じて割り込みをあげることで特定することができる。
【００４４】
ここで、図５を用いて、分析部４０３の具体的な処理内容について説明する。ここでは、図１に示したプログラムＰの実行中に、ｍａｉｎ（）⇒Ａ（）⇒Ｂ（）⇒Ｃ（）⇒Ｂ（）という順番で各関数が呼び出されていた場合を想定する。以下の説明では、プログラムＰ内の関数を「サブルーチン」と表記する場合がある。
【００４５】
図５は、プログラムＰを実行中のスタックエリアｓａの記憶内容の一例を示す説明図である。図５において、メモリ２０２内のスタックエリアｓａとコードエリアｃａとが示されている。スタックエリアｓａには、スタックフレーム５０１〜５０５が記憶されている。コードエリアｃａは、命令を記憶するメモリ上の領域である。
【００４６】
まず、分析部４０３は、プログラムカウンタｐｃの値を参照して、現在のサブルーチンのサブルーチン名を特定する。具体的には、例えば、分析部４０３は、プログラムカウンタｐｃの値から現在のサブルーチンのメモリ番地（次に実行する命令の一つ前のメモリ番地）を計算する。そして、分析部４０３は、例えば、シンボルテーブルを参照して、計算したメモリ番地に対応する現在のサブルーチンのサブルーチン名を特定する。
【００４７】
図５の例では、プログラムカウンタｐｃの値から、現在のサブルーチンのサブルーチン名として、サブルーチンＢのサブルーチン名「Ｂ」が特定された場合を想定する。
【００４８】
また、分析部４０３は、スタックポインタｓｐの値を参照して、現在のスタック位置を特定する。スタックポインタｓｐは、スタックエリアｓａの最上段のアドレス、すなわち、スタックエリアｓａ内で最後に参照された位置のアドレスを保持するレジスタである。スタックポインタｓｐの値は、スタックエリアｓａに新たなデータが格納されると、そのデータ量分増え、スタックエリアｓａからデータが取り出されると、そのデータ量分減る。
【００４９】
図５の例では、スタックポインタｓｐの値から、現在のスタック位置として、スタックフレーム５０５が記憶されたスタック位置が特定される。
【００５０】
つぎに、分析部４０３は、現在のスタック位置からスタックフレームを順次辿っていくことで、現在のサブルーチンから実行開始点となるサブルーチンに至るまでの呼び出しの深さごとのサブルーチンを特定する。図５の例では、以下のような呼び出しの深さごとのサブルーチンが特定される（呼び出しの深さ：サブルーチン名）。
【００５１】
１：ｍａｉｎ，２：Ａ，３：Ｂ，４：Ｃ，５：Ｂ
【００５２】
そして、分析部４０３は、例えば、特定した各サブルーチンのサブルーチン名と呼び出しの深さとを対応付けて、図３に示したプロファイル情報ＤＢ３００に登録する。また、分析部４０３は、登録したサブルーチン名と呼び出しの深さとのペアに対応するカウントを１カウントアップする。なお、分析部４０３は、特定した関数のサブルーチン名と呼び出しの深さとのペアがプロファイル情報ＤＢ３００に登録済みの場合には、当該ペアに対応するカウントを１カウントアップする。
【００５３】
図５の例では、サブルーチン名と呼び出しの深さとのペア「１：ｍａｉｎ，２：Ａ，３：Ｂ，４：Ｃ，５：Ｂ」それぞれについてのカウントが１カウントアップされる。
【００５４】
ここで、図６を用いて、プログラムＰの実行終了時のプロファイル情報ＤＢ３００の記憶内容について説明する。
【００５５】
図６は、プロファイル情報ＤＢ３００の記憶内容の一例を示す説明図である。図６において、プロファイル情報ＤＢ３００には、プロファイル情報６００−１〜６００−６が記憶されている。例えば、プロファイル情報６００−１は、呼び出しの深さ「１」のサブルーチン名「ｍａｉｎ」のサブルーチンのカウント「２８１３」を示す。
【００５６】
呼び出しの深さとサブルーチン名とのペアに対応するカウントは、その値が大きいほど該当のサブルーチンの処理時間が長いことを示している。上述したように、関数（サブルーチン）が呼び出された際に生成されたスタックフレームは、当該関数から復帰、すなわち、当該関数の処理が終了するまでの間はスタックエリアｓａに残る。したがって、新たに関数が呼び出される度に、スタックエリアｓａ内の各スタックフレームから特定される各呼び出しの深さの関数のカウントをカウントアップしていくことで、当該関数の処理時間の長さを示す情報を得ることができる。
【００５７】
図４の説明に戻り、受付部４０１は、プログラムＰ内の第１の関数の指定を受け付ける。ここで、第１の関数は、例えば、プログラムＰの開発者Ｍ（図１参照）などにより任意に指定される関数である。具体的には、例えば、受付部４０１は、入力装置２０７を用いたユーザの操作入力により、実行状態表示コマンドを受け付けることにしてもよい。また、受付部４０１は、ネットワーク２１０を介して、他の装置から実行状態表示コマンドを受信することにより、実行状態表示コマンドを受け付けることにしてもよい。
【００５８】
実行状態表示コマンドは、プログラムＰの実行状態の表示要求に相当する。実行状態表示コマンドには、例えば、分析対象のプログラムＰのプログラム名、参照先のプロファイル情報を特定する情報（例えば、ファイル名）、および第１の関数の関数名（例えば、サブルーチン名）が含まれる。
【００５９】
抽出部４０４は、生成されたプロファイル情報を参照して、指定された第１の関数と同じ呼び出しの深さの他の関数を抽出する。具体的には、例えば、抽出部４０４は、図６に示したプロファイル情報ＤＢ３００を参照して、指定された第１の関数と同じ呼び出しの深さの他のサブルーチンを抽出する。
【００６０】
一例として、第１の関数の関数名として、サブルーチン名「Ｄ」が指定された場合を想定する。この場合、抽出部４０４は、プロファイル情報ＤＢ３００（図６参照）を参照して、指定されたサブルーチンＤと同じ呼び出しの深さ「４」のサブルーチンＣを抽出する。
【００６１】
ここで、プログラムＰの中では、ある関数の中で同じ関数を呼び出して処理する再帰呼び出しが行われることがある。この場合、呼び出しの深さが最も浅いところで呼び出された関数が、最も重要な関数、すなわち、処理フェーズを表す関数であるといえる。例えば、ｆａｃｔ関数を用いて階乗「ｎ！」を再帰的に計算する場合、ｆａｃｔ（ｎ）が呼ばれてから、ｆａｃｔ（ｎ−１）、ｆａｃｔ（ｎ−２）、…と処理し、ｆａｃｔ（ｎ）が終了するまでの時間が、ｆａｃｔ（ｎ）にかかる処理時間となる。
【００６２】
したがって、抽出部４０４は、第１の関数が複数の異なる深さで呼び出される関数である場合には、第１の関数の最小の呼び出しの深さと同じ呼び出しの深さの関数を抽出することにしてもよい。一例として、第１の関数の関数名として、サブルーチン名「Ｂ」が指定された場合を想定する。サブルーチンＢは、呼び出しの深さ「３」と「５」で呼び出される関数である（図６参照）。
【００６３】
この場合、抽出部４０４は、プロファイル情報ＤＢ３００（図６参照）を参照して、指定されたサブルーチンＢの最小の呼び出しの深さ「３」と同じ呼び出しの深さのサブルーチンを抽出する。ただし、図６の例では、呼び出しの深さ「３」の他のサブルーチンは存在しないため、いずれの関数も抽出されない。
【００６４】
算出部４０５は、第１の関数と同じ呼び出しの深さの各関数（第１の関数を含む）の処理時間の長さを示す値に基づいて、各関数の処理時間の長さを示す値の比率を算出する。ここで、同じ呼び出しの深さの各関数の処理時間の長さを示す値の比率は、プログラムＰ内でそれらの関数、すなわち、当該各関数が担当する処理フェーズがどういう割合で実行されているかの実行割合を判断するための指標となる。
【００６５】
一例として、第１の関数の関数名として、サブルーチン名「Ｄ」が指定され、同じ呼び出しの深さ「４」のサブルーチンＣが抽出された場合を想定する。この場合、算出部４０５は、例えば、プロファイル情報ＤＢ３００（図６参照）を参照して、呼び出しの深さ「４」のサブルーチンＣのカウント「２３００」とサブルーチンＤのカウント「５００」を特定する。
【００６６】
つぎに、算出部４０５は、特定した各サブルーチンＣ，Ｄのカウントの合計値Ｔ「２８００」を算出する。そして、算出部４０５は、各サブルーチンＣ，Ｄのカウント「２３００，５００」を合計値Ｔ「２８００」で割ることにより、各サブルーチンＣ，Ｄの処理時間の長さを示す値の比率「０．８２１，０．１７９」を算出する。この際、算出部４０５は、例えば、各比率に「１００」を掛け合わせて、各サブルーチンＣ，Ｄの実行割合（単位：％）を求めることにしてもよい。
【００６７】
出力部４０６は、抽出された他の関数の情報を出力する。他の関数の情報は、第１の関数と同じ呼び出しの深さの関数を識別可能な情報である。出力部４０６の出力形式としては、例えば、ディスプレイ２０６への表示、Ｉ／Ｆ２０５による外部装置への送信、メモリ２０２、ディスク２０４などの記憶装置への記憶、不図示のプリンタへの印刷出力などがある。
【００６８】
具体的には、例えば、出力部４０６は、プロファイル情報ＤＢ３００を参照して、第１の関数と同じ呼び出しの深さの各関数の関数名を示す実行状態情報ＥＤを出力することにしてもよい。実行状態情報ＥＤは、例えば、図１に示した実行状態情報１２０に相当する。これにより、第１の関数と対に実行されている可能性が高い関数を把握することが可能となる。
【００６９】
また、出力部４０６は、例えば、プロファイル情報ＤＢ３００を参照して、第１の関数と同じ呼び出しの深さの各関数の処理時間の長さを示す値を含む実行状態情報ＥＤを出力することにしてもよい。これにより、プログラムＰ内で各関数が担当する処理フェーズがそれぞれどのような割合で実行されているかを判断することが可能となる。
【００７０】
また、出力部４０６は、例えば、プロファイル情報ＤＢ３００を参照して、第１の関数と同じ呼び出しの深さの各関数の処理時間の長さを示す値の比率（あるいは、実行割合）を含む実行状態情報ＥＤを出力することにしてもよい。これにより、プログラムＰ内で各関数が担当する処理フェーズがそれぞれどのような割合で実行されているかをより直感的に判断することが可能となる。
【００７１】
実行状態情報ＥＤの具体例については、図７を用いて後述する。
【００７２】
なお、第１の関数と同じ呼び出しの深さの他の関数が抽出されなかった場合には、出力部４０６は、例えば、第１の関数と同じ呼び出しの深さの他の関数が存在しないことを示す情報を出力することにしてもよい。これにより、第１の関数と対に実行されている他の関数が存在しない可能性が高いことを把握することができる。
【００７３】
（実行状態情報ＥＤの具体例）
つぎに、図７を用いて、実行状態情報ＥＤの具体例について説明する。ここでは、第１の関数として、サブルーチンＤが指定された結果、同じ呼び出しの深さ「４」のサブルーチンＣが抽出された場合を例に挙げて説明する。
【００７４】
図７は、実行状態情報ＥＤの具体例を示す説明図である。図７において、実行状態情報ＥＤは、呼び出しの深さと、サブルーチン名と、実行割合と、サンプリング数とを対応付けて示す情報である。実行状態情報ＥＤは、例えば、ディスプレイ２０６に表示される。
【００７５】
呼び出しの深さは、プログラムＰ内の関数（サブルーチン）の呼び出しの深さであり、指定された第１の関数の呼び出しの深さに相当する。サブルーチン名は、各関数の関数名に相当する。実行割合は、各関数の処理時間の長さを示す値の比率に基づく実行割合を示す。
【００７６】
実行状態情報ＥＤによれば、例えば、開発者Ｍは、指定したサブルーチンＤと対に実行されている可能性が高いサブルーチンＣを把握することができる。また、開発者Ｍは、プログラムＰ内で各サブルーチンＣ，Ｄが担当する各処理フェーズがそれぞれどのような割合で実行されているかを判断することができる。
【００７７】
ここでは、サブルーチンＣの実行割合「８２．１％」が、サブルーチンＤの実行割合「１７．９％」を大きく上回っている。このため、開発者Ｍは、プログラムＰの中でサブルーチンＣが担当する処理フェーズがより支配的となっており、当該処理フェーズがボトルネックとなっている可能性が高いことがわかる。
【００７８】
（情報処理装置１００の各種処理手順）
つぎに、情報処理装置１００の各種処理手順について説明する。まず、図８を用いて、情報処理装置１００のプロファイル情報生成処理手順について説明する。
【００７９】
＜プロファイル情報生成処理手順＞
図８は、情報処理装置１００のプロファイル情報生成処理手順の一例を示すフローチャートである。図８のフローチャートにおいて、まず、情報処理装置１００は、プログラムＰの実行を開始する（ステップＳ８０１）。つぎに、情報処理装置１００は、シグナルハンドラをＣＯＵＮＴルーチンに設定し（ステップＳ８０２）、一定時間ごとにシグナルを発生させるコードを実行する（ステップＳ８０３）。
【００８０】
そして、情報処理装置１００は、プログラムＰを実行する（ステップＳ８０４）。つぎに、情報処理装置１００は、シグナルを受理すると（ステップＳ８０５）、プログラムカウンタｐｃ、レジスタの値を退避する（ステップＳ８０６）。そして、情報処理装置１００は、ＣＯＵＮＴ処理を実行する（ステップＳ８０７）。なお、ＣＯＵＮＴ処理の具体的な処理手順については、図９および図１０を用いて後述する。
【００８１】
つぎに、情報処理装置１００は、プログラムカウンタｐｃ、レジスタを復帰させて（ステップＳ８０８）、プログラムＰの実行が終了したか否かを判断する（ステップＳ８０９）。ここで、プログラムＰの実行が終了していない場合（ステップＳ８０９：Ｎｏ）、情報処理装置１００は、ステップＳ８０４に戻る。
【００８２】
一方、プログラムＰの実行が終了した場合（ステップＳ８０９：Ｙｅｓ）、情報処理装置１００は、本フローチャートによる一連の処理を終了する。これにより、一定時間ごとに生じるシグナルを受理する度に、プログラムＰの実行状態を表すプロファイル情報を生成あるいは更新することができる。
【００８３】
つぎに、図９および図１０を用いて、図８に示したステップＳ８０７のＣＯＵＮＴ処理の具体的な処理手順について説明する。
【００８４】
図９および図１０は、ＣＯＵＮＴ処理の具体的処理手順の一例を示すフローチャートである。図９のフローチャートにおいて、まず、情報処理装置１００は、Ｌを「Ｌ＝（）」、Ｄを「Ｄ＝０」とし（ステップＳ９０１）、プログラムカウンタｐｃの値から、現在のサブルーチンのサブルーチン名を特定する（ステップＳ９０２）。
【００８５】
つぎに、情報処理装置１００は、スタックポインタｓｐの値から、現在のスタック位置を特定する（ステップＳ９０３）。そして、情報処理装置１００は、Ｌに［Ｄ、サブルーチン名］を追加する（ステップＳ９０４）。つぎに、情報処理装置１００は、Ｄを「Ｄ＝Ｄ＋１」として（ステップＳ９０５）、Ｌに追加したサブルーチン名のサブルーチンがｍａｉｎ（）であるか否かを判断する（ステップＳ９０６）。
【００８６】
ここで、サブルーチンがｍａｉｎ（）ではない場合（ステップＳ９０６：Ｎｏ）、情報処理装置１００は、現在のスタック位置から呼び出し元のサブルーチン、呼び出し元のスタック位置を特定して（ステップＳ９０７）、ステップＳ９０４に戻る。なお、ステップＳ９０７において、呼び出し元のスタック位置が特定されると、当該スタック位置が現在のスタック位置となる。
【００８７】
また、ステップＳ９０６において、サブルーチンがｍａｉｎ（）の場合（ステップＳ９０６：Ｙｅｓ）、情報処理装置１００は、図１０に示すステップＳ１００１に移行する。
【００８８】
図１０のフローチャートにおいて、まず、情報処理装置１００は、Ｌの先頭要素があるか否かを判断する（ステップＳ１００１）。ここで、先頭要素がある場合（ステップＳ１００１：Ｙｅｓ）、情報処理装置１００は、Ｌの先頭要素を取り出す（ステップＳ１００２）。
【００８９】
つぎに、情報処理装置１００は、Ｆ（呼び出しの深さ）を、取り出した先頭要素の「１番目の要素」とし（ステップＳ１００３）、Ｓ（サブルーチン名）を、取り出した先頭要素の「２番目の要素」とする（ステップＳ１００４）。そして、情報処理装置１００は、Ｆを「Ｆ＝Ｄ−Ｆ」とする（ステップＳ１００５）。
【００９０】
つぎに、情報処理装置１００は、プロファイル情報ＤＢ３００にＦ、Ｓに関するエントリがあるか否かを判断する（ステップＳ１００６）。ここで、Ｆ、Ｓに関するエントリがある場合（ステップＳ１００６：Ｙｅｓ）、情報処理装置１００は、ステップＳ１００９に移行する。
【００９１】
一方、Ｆ、Ｓに関するエントリがない場合（ステップＳ１００６：Ｎｏ）、情報処理装置１００は、Ｆ、Ｓに関するエントリをプロファイル情報ＤＢ３００に登録し（ステップＳ１００７）、当該エントリのカウントに「０」をセットする（ステップＳ１００８）。そして、情報処理装置１００は、Ｆ、Ｓに関するエントリのカウントを１カウントアップして（ステップＳ１００９）、ステップＳ１００１に戻る。
【００９２】
また、ステップＳ１００１において、Ｌの先頭要素がない場合（ステップＳ１００１：Ｎｏ）、情報処理装置１００は、ＣＯＵＮＴ処理を呼び出したステップに戻る。これにより、プログラムＰを実行時に呼び出されたサブルーチンのサブルーチン名、呼び出しの深さ、およびカウント（処理時間の長さを示す値）を示すプロファイル情報を生成あるいは更新することができる。
【００９３】
＜プログラム実行状態表示処理手順＞
つぎに、図１１を用いて、情報処理装置１００のプログラム実行状態表示処理手順について説明する。
【００９４】
図１１は、プログラム実行状態表示処理手順の一例を示すフローチャートである。図１１のフローチャートにおいて、まず、情報処理装置１００は、実行状態表示コマンドを受け付けたか否かを判断する（ステップＳ１１０１）。ここで、情報処理装置１００は、実行状態表示コマンドを受け付けるのを待つ（ステップＳ１１０１：Ｎｏ）。
【００９５】
そして、情報処理装置１００は、実行状態表示コマンドを受け付けた場合（ステップＳ１１０１：Ｙｅｓ）、実行状態表示コマンドを参照して、第１の関数の関数名（サブルーチン名）を特定する（ステップＳ１１０２）。つぎに、情報処理装置１００は、プロファイル情報ＤＢ３００を参照して、特定した関数名に対応する最小の呼び出しの深さＦを特定する（ステップＳ１１０３）。
【００９６】
そして、情報処理装置１００は、プロファイル情報ＤＢ３００を参照して、特定した呼び出しの深さＦの関数を抽出する（ステップＳ１１０４）。つぎに、情報処理装置１００は、プロファイル情報ＤＢ３００を参照して、抽出した呼び出しの深さＦの関数の処理時間の長さを示すカウントの合計値Ｔを算出する（ステップＳ１１０５）。
【００９７】
そして、情報処理装置１００は、抽出した呼び出しの深さＦの関数のうちの未選択の関数を選択する（ステップＳ１１０６）。つぎに、情報処理装置１００は、選択した関数の処理時間の長さを示すカウントを合計値Ｔで割って、当該関数の実行割合を算出する（ステップＳ１１０７）。
【００９８】
そして、情報処理装置１００は、実行状態情報ＥＤに、選択した関数の呼び出しの深さＦ、関数名、実行割合およびカウントを登録する（ステップＳ１１０８）。つぎに、情報処理装置１００は、抽出した呼び出しの深さＦの関数のうちの未選択の関数があるか否かを判断する（ステップＳ１１０９）。
【００９９】
ここで、未選択の関数がある場合（ステップＳ１１０９：Ｙｅｓ）、情報処理装置１００は、ステップＳ１１０６に戻る。一方、未選択の関数がない場合（ステップＳ１１０９：Ｎｏ）、情報処理装置１００は、実行状態情報ＥＤを出力して（ステップＳ１１１０）、本フローチャートによる一連の処理を終了する。
【０１００】
これにより、開発者Ｍなどにより指定された第１の関数と同じ呼び出しの深さの各関数についての実行状態を表す実行状態情報ＥＤを出力することができる。
【０１０１】
以上説明したように、実施の形態にかかる情報処理装置１００によれば、プログラムＰ内の第１の関数の指定を受け付けたことに応じて、プロファイル情報ＤＢ３００を参照して、指定された第１の関数と同じ呼び出しの深さの他の関数を抽出し、抽出した他の関数の情報（例えば、関数名）を含む実行状態情報ＥＤを出力することができる。
【０１０２】
これにより、第１の関数と対に実行されている可能性が高い他の関数の情報を提供することができる。したがって、例えば、開発者Ｍは、プログラムＰ内で第１の関数が担当する処理フェーズだけでなく、他の関数が担当する他の処理フェーズを把握することができる。
【０１０３】
また、情報処理装置１００によれば、第１の関数が複数の異なる深さで呼び出される関数である場合には、第１の関数の最小の呼び出しの深さと同じ呼び出しの深さの他の関数を抽出することができる。これにより、再帰呼び出しされる関数が指定された場合であっても、処理フェーズを表す上で最も重要であるといえる、最も浅いところで呼び出される関数に着目して、当該関数と対に実行されている可能性が高い関数を抽出することができる。
【０１０４】
また、情報処理装置１００によれば、プログラムＰを実行中の所定のタイミングで、スタックエリアｓａの情報に基づいて、プログラムカウンタｐｃの情報から特定される現在の関数から実行開始点となる関数に至るまでの関数の呼び出しの深さをそれぞれ特定することができる。これにより、スタックエリアｓａのデータ構造（ＬＩＦＯ：Ｌａｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）を利用して、プログラムＰ内の各関数の呼び出しの深さを特定することができる。
【０１０５】
また、情報処理装置１００によれば、プログラムＰを実行中の所定のタイミングで、関数の呼び出しの深さを特定したことに応じて、当該呼び出しの深さに対応する当該関数の処理時間の長さを示す値をカウントアップしていくことができる。これにより、プログラムＰ内の各関数の処理時間の長さを示す値を算出することができる。
【０１０６】
また、情報処理装置１００によれば、同じ呼び出しの深さに対応する、第１の関数の処理時間の長さを示す値と、他の関数の処理時間の長さを示す値とを出力することができる。これにより、プログラムＰ内で各関数が担当する処理フェーズがそれぞれどのような割合で実行されているかを判断することが可能となる。
【０１０７】
また、情報処理装置１００によれば、同じ呼び出しの深さの各関数の処理時間の長さを示す値に基づいて、当該各関数の処理時間の長さを示す値の比率を算出して、算出した各関数の処理時間の長さを示す値の比率を出力することができる。これにより、プログラムＰ内で各関数が担当する処理フェーズがそれぞれどのような割合で実行されているかをより直感的に判断することが可能となる。
【０１０８】
これらのことから、情報処理装置１００によれば、オブジェクトコードへの変更なしに、いくつかの処理がまとまった処理フェーズの実行時間の内訳解析を容易にすることができる。これにより、プログラムＰ内部に熟知していない者であっても、ボトルネック箇所の判別が可能となる。
【０１０９】
なお、本実施の形態で説明したプログラム実行状態表示方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本プログラム実行状態表示プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ（Ｍａｇｎｅｔｏ−Ｏｐｔｉｃａｌ  ｄｉｓｋ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）、ＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）メモリ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本プログラム実行状態表示プログラムは、インターネット等のネットワークを介して配布してもよい。
【０１１０】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１１１】
（付記１）プログラム内の第１の関数の指定を受け付け、
前記プログラムの実行時に呼び出される各関数について、前記プログラムの実行開始点となる関数からの呼び出しの深さを示す実行情報に基づいて、指定された前記第１の関数と同じ呼び出しの深さの他の関数を抽出し、
抽出した前記他の関数の情報を出力する、
制御部を有することを特徴とする情報処理装置。
【０１１２】
（付記２）前記制御部は、
前記第１の関数が複数の異なる深さで呼び出される関数である場合には、前記第１の関数の最小の呼び出しの深さと同じ呼び出しの深さの他の関数を抽出する、ことを特徴とする付記１に記載の情報処理装置。
【０１１３】
（付記３）前記制御部は、
前記プログラムを実行中の所定のタイミングで、スタックエリアの情報に基づいて、プログラムカウンタの情報から特定される現在の関数から前記実行開始点となる関数に至るまでの関数の呼び出しの深さをそれぞれ特定し、
特定した前記関数の呼び出しの深さに基づいて、前記実行情報を生成する、ことを特徴とする付記１または２に記載の情報処理装置。
【０１１４】
（付記４）前記制御部は、
前記関数の呼び出しの深さを特定したことに応じて、当該呼び出しの深さに対応する前記関数の処理時間の長さを示す値をカウントアップしていくことにより、前記プログラムの実行終了時における前記値を含む前記実行情報を生成し、
生成した前記実行情報を参照して、前記同じ呼び出しの深さに対応する、前記第１の関数の処理時間の長さを示す値と、前記他の関数の処理時間の長さを示す値とを出力する、ことを特徴とする付記３に記載の情報処理装置。
【０１１５】
（付記５）前記制御部は、
生成した前記実行情報を参照して、前記同じ呼び出しの深さの各関数の処理時間の長さを示す値に基づいて、当該各関数の処理時間の長さを示す値の比率を算出し、
算出した前記各関数の処理時間の長さを示す値の比率を出力する、ことを特徴とする付記４に記載の情報処理装置。
【０１１６】
（付記６）前記所定のタイミングは、予め決められた一定時間ごとのタイミング、または、前記プログラム内のいずれかの関数が呼び出されたタイミングである、ことを特徴とする付記３に記載の情報処理装置。
【０１１７】
（付記７）コンピュータが、
プログラム内の第１の関数の指定を受け付け、
前記プログラムの実行時に呼び出される各関数について、前記プログラムの実行開始点となる関数からの呼び出しの深さを示す実行情報に基づいて、指定された前記第１の関数と同じ呼び出しの深さの他の関数を抽出し、
抽出した前記他の関数の情報を出力する、
処理を実行することを特徴とするプログラム実行状態表示方法。
【０１１８】
（付記８）コンピュータに、
プログラム内の第１の関数の指定を受け付け、
前記プログラムの実行時に呼び出される各関数について、前記プログラムの実行開始点となる関数からの呼び出しの深さを示す実行情報に基づいて、指定された前記第１の関数と同じ呼び出しの深さの他の関数を抽出し、
抽出した前記他の関数の情報を出力する、
処理を実行させることを特徴とするプログラム実行状態表示プログラム。
【符号の説明】
【０１１９】
１００  情報処理装置
１１０  実行情報
１２０，ＥＤ  実行状態情報
１３０，２０６  ディスプレイ
２００  バス
２０１  ＣＰＵ
２０２  メモリ
２０３  ディスクドライブ
２０４  ディスク
２０５  Ｉ／Ｆ
２０７  入力装置
３００  プロファイル情報ＤＢ
４０１  受付部
４０２  実行制御部
４０３  分析部
４０４  抽出部
４０５  算出部
４０６  出力部
６００−１〜６００−６  プロファイル情報
Ｐ  プログラム
【図１】
2017162026.tif 000003
【図２】
2017162026.tif 000004
【図３】
2017162026.tif 000005
【図４】
2017162026.tif 000006
【図５】
2017162026.tif 000007
【図６】
2017162026.tif 000008
【図７】
2017162026.tif 000009
【図８】
2017162026.tif 000010
【図９】
2017162026.tif 000011
【図１０】
2017162026.tif 000012
【図１１】
2017162026.tif 000013