(57)【要約】【課題】プログラム実行の際、プログラムの各関数の呼び出しに関する情報を取得することを課題とする。【解決手段】複数の関数を含むプログラムを実行するプログラム処理装置であって、前記複数の関数と関数毎に異なる所定の値とを対応付けるテーブルを格納する記憶部と、前記プログラム実行中に使用される積算値を格納し、前記プログラム実行中に一の関数が他の関数を呼び出したとき、当該他の関数に対応付けられた所定の値を前記記憶部に格納される前記テーブルから読み出し、当該読み出した値を前記積算値に加算する管理部と、を備えるプログラム処理装置とした。【選択図】図５
2010092181.tif 000002
【特許請求の範囲】
【請求項１】
複数の関数を含むプログラムを実行するプログラム処理装置であって、
前記複数の関数と関数毎に異なる所定の値とを対応付けるテーブルを格納する記憶部と、
前記プログラム実行中に使用される積算値を格納し、前記プログラム実行中に一の関数が他の関数を呼び出したとき、当該他の関数に対応付けられた所定の値を前記記憶部に格納される前記テーブルから読み出し、当該読み出した値を前記積算値に加算する管理部と、
を備えるプログラム処理装置。
【請求項２】
前記管理部は、前記プログラム実行中に一の関数が他の関数を呼び出したとき、当該他の関数が複数回呼び出されている場合、当該他の関数に対応付けられた所定の値を前記記憶部に格納される前記テーブルから読み出し、当該読み出した値と呼び出された回数に応じた所定の定数との積を、前記積算値に加算する、
請求項１に記載のプログラム処理装置。
【請求項３】
複数の関数を含むプログラムであって、
コンピュータに、
前記プログラム実行中に使用される積算値を格納するステップと、
前記プログラム実行中に一の関数が他の関数を呼び出したとき、当該他の関数に対応付けられた所定の値を、前記複数の関数と関数毎に異なる所定の値とを対応付けるテーブルを格納する記憶部に格納される前記テーブルから読み出し、当該読み出した値を前記積算値に加算するステップと、
を実行させるプログラム。
【請求項４】
前記加算するステップは、前記プログラム実行中に一の関数が他の関数を呼び出したとき、当該他の関数が複数回呼び出されている場合、当該他の関数に対応付けられた所定の値を前記記憶部に格納される前記テーブルから読み出し、当該読み出した値と呼び出された回数に応じた所定の定数との積を、前記積算値に加算する、
請求項３に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本件は、プログラム処理装置及びプログラムに関する。
【背景技術】
【０００２】
近年のプログラム構造は、階層構造化が進んでいる。プログラム障害発生時の問題解析においては、各機能単位に選別された、いわゆる関数間のコール順序等時間軸に即した情報が有用である。
【０００３】
従来、この情報を採取するため、オンライントレースを起動し、各関数を呼び出す時に、関連情報を保存する様にしている。この場合、オンライントレース処理のため本来の処理能力の一部を消費し、プログラム実行時の効率を妨げる要因となっていた。
【０００４】
また、上記オンライントレースと同等の情報が、プログラム走行時の制御情報として、スタック域に残されるが、該領域は常に動的に変更されるため、現象発生時に採取対象とする範囲を採ることができないという問題があり、有効に利用されていなかった。
【特許文献１】特開平１−２２８０３１号公報
【特許文献２】特開平８−３２８９１２号公報
【特許文献３】特開２００１−３５６９０６号公報
【特許文献４】特開平８−６９３９０号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
プログラム実行の際、プログラムの各関数の呼び出しに関する情報を取得することを課題とする。
【課題を解決するための手段】
【０００６】
上記課題を解決するために、以下の手段を採用する。
【０００７】
即ち、第１の態様では、複数の関数を含むプログラムを実行するプログラム処理装置であって、前記複数の関数と関数毎に異なる所定の値とを対応付けるテーブルを格納する記憶部と、前記プログラム実行中に使用される積算値を格納し、前記プログラム実行中に一の関数が他の関数を呼び出したとき、当該他の関数に対応付けられた所定の値を前記記憶部に格納される前記テーブルから読み出し、当該読み出した値を前記積算値に加算する管理部と、を備えるプログラム処理装置を用いる。
【０００８】
また、第２の態様では、第１の態様の構成に加え、前記管理部は、前記プログラム実行中に一の関数が他の関数を呼び出したとき、当該他の関数が複数回呼び出されている場合、当該他の関数に対応付けられた所定の値を前記記憶部に格納される前記テーブルから読み出し、当該読み出した値と呼び出された回数に応じた所定の定数との積を、前記積算値に加算する、プログラム処理装置を用いる。
【発明の効果】
【０００９】
開示の実施形態によれば、プログラムの各関数の呼び出しに関する情報を取得することができる。
【発明を実施するための最良の形態】
【００１０】
以下、図面を参照して実施形態について説明する。実施形態の構成は例示であり、開示
の実施形態の構成に限定されない。
【００１１】
〔実施形態〕
コンピュータ等におけるプログラムの関数の実行ルートはスタック領域に保存される。そのため、プログラムの関数の実行ルートは次のように採取され得る。
【００１２】
（１）プログラムは基点から出発する。プログラムの各関数は、他の関数を呼び出す毎に、自関数で使用するスタックサイズを引数として、呼び出し先関数に伝達する。自関数で使用するスタックサイズは、自関数内で通常使用するスタックサイズを含み、他の関数を呼び出す場合に使用する最大スタックサイズである。
【００１３】
（２）呼び出し先関数は、呼び出し元関数のスタックサイズと自関数で使用するスタックサイズとを加算し、本値を読み出しスタックサイズとする。さらに、呼び出し先関数は、他の関数の呼び出し時に、当該本値を引数として受け渡しを行う。
【００１４】
（３）障害を検知した関数は、各呼び出し先関数による加算により現在まで積算されたスタック域サイズ分を、スタック領域の基点（基点のスタックサイズ域先頭）より読み出し、記憶装置に格納する。
【００１５】
図１は、ネスト型プログラムのプログラム呼び出し構造の例を示す図である。
【００１６】
図１の例では、プログラムは、関数Ａ、関数Ｂ、及び、関数Ｃを有する。関数Ａは関数Ｂを呼び出し、関数Ｂは関数Ｃを呼び出す。関数Ｃは演算結果を関数Ｂに返し、関数Ｂは演算結果を関数Ａに返す。
【００１７】
図２は、図１の例におけるスタック構造の例を示す図である。
【００１８】
図２の例では、関数Ａのスタック領域の上に関数Ｂのスタック領域が積まれ、関数Ｂのスタック領域の上に関数Ｃのスタック領域が積まれる。ここで、関数Ｃで障害を検知したとすると、関数Ａのスタック領域から関数Ｃのスタック領域までの情報を読み出して保存することにより、プログラムの走行ルートの割り出しが可能となる。
【００１９】
よって、図１のようなネスト型のプログラムの場合、スタック領域の読み出しにより、障害発生時にプログラムの走行ルートの割り出しができる。
【００２０】
図３は、並列型プログラムのプログラム呼び出し構造の例を示す図である。
【００２１】
図３の例では、プログラムは、関数Ａ、関数Ｂ、および、関数Ｃを有する。関数Ａは関数Ｂを呼び出し、関数Ｂは演算結果を関数Ａに返す。さらに、関数Ａは関数Ｃを呼び出し、関数Ｃは演算結果を関数Ａに返す。
【００２２】
図４は、図３の例におけるスタック構造の例を示す図である。
【００２３】
図４の例では、関数Ａのスタック領域の上に関数Ｂのスタック領域が積まれるが、関数Ａに戻った後、関数Ｃが呼び出される。よって、関数Ｂのスタック領域の一部または全部が、関数Ｃの情報によって上書きされる。このとき、関数Ｃで障害を検知したとすると、関数Ａのスタック領域から関数Ｃのスタック領域までの情報を読み出して保存しても、２度目の関数Ａから関数Ｃまでのプログラムの走行ルートの割り出しは可能であるが、１度目の関数Ａから関数Ｂを経由したプログラムの走行ルートの割り出しはできない。
【００２４】
よって、図３のような並列型のプログラムの場合、スタック領域の読み出しのみでは、障害発生時にプログラムの走行ルートの割り出しができない場合がある。
【００２５】
（構成例）
〈プログラム処理装置〉
図５は、本実施形態のプログラム処理装置の構成例を示す図である。
【００２６】
プログラム処理装置１０は、ＣＰＵ１００、記憶装置２００、通過回数カウンタ２２０、管理部４００、および、外部機構制御部５００を有する。プログラム処理装置は、コンピュータとして実現され得る。
【００２７】
これらの処理部のうち、任意の複数を、１つの処理部としてもよい。また、これらの処理部のうち任意の１つが、複数の処理部としての処理を行ってもよい。これらの各処理部は、ハードウェアとしても、ソフトウェアとしても実現され得る。以後に記載される構成要素についても同様である。
【００２８】
ＣＰＵ１００は、各機能部の制御、および、各種演算を行う。
【００２９】
記憶装置２００は、ＣＰＵ１００で実行されるプログラム等を格納し得る。記憶装置２００は、各関数がそれぞれ管理する関数毎の通過回数カウンタ２２０を有する。記憶装置２００は、コンピュータの内部メモリとして実現され得る。
【００３０】
通過回数カウンタ２２０は、関数毎に設けられる。各関数は、自関数に対して設けられた通過回数カウンタ２２０を、読み書きできる。通過回数カウンタ２２０は、一連の処理において、関数が他の関数を呼び出した回数を、呼び出した関数毎に記憶する。
【００３１】
管理部４００は、通過する各関数に割り当てられている値（関数値）を基に「プログラムの走行ルートを示す値」を算出する管理部である。即ち、プログラムの走行ルートを示す値は、これまでに通過した関数（コールされた関数、呼び出された関数）に割り当てられている値と、通過回数カウンタ２２０が示す当該関数が通過した回数（当該関数がコールされた回数、当該関数が呼び出された回数）とをパラメータとする所定の計算式で算出される値とすることができる。プログラムの走行ルートを示す値は、関数が他の関数を呼び出すときに、引数として、他の関数に渡される。他の関数からの戻り値には、プログラムの走行ルートを示す値が含まれる。
【００３２】
外部機構制御部５００は、プログラム処理装置が行う入出力（Input / Output）を制御する機構である。外部機構制御部５００には、キーボード、ディスプレイ等の各種Ｉ／Ｏ（Input / Output）装置等が接続され得る。
【００３３】
〈プログラム〉
図６は、プログラムの構成例を示す図である。
【００３４】
プログラム８００は、記憶装置２００又は他の記憶装置等に格納され得る。
【００３５】
本実施形態のプログラム８００は、少なくとも１つの基点関数８１０と、基点関数又は他の関数から呼び出される少なくとも１つの関数８２０（関数８２０−１乃至関数８２０−ｎ）を含む。
【００３６】
ＣＰＵ１００がプログラム８００を起動すると、基点関数８１０から実行される。基点関数８１０は、プログラム８００に従い、他の関数８２０を呼び出す。呼び出された他の
関数８２０は、プログラム８００に従い、さらに他の関数８２０を呼び出す、若しくは、基点関数８１０に演算結果等を返す。
【００３７】
各関数８２０のうち全部又は一部は、関数毎に異なる関数値が割り当てられる。呼び出し元の関数が、呼び出し先の関数（被呼び出し関数）の関数値を記憶している。関数値については、後に詳述する。関数値を割り当てられる関数は、あらかじめ選択され得る。
【００３８】
起点関数８１０及び関数８２０は、それぞれ、記憶装置２００の通過回数カウンタ２２０に、各関数が他の関数を呼び出した回数を、呼び出した関数毎に記憶させることが可能である。
【００３９】
〈管理部〉
図７は、管理部の構成例を示す図である。
【００４０】
管理部４００は、通過積算レジスタ４０２、通過積算レジスタコピー４０４、関数値レジスタ４０８、シフト定数レジスタ４１０、シフトレジスタ４１２、出力値バッファ４１４を有する。これらのレジスタの値は、記憶装置２００に格納されてもよい。
【００４１】
通過積算レジスタ４０２は、これまでに通過した関数の情報を示す値（プログラムの走行ルートを示す値）を格納する。
【００４２】
通過積算レジスタコピー４０４は、通過積算レジスタ４０２の値を入力され、その値を格納する。
【００４３】
関数値レジスタ４０８は、直前に通過した関数（直前に呼び出された関数）に割り当てられている関数値を格納する。
【００４４】
シフト定数レジスタ４１０は、各関数値の和に１を加算した値（以下、シフト定数ともいう）を格納する。シフト定数については、後に説明する。
【００４５】
シフトレジスタ４１２は、通過回数カウンタ２２０から当該関数がこれまでに通過した回数（当該関数が過去に呼び出された回数）を読み出す。この回数には、最後に呼び出された際の情報は、含まれない。シフトレジスタ４１２は、読み出した値とシフト定数とから算出されたシフトレジスタ値を格納する。読み出した値をＴとし、シフト定数をＳとすると、シフトレジスタ値は、次の式で求められる。
【００４６】
【数１】
2010092181.tif 000003
【００４７】
出力値バッファ４１４は、通過積算レジスタコピー４０４の値、関数値レジスタ４０８の値、及び、シフトレジスタ４１２の値を基に算出された値を格納する。出力値バッファ４１４は、格納された値を通過積算レジスタ４０２に入力する。
【００４８】
〈関数値〉
プログラム８００の各関数８２０には、それぞれ異なる値が割り当てられる。この異なる値を関数値と呼ぶ。関数値は、プログラム８００の走行ルートを割り出す目的で、使用される。ここで、プログラムの走行ルートとは、プログラムの実行時に、どの関数を、それぞれ何回通過したか（何回呼び出されたか）であり、プログラムの走行ルートを示す値
は、走行ルートに応じて変化する情報であり、例えば、走行ルートに応じて異なる値になるようにプログラムの走行ルートを示す値の算出がなされる。障害発生時のプログラムの走行ルートを割り出す場合において重要度が低い関数については、関数値を割り当てなくてもよい。プログラムの実行時に通過したことを知得したい関数のみに、関数値を割り当てるとすることもできる。
【００４９】
図８は、関数と割り当てられる関数値の例を示す図である。図８の例では、５つの関数に関数値を割り当てている。図８に示す関数と関数値との対応テーブルは、記憶装置２００に格納され得る。プログラム実行時等において、必要な関数値は、当該テーブルを参照することにより、取得され得る。また、他の関数を呼び出す関数が、それぞれ、呼び出す他の関数の関数値を記憶しておいてもよい。
【００５０】
図８の例では、関数値を割り当てられる関数８２０は、関数Ｆ１、関数Ｆ２、関数Ｆ３、関数Ｆ４、及び、関数Ｆ５の５つの関数である。これらの関数には、それぞれ、関数値として、１、２、４、８、及び、１６が割り当てられる。割り当てられる関数値は、２の累乗となる。関数値は、２の累乗の小さい方から順に各関数に割り当てられる。任意の異なる２つの関数８２０に、同一の関数値が割り当てられることはない。
【００５１】
また、このとき、管理部４００のシフト定数レジスタ４１０に格納されるシフト定数は、次のようになる。
【００５２】
【数２】
2010092181.tif 000004
【００５３】
シフト定数は、すべての関数値の和に＋１を加算したものである。
【００５４】
図９は、関数と割り当てられる関数値の例を示す図である。図９の例は、図８の例を一般化したものである。図９の例では、ｐ個（ｐは任意の自然数）の関数８２０に関数値を割り当てている。図９に示す関数と関数値との対応テーブルは、記憶装置２００に格納され得る。
【００５５】
図９の例では、関数値を割り当てられる関数８２０は、関数Ｆ１、・・・、関数Ｆｉ、・・・、関数Ｆｐのｐ個の関数である（ここで、ｉは１以上ｐ以下の整数とする）。これらの関数には、それぞれ、関数値として、１、・・・、２の（ｉ−１）乗、・・・、２の（ｐ−１）乗が、割り当てられる。割り当てられる関数値は、２の累乗となる。関数値は、２のｎ乗（ｎは０以上の整数）の小さい方から順に各関数に割り当てられる。異なる関数に同一の関数値が割り当てられることはない。
【００５６】
また、このとき、管理部４００のシフト定数レジスタ４１０に格納されるシフト定数は、次のようになる。
【００５７】
【数３】
2010092181.tif 000005
【００５８】
シフト定数は、すべての関数値の和に＋１を加算したものである。シフト定数は、関数
値が割り当てられる関数８２０の数がｐ個の場合、２のｐ乗となる。なお、関数値の設定は、これに限定されない。
【００５９】
（動作例）
〈全体の処理フロー〉
図１０及び図１１は、全体の処理フローの例を示す図である。図１０のＡ１及びＡ２は、それぞれ、図１１のＡ１及びＡ２と接続する。
【００６０】
ＣＰＵ１００は、記憶装置２００等に格納されたプログラム８００を実行する。
【００６１】
プログラムが起動されると、基点関数８１０は、基点関数８１０内の処理を行う（図１０：Ｓ１００２）。基点関数８１０は、開始スタックポインタを、記憶装置２００に保存する（Ｓ１００４）。また、基点関数８１０は、プログラムの走行ルートを示す値の算出に関する初期化を行う（Ｓ１００６）。プログラムの走行ルートを示す値の算出に関する初期化については、後に詳述する。基点関数８１０は、通過積算レジスタ４０２をクリアする（Ｓ１００８）。
【００６２】
基点関数８１０は、プログラムに従い、他の関数を呼び出す（Ｓ１０１０）。以下、呼び出された他の関数を、被呼び出し関数ともいう。このとき、基点関数８１０は、ステップＳ１００８でクリアされる前の通過積算レジスタ４０２の値を、引数の１つとして、被呼び出し関数に渡す。ステップＳ１００８でクリアされる前の通過積算レジスタ４０２の値は、現在までのプログラムの走行ルートを示す値である。また、基点関数８１０は、積算スタックサイズを、引数の１つとして渡す。これらの引数は、異常発生の原因究明等の際に使用される。被呼び出し関数における処理については、後に詳述する。積算スタックサイズは、基点関数８１０が、現在まで積算したスタック領域のサイズである。
【００６３】
被呼び出し関数による処理が終了すると、基点関数８１０は、被呼び出し関数から戻り値として、プログラムの走行ルートを示す値を渡される。当該プログラムの走行ルートを示す値は、走行ルートである被呼び出し関数及び被呼び出し関数から呼び出された関数等の情報を含む。基点関数８１０は、戻り値としてのプログラムの走行ルートを示す値を、通過積算レジスタ４０２に格納する（図１１：Ｓ１０１２）。
【００６４】
基点関数８１０は、管理部４００に、プログラムの走行ルートを示す値の更新を指示する（Ｓ１０１４）。管理部４００は、被呼び出し先関数を通過したことを示す情報を、プログラムの走行ルートを示す値に加える。例えば、被呼び出し関数が通過積算レジスタに設定した更新前のプログラムの走行ルートを示す値に、被呼び出し関数に対応する値を加算する（３回目の呼び出しの場合は、シフトレジスタの値の２乗に被呼び出し関数に対応する値を乗算した値を加算する）。
【００６５】
基点関数は、被呼び出し関数における処理において、エラーが発生したか否かを確認する（Ｓ１０１６）。エラーが発生した場合（Ｓ１０１６；ＹＥＳ）、基点関数８１０は、継続処理を含む後処理を行い（Ｓ１０２２）、異常終了する。このとき、プログラムの走行ルートを示す値には、ここまでのプログラム実行時に通過した関数と、その関数が通過した回数の情報とが、含まれる。
【００６６】
エラーが発生しなかった場合（Ｓ１０１６；ＮＯ）、基点関数８１０は、自関数内の処理を行う（Ｓ１０１８）。基点関数８１０は、自関数の処理が終わると、他の関数に対する呼び出しが終了したか否かを確認する（Ｓ１０２０）。他の関数に対する呼び出しが終了していない（他の関数に対する呼び出しがある）場合（Ｓ１０２０；ＮＯ）、ステップＳ１００８に戻る。他の関数に対する呼び出しが終了した（他の関数に対する呼び出しが
ない）場合（Ｓ１０２０；ＹＥＳ）、正常終了する。このとき、プログラムの走行ルートを示す値には、プログラム終了までに通過した関数と、その関数が通過した回数の情報とが、含まれる。
【００６７】
プログラムの走行ルートを示す値が記憶装置２００の所定の位置に格納され、各関数が当該記憶装置２００の所定の位置に格納されたプログラムの走行ルートを示す値に対して読み書きしてもよい。
【００６８】
〈プログラムの走行ルートを示す値の算出に関する初期化〉
図１２は、プログラムの走行ルートを示す値の算出に関する初期化のフローの例を示す図である。図１２のフローは、図１０及び図１１の全体処理フローのステップＳ１００８の処理に相当する。
【００６９】
管理部４００の初期化が開始されると、起点関数は、すべての関数について、通過回数カウンタ２２０が格納する値をリセットする（Ｓ２０２）。
【００７０】
起点関数は、管理部４００の通過積算レジスタ４０２が格納する値をリセットする（Ｓ２０４）。
【００７１】
基点関数８１０は、管理部４００のシフト定数レジスタ４１０の値（シフト定数）を算出する（Ｓ２０６）。シフト定数は、すべての関数値の和に＋１を加算したものとして、算出される。
【００７２】
以上により、プログラムの走行ルートを示す値の算出に関する初期化の処理は、終了する。
【００７３】
〈被呼び出し関数における処理〉
図１３及び図１４は、被呼び出し関数における処理のフローの例を示す図である。図１３のＢ１、Ｂ２、Ｂ３及びＢ４は、それぞれ、図１４のＢ１、Ｂ２、Ｂ３及びＢ４と接続する。
【００７４】
図１３及び図１４のフローは、図１０及び図１１の全体処理フローのステップＳ１０１０の処理に相当する。また、被呼び出し関数がさらに他の関数を呼び出した場合の、当該他の関数における処理のフローも、図１３及び図１４のフローと同様となる。
【００７５】
呼び出し元の関数（基点関数８１０等）から呼び出された被呼び出し関数は、引数に含まれるプログラムの走行ルートを示す値を取り出し、保存する（Ｓ３０２）。また、被呼び出し関数は、引数に含まれる積算スタックサイズを取り出し、保存する（Ｓ３０４）。被呼び出し関数は、管理部４００の通過積算レジスタ４０２に、取り出したプログラムの走行ルートを示す値を格納する（Ｓ３０６）。
【００７６】
被呼び出し関数は、自関数内の処理を行う（Ｓ３０８）。処理が終了すると、被呼び出し関数は、自関数内の処理が正常に終了したか否かを確認する（Ｓ３１０）。
【００７７】
正常に終了しなかった場合（Ｓ３１０；ＮＯ）、被呼び出し関数は、異常が発生したことを認識する。被呼び出し関数は、現在まで積算されたスタックサイズ（積算スタックサイズ）分、スタック領域を読み出し、記憶装置２００又は他の記憶装置に保存する（Ｓ３３０）。被呼び出し関数は処理を終了し、処理が呼び出し元の関数に復帰する。保存されたスタック領域には、各関数で呼び出された関数、引数等の情報が、保存されている。保存されたスタック領域は、プログラムの走行ルートを示す値とともに、異常発生の原因究
明等の際に使用される。
【００７８】
正常に終了した場合（Ｓ３１０；ＹＥＳ）、被呼び出し関数は、自関数から他の関数への呼び出しがあるか否かを確認する（Ｓ３１２）。
【００７９】
他の関数の呼び出しがある場合（Ｓ３１２；ＹＥＳ）は、被呼び出し関数は、通過積算レジスタ４０２をクリアする（Ｓ３１４）。
【００８０】
被呼び出し関数は、プログラムに従い、さらに他の関数を呼び出す（Ｓ３１６）。呼び出し元の関数である被呼び出し関数は、ステップＳ３１４でクリアされる前の通過積算レジスタ４０２の値を、引数として、呼び出される他の関数に渡す。また、被呼び出し関数は、積算スタックサイズを、引数として渡す。積算スタックサイズは、現在まで積算されたスタック領域のサイズである。呼び出される他の関数における処理は、本処理フローと同様である。
【００８１】
呼び出された他の関数による処理が終了すると、被呼び出し関数は、呼び出された他の関数から戻り値として、プログラムの走行ルートを示す値を渡される。被呼び出し関数は、戻り値としてのプログラムの走行ルートを示す値を、通過積算レジスタ４０２に格納する（図１４：Ｓ３１８）。
【００８２】
被呼び出し関数は、管理部４００に、プログラムの走行ルートを示す値の更新を指示する（Ｓ３２０）。管理部４００は、呼び出された他の関数を通過したことを示す情報を、プログラムの走行ルートを示す値に加える。プログラムの走行ルートを示す値の更新については、後に詳述する。
【００８３】
被呼び出し関数は、呼び出した他の関数における処理が正常に終了したか否かを確認する（Ｓ３２２）。呼び出した他の関数の処理が正常に終了した場合（Ｓ３２２；ＹＥＳ）、被呼び出し関数の処理が終了したか否かを確認する（Ｓ３２４）。被呼び出し関数の処理が終了した場合（Ｓ３２４；ＹＥＳ）、処理が呼び出し元の関数に復帰する。
【００８４】
被呼び出し関数の処理が終了していない場合（Ｓ３２４；ＮＯ）、ステップＳ３０８に戻り、被呼び出し関数の処理を続ける。
【００８５】
また、呼び出した他の関数における処理が正常に終了しなかった場合（Ｓ３２２；ＮＯ）、処理が呼び出し元の関数に復帰する。
【００８６】
被呼び出し関数は、呼び出し元の関数に復帰する際、通過積算レジスタ４０２に格納されるプログラムの走行ルートを示す値を戻り値に含ませる。
【００８７】
〈プログラムの走行ルートを示す値の更新〉
図１５は、プログラムの走行ルートを示す値の更新のフローの例を示す図である。
【００８８】
図１５のフローは、図１０及び図１１の全体処理フローのステップＳ１０１４の処理に相当する。また、図１５のフローは、図１３及び図１４の被呼び出し関数における処理のフローのステップＳ３２０の処理に相当する。
【００８９】
管理部４００は、呼び出した他の関数を通過した情報を、プログラムの走行ルートを示す値に、追加する。ここで、呼び出した他の関数とは、現在実行中の関数が直前に呼び出した他の関数のことである。
【００９０】
管理部４００は、呼び出した他の関数についての通過回数カウンタ２２０の値が０か否かを、確認する（Ｓ４０２）。呼び出した他の関数についての通過回数カウンタの値が０でない場合（Ｓ４０２；ＮＯ）、シフト定数レジスタ４１０の値が抽出される（Ｓ４０４）。呼び出した他の関数についての通過回数カウンタ２２０の値（Ｔ）とシフト定数レジスタの値（Ｓ）とからシフトレジスタ値が算出され、シフトレジスタ４１２に入力される（Ｓ４０６）。シフトレジスタ値は、ＳのＴ乗として求められる。
【００９１】
呼び出した他の関数についての通過回数カウンタ２２０の値が０である場合（Ｓ４０２；ＹＥＳ）、ステップＳ４０８に進む。
【００９２】
ステップＳ４０８では、呼び出した他の関数に割り当てられた値（以下、関数値ともいう）が、関数値レジスタ４０８に入力される（Ｓ４０８）。
【００９３】
管理部４００は、新たなプログラムの走行ルートを示す値を計算する（Ｓ４１０）。新たなプログラムの走行ルートを示す値は、関数値レジスタ４０８に格納された値にシフトレジスタ値を乗算した値と、通過積算レジスタコピー４０４に格納された値と、の和として算出される。
【００９４】
ステップＳ４０２で、呼び出した他の関数についての通過回数カウンタ２２０の値が０である場合、シフトレジスタ値が１であるとしてプログラムの走行ルートを示す値が計算される。つまり、このとき、新たなプログラムの走行ルートを示す値は、関数値レジスタ４０８に格納された値と、通過積算レジスタコピー４０４に格納された値と、の和として算出される。
【００９５】
算出された新たなプログラムの走行ルートを示す値は、出力バッファ４１４に格納される。出力バッファ４１４に格納された値は、通過積算レジスタ４０２に格納される（Ｓ４１２）。
【００９６】
呼び出した他の関数についての通過回数カウンタ２２０の値に、＋１が加算される（Ｓ４１４）。
【００９７】
以上により、プログラムの走行ルートを示す値の更新が終了する。
【００９８】
各関数が呼び出された回数の情報が不要である場合、第２回目以降の関数の呼び出しについては、プログラムの走行ルートを示す値に何も加算しないとすることも可能である。この構成は、例えば、通過回数カウンタが０以外であるときに、シフトレジスタ値を０にすることにより実現できる。
【００９９】
〈プログラムの走行ルートを示す値の具体例〉
プログラムの走行ルートを示す値の具体例について説明する。ここでは、プログラムにおける関数の関数値として、図８のように与えられているとする。即ち、関数Ｆ１に１、関数Ｆ２に２、関数Ｆ３に４、関数Ｆ４に８、関数Ｆ５に１６が、それぞれ割り当てられているとする。また、ここでのプログラムの他の関数には関数値は割り当てられていないとする。割り当てられた関数値は、１、２、４、８及び１６であるから、このプログラムにおけるシフト定数は、３２となる。プログラムの走行ルートを示す値の初期値は、０である。
【０１００】
１つの例として、プログラム実行時において、関数Ｆ２、関数Ｆ３及び関数Ｆ４が、この順に各１回ずつ、呼び出されたとする。すると、プログラムの走行ルートを示す値には、最初に関数Ｆ２の関数値である２が加算される。プログラムの走行ルートを示す値には
、次に、関数Ｆ３の関数値である４が加算される。最後に、プログラムの走行ルートを示す値には、関数Ｆ４の関数値である８が加算される。結局、この場合、プログラムの走行ルートを示す値は、２＋４＋８＝１４となる。
【０１０１】
図１６は、関数値が割り当てられた関数が５つ、各関数が呼び出された回数が１回以下の場合におけるプログラムの走行ルートを示す値の例を示す図である。
【０１０２】
図１６の左側が呼び出された関数を示し、図１６の右側がその場合のプログラムの走行ルートを示す値を示す。図１６に示すように、関数が５つ、各関数が呼び出された回数が１回以下の場合、関数が呼び出されるパターンは３１通りあるが、それぞれに固有のプログラムの走行ルートを示す値が算出される。したがって、プログラムの走行ルートを示す値から、一意に、呼び出された関数を特定することができる。
【０１０３】
例えば、プログラムの走行ルートを示す値が３０である場合、呼び出された関数は、関数Ｆ２、関数Ｆ３、関数Ｆ４及び関数Ｆ５である。関数が、２回以上呼び出された場合に加算される値は、関数が５つの場合、後述のように、３２以上となる。よって、プログラムの走行ルートを示す値が３０の場合は、上述の１通りだけとなる。
【０１０４】
別の例として、プログラム実行時において、関数Ｆ１が１回、関数Ｆ２が１回、関数Ｆ３が２回、この順に、それぞれ呼び出されたとする。すると、プログラムの走行ルートを示す値には、関数Ｆ１の関数値である１が加算される。また、プログラムの走行ルートを示す値には、関数Ｆ２の関数値である２が加算される。さらに、プログラムの走行ルートを示す値には、関数Ｆ３の関数値である４が加算される。最後に、プログラムの走行ルートを示す値には、関数Ｆ３の関数値である４にシフト定数である３２を乗算した１２８が加算される。結局、この場合、プログラムの走行ルートを示す値は、１＋２＋４＋４×３２＝１３５となる。関数Ｆ３の関数値にシフト定数が乗算されるのは、関数Ｆ３が呼び出されたのが２回目だからである。仮に３回目の呼び出しの場合は、関数値にシフト定数の２乗を乗算した値が加算される。一般にｎ回目の呼び出しの場合は、関数値にシフト定数の（ｎ−１）乗を乗算した値がプログラムの走行ルートを示す値に加算される。
【０１０５】
図１７は、関数と加算される値の例を示す図である。図１７の例では、関数値が割り当てられる関数が５つの例を示す。例えば、関数Ｆ５の第２回目の呼び出しの際には、プログラムの走行ルートを示す値に５１２が加算される。また、関数Ｆ４の第ｘ回目（ｘは自然数）の呼び出しの際には、２の（５（ｘ−１）＋３）乗の値がプログラムの走行ルートを示す値に加算される。
【０１０６】
図１８は、図１７の例を一般化した関数と加算される値の例を示す図である。図１８の例では、関数値が割り当てられる関数がｐ個（ｐは自然数）の例を示す。例えば、関数Ｆｉ（ｉは１以上ｐ以下の整数）の第２回目の呼び出しの際には、２の（ｐ＋ｉー１）乗の値がプログラムの走行ルートを示す値に加算される。また、関数Ｆｉの第ｊ回目（ｊは自然数）の呼び出しの際には、２の（（ｊ−１）ｐ＋ｉ―１）乗の値がプログラムの走行ルートを示す値に加算される。
【０１０７】
〈プログラムの走行ルートを示す値の解析〉
プログラムの走行ルートを示す値の値から呼び出された関数を特定する方法の例を説明する。プログラムの走行ルートを示す値の値から呼び出された関数を特定する方法は、ここで示す例に限定されず他の方法を採ることもできる。
【０１０８】
関数値が割り当てられた関数が５つの場合を例として説明する。関数名および割り当てられる関数値は、図８の例と同様であるとする。即ち、関数Ｆ１に１、関数Ｆ２に２、関
数Ｆ３に４、関数Ｆ４に８、関数Ｆ５に１６が、それぞれ割り当てられているとする。この例では、シフト定数は、３２となる。
【０１０９】
ここで、値Ｃ（ｊ）を定義する。Ｃ（ｊ）は、関数が第ｊ回目の呼び出しを受けたときに、関数値に乗算される値である（ｊは自然数）。従って、Ｃ（ｊ）は、次のように表される。
【０１１０】
【数４】
2010092181.tif 000006
【０１１１】
今、シフト定数は３２であるから、Ｃ（ｊ）は、３２の（ｊ−１）乗となる。
【０１１２】
また、解析するプログラムの走行ルートを示す値をＲ（０）とし、関数値をＫ（＝１，２，４，８又は１６）とする。
【０１１３】
このとき、次の式を満たすｊ及びＫを求める。
【０１１４】
【数５】
2010092181.tif 000007
【０１１５】
ここで、上記の不等式を満たすＣ（ｊ）×Ｋは、プログラムの走行ルートを示す値に含まれる、加算された値のうちの最大値となる。
【０１１６】
Ｒ（０）が上記の不等式を満たすときの関数値Ｋ及びｊを記録し、Ｒ（１）＝Ｒ（０）−Ｃ（ｊ）×Ｋとして、次の式を満たすｊ及びＫを求めて記録する。
【０１１７】
【数６】
2010092181.tif 000008
【０１１８】
以下、Ｒ（ｘ）＝Ｒ（ｘ−１）−Ｃ（ｊ）×Ｋとして、Ｒ（ｘ）が０になるまで、同様に、繰り返し、すべてのＫとｊとの組み合わせを求める。すべてのＫとｊとの組み合わせを求めることにより、どの関数が何回呼び出されたかを知ることができる。
【０１１９】
例えば、プログラムの走行ルートを示す値が１８１の場合は、次のようにＫとｊとの組み合わせを求めることができる。
【０１２０】
Ｒ（０）＝１８１、
Ｃ（２）×４＝１２８≦１８１＜２×Ｃ（２）×４＝２５６
であるから、Ｋ＝４、ｊ＝２となる。さらに、
Ｒ（１）＝１８１−１２８＝５３、
Ｃ（２）×１＝３２≦５３＜２×Ｃ（２）×１＝６４
であるから、Ｋ＝１、ｊ＝２となる。さらに、
Ｒ（２）＝５３−３２＝２１、
Ｃ（１）×１６＝１６≦２１＜２×Ｃ（１）×１６＝３２
であるから、Ｋ＝１６、ｊ＝１となる。さらに、
Ｒ（３）＝２１−１６＝５、
Ｃ（１）×４＝４≦５＜２×Ｃ（１）×４＝８
であるから、Ｋ＝４、ｊ＝１となる。さらに、
Ｒ（４）＝５−４＝１、
Ｃ（１）×１＝１≦１≦２×Ｃ（１）×１＝２
であるから、Ｋ＝１、ｊ＝１となる。
【０１２１】
ここで、Ｒ（５）＝１−１＝０となるから、ここで終了する。
【０１２２】
このプログラムの走行ルートを示す値から求められた（Ｋ，ｊ）の組み合わせは、（４，２）、（１，２）、（１６，１）、（４，１）、（１，１）である。また、関数値１に対応する関数は関数Ｆ１、関数値４に対応する関数は関数Ｆ３、関数値１６に対応する関数は関数Ｆ５である。よって、（Ｋ，ｊ）の各組み合わせは、それぞれ、関数Ｆ３の第２回目、関数Ｆ１の第２回目、関数Ｆ５の第１回目、関数Ｆ３の第１回目、関数Ｆ１の第１回目、の各呼び出しを示している。従って、プログラムの走行ルートを示す値が１８１である場合、関数Ｆ１が２回、関数Ｆ３が２回、関数Ｆ５が１回、呼び出されたことが分かる。
【０１２３】
（実施形態の作用、効果）
本実施形態の構成によると、プログラムの各関数に固有の関数値を割り当て、プログラム実行時に、関数の呼び出し毎に所定の関数値を積算することができる。関数の呼び出し毎に所定の関数値を積算することで、プログラム実行時の負荷を増大させることなく、プログラムの走行履歴を記録することができる。プログラム実行時に障害が発生した際、積算された関数値（プログラムの走行ルートを示す値）を解析することで、プログラムの走行履歴（通過した関数と、その回数）を取得することができる。
【０１２４】
本実施形態によれば、スタック型プログラム、並列型プログラムによらず、プログラム実行時における障害発生時にプログラムの動作の解析を容易に行うことができる。
【０１２５】
〔コンピュータ読み取り可能な記録媒体〕
コンピュータその他の機械、装置（以下、コンピュータ等）に上記いずれかの機能を実現させるプログラムをコンピュータ等が読み取り可能な記録媒体に記録することができる。そして、コンピュータ等に、この記録媒体のプログラムを読み込ませて実行させることにより、その機能を提供させることができる。
【０１２６】
ここで、コンピュータ等が読み取り可能な記録媒体とは、データやプログラム等の情報を電気的、磁気的、光学的、機械的、または化学的作用によって蓄積し、コンピュータ等から読み取ることができる記録媒体をいう。このような媒体内には、ＣＰＵ、メモリ等のコンピュータを構成する要素を設け、そのＣＰＵにプログラムを実行させてもよい。
【０１２７】
また、このような記録媒体のうちコンピュータ等から取り外し可能なものとしては、例えば、フレキシブルディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ＣＤ−Ｒ／Ｗ、ＤＶＤ、ＤＡＴ、８ｍｍテープ、メモリカード等がある。
【０１２８】
また、コンピュータ等に固定された記録媒体としてハードディスクやＲＯＭ等がある。
【図面の簡単な説明】
【０１２９】
【図１】図１は、ネスト型プログラムのプログラム呼び出し構造の例を示す図である。
【図２】図２は、図１の例におけるスタック構造の例を示す図である。
【図３】図３は、並列型プログラムのプログラム呼び出し構造の例を示す図である。
【図４】図４は、図３の例におけるスタック構造の例を示す図である。
【図５】図５は、本実施形態のプログラム処理装置の構成例を示す図である。
【図６】図６は、プログラムの構成例を示す図である。
【図７】図７は、管理部の構成例を示す図である。
【図８】図８は、関数と割り当てられる関数値の例を示す図である。
【図９】図９は、関数と割り当てられる関数値の例を示す図である。
【図１０】図１０は、全体の処理フローの例（１）を示す図である。
【図１１】図１１は、全体の処理フローの例（２）を示す図である。
【図１２】図１２は、プログラムの走行ルートを示す値の算出に関する初期化のフローの例を示す図である。
【図１３】図１３は、被呼び出し関数における処理のフローの例（１）を示す図である。
【図１４】図１４は、被呼び出し関数における処理のフローの例（２）を示す図である。
【図１５】図１５は、プログラムの走行ルートを示す値の更新のフローの例を示す図である。
【図１６】図１６は、プログラムの走行ルートを示す値の具体例を示す図である。
【図１７】図１７は、関数と加算される値の例を示す図である。
【図１８】図１８は、関数と加算される値の例を示す図である。
【符号の説明】
【０１３０】
１０          プログラム処理装置
１００          ＣＰＵ
２００          記憶装置
２２０            通過回数カウンタ
４００          管理部
４０２            通過積算レジスタ
４０４            通過積算レジスタコピー
４０８            関数値レジスタ
４１０            シフト定数レジスタ
４１２            シフトレジスタ
４１４            出力値バッファ
５００          外部機構制御装置
８００          プログラム
８１０            基点関数
８２０            関数
８２０−ｎ        関数（ｎは自然数）
【図１】
2010092181.tif 000009
【図２】
2010092181.tif 000010
【図３】
2010092181.tif 000011
【図４】
2010092181.tif 000012
【図５】
2010092181.tif 000013
【図６】
2010092181.tif 000014
【図７】
2010092181.tif 000015
【図８】
2010092181.tif 000016
【図９】
2010092181.tif 000017
【図１０】
2010092181.tif 000018
【図１１】
2010092181.tif 000019
【図１２】
2010092181.tif 000020
【図１３】
2010092181.tif 000021
【図１４】
2010092181.tif 000022
【図１５】
2010092181.tif 000023
【図１６】
2010092181.tif 000024
【図１７】
2010092181.tif 000025
【図１８】
2010092181.tif 000026