(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-12-09
(45)【発行日】2024-12-17
(54)【発明の名称】情報処理装置、情報処理方法、及びプログラム
(51)【国際特許分類】
G06F 11/34 20060101AFI20241210BHJP
【FI】
G06F11/34 176
(21)【出願番号】P 2021080728
(22)【出願日】2021-05-12
【審査請求日】2024-02-08
(73)【特許権者】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110004185
【氏名又は名称】インフォート弁理士法人
(74)【代理人】
【識別番号】100121083
【氏名又は名称】青木 宏義
(74)【代理人】
【識別番号】100138391
【氏名又は名称】天田 昌行
(74)【代理人】
【識別番号】100074099
【氏名又は名称】大菅 義之
(72)【発明者】
【氏名】菊嶋 薫
(72)【発明者】
【氏名】照屋 寛嗣
(72)【発明者】
【氏名】坂本 英人
(72)【発明者】
【氏名】山田 昇
【審査官】今川 悟
(56)【参考文献】
【文献】特開2001-356906(JP,A)
【文献】特開平06-067942(JP,A)
【文献】特開平04-096148(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 11/34
(57)【特許請求の範囲】
【請求項1】
プログラムの実行中に複数の関数を呼び出す呼び出し元の実行情報が記録された呼び出し元記憶領域を含む記憶部と、
前記複数の関数のうち第1関数が前記呼び出し元から呼び出されたとき、前記記憶部内に複数の記憶領域を確保して、前記複数の記憶領域のうち第1記憶領域に、前記呼び出し元記憶領域の位置を示す呼び出し元情報と前記第1関数の実行情報とを記録し、前記複数の関数のうち第2関数が前記呼び出し元から呼び出されたとき、前記複数の記憶領域のうち第2記憶領域に、前記呼び出し元情報と前記第2関数の実行情報とを記録する記録部と、
を備えることを特徴とする情報処理装置。
【請求項2】
前記記録部は、前記第1関数が呼び出されたとき、前記呼び出し元記憶領域に前記第1記憶領域を示す第1情報を記録し、前記第2関数が呼び出されたとき、前記呼び出し元記憶領域に前記第2記憶領域を示す第2情報を記録することを特徴とする請求項1記載の情報処理装置。
【請求項3】
前記第1情報は、前記記憶部内における前記複数の記憶領域の位置を示す位置情報と、前記複数の記憶領域のうち1番目の記憶領域を示す第1カウンタ情報とを含み、
前記第2情報は、前記位置情報と、前記複数の記憶領域のうち2番目の記憶領域を示す第2カウンタ情報とを含み、
前記記録部は、前記第2関数が呼び出されたとき、前記第1カウンタ情報を前記第2カウンタ情報に変更することで、前記第1情報を前記第2情報に変更することを特徴とする請求項2記載の情報処理装置。
【請求項4】
前記記録部は、前記第1関数の実行が終了したとき、前記第1記憶領域から前記呼び出し元情報を取得し、前記第2関数が呼び出されたとき、取得された前記呼び出し元情報に基づいて、前記呼び出し元記憶領域から前記第1情報を取得し、取得された前記第1情報に基づいて、前記第2記憶領域の位置を求めることを特徴とする請求項2又は3記載の情報処理装置。
【請求項5】
前記記録部は、別の複数の関数のうち第3関数が前記第1関数から呼び出されたとき、前記記憶部内に別の複数の記憶領域を確保して、前記別の複数の記憶領域のうち第3記憶領域に、前記第1記憶領域の位置を示す情報と前記第3関数の実行情報とを記録し、前記別の複数の関数のうち第4関数が前記第1関数から呼び出されたとき、前記別の複数の記憶領域のうち第4記憶領域に、前記第1記憶領域の位置を示す情報と前記第4関数の実行情報とを記録することを特徴とする請求項1乃至4の何れか1項に記載の情報処理装置。
【請求項6】
プログラムの実行中に複数の関数を呼び出す呼び出し元から、前記複数の関数のうち第1関数が呼び出されたとき、記憶部内に複数の記憶領域を確保し、
前記複数の記憶領域のうち第1記憶領域に、前記呼び出し元の実行情報が記録されている、前記記憶部内の呼び出し元記憶領域を示す呼び出し元情報と、前記第1関数の実行情報とを記録し、
前記複数の関数のうち第2関数が前記呼び出し元から呼び出されたとき、前記複数の記憶領域のうち第2記憶領域に、前記呼び出し元情報と前記第2関数の実行情報とを記録する、
処理をコンピュータが実行することを特徴とする情報処理方法。
【請求項7】
プログラムの実行中に複数の関数を呼び出す呼び出し元から、前記複数の関数のうち第1関数が呼び出されたとき、記憶部内に複数の記憶領域を確保し、
前記複数の記憶領域のうち第1記憶領域に、前記呼び出し元の実行情報が記録されている、前記記憶部内の呼び出し元記憶領域を示す呼び出し元情報と、前記第1関数の実行情報とを記録し、
前記複数の関数のうち第2関数が前記呼び出し元から呼び出されたとき、前記複数の記憶領域のうち第2記憶領域に、前記呼び出し元情報と前記第2関数の実行情報とを記録する、
処理をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、情報処理に関する。
【背景技術】
【0002】
情報処理装置(コンピュータ)のプロセッサがプログラムを実行する際、関数から別の関数が呼び出される度に、呼び出された関数の実行情報が、スタックと呼ばれるメモリ内の記憶領域に格納される。関数の実行情報は、プログラムカウンタ、引数(パラメータ)、及び作業用変数を含む。関数は、サブルーチンと呼ばれることもある。
【0003】
プログラムカウンタ及び作業用変数は、呼び出された関数の処理が終了した後、呼び出し元の関数の処理を再開する際に用いられる。呼び出し元の関数が持っているデータを呼び出された関数が使用する場合、引数を用いてデータの受け渡しが行われる。
【0004】
プログラムの実行中に、プロセッサがデータの矛盾等の異常を検出し、処理の続行が不可能と判断してプログラムの実行を終了した場合、スタックに格納されている実行情報がコアダンプファイルに書き込まれる。コアダンプファイルは、異常の原因を調査する際に参照される。
【0005】
スタックに関連して、プログラムで異常が検出された場合にスタックの情報を残し、解析をスムーズに実施するスタック管理方式が知られている(例えば、特許文献1を参照)。低コストでデバッグに必要な情報をトレースできるデバッグ装置も知られている(例えば、特許文献2を参照)。
【0006】
障害発生に係るエラー情報を容易に収集することができ、リリース後の障害状況を、迅速に且つ確実に開発元に認知させ、速やかに改訂及び修正作業に反映させる障害解析システムも知られている(例えば、特許文献3を参照)。コンピューティング環境内でトランザクション実行を制御する方法も知られている(例えば、特許文献4を参照)。
【先行技術文献】
【特許文献】
【0007】
【文献】特開2001-356906号公報
【文献】特開2011-2934号公報
【文献】特開平11-288379号公報
【文献】特表2015-526787号公報
【発明の概要】
【発明が解決しようとする課題】
【0008】
従来の情報処理装置では、異常の原因を調査するために有用となる関数の実行情報がスタックに格納された後、他の関数の実行情報によって上書きされてしまうことがある。この場合、プロセッサが異常を検出してプログラムの実行を終了したときに、有用な実行情報がスタックに残されていないため、異常の原因を特定することが困難になる。
【0009】
なお、かかる問題は、スタックに関数の実行情報を記録する場合に限らず、様々な記憶領域に関数の実行情報を記録する場合において生ずるものである。
【0010】
1つの側面において、本発明は、プログラムの実行中に呼び出される関数の実行情報を適切に記録することを目的とする。
【課題を解決するための手段】
【0011】
1つの案では、情報処理装置は、記憶部及び記録部を含む。記憶部は、プログラムの実行中に複数の関数を呼び出す呼び出し元の実行情報が記録された、呼び出し元記憶領域を含む。
【0012】
記録部は、複数の関数のうち第1関数が呼び出し元から呼び出されたとき、記憶部内に複数の記憶領域を確保して、複数の記憶領域のうち第1記憶領域に、呼び出し元記憶領域の位置を示す呼び出し元情報と、第1関数の実行情報とを記録する。記録部は、複数の関数のうち第2関数が呼び出し元から呼び出されたとき、複数の記憶領域のうち第2記憶領域に、呼び出し元情報と、第2関数の実行情報とを記録する。
【発明の効果】
【0013】
1つの側面によれば、プログラムの実行中に呼び出される関数の実行情報を適切に記録することができる。
【図面の簡単な説明】
【0014】
【
図5】情報処理装置の具体例を示す機能的構成図である。
【
図7】仮想化システムにおける関数の呼び出し及び復帰を示す図である。
【
図9A】時刻T1における記憶領域の状態を示す図である。
【
図9B】時刻T2における記憶領域の状態を示す図である。
【
図9C】時刻T3における記憶領域の状態を示す図である。
【
図9D】時刻T4における記憶領域の状態を示す図である。
【
図9E】時刻T5における記憶領域の状態を示す図である。
【
図9F】時刻T6における記憶領域の状態を示す図である。
【
図9G】時刻T7における記憶領域の状態を示す図である。
【
図9H】時刻T8における記憶領域の状態を示す図である。
【
図12】情報処理装置のハードウェア構成図である。
【発明を実施するための形態】
【0015】
以下、図面を参照しながら、実施形態を詳細に説明する。
【0016】
図1は、プログラムの実行中における関数の呼び出しの例を示している。まず、時刻T1において、プロセッサは、プログラムのメイン関数である関数Aを実行する。次に、時刻T2において、関数Aから関数B1が呼び出され、関数B1が実行される。
【0017】
次に、時刻T3において、関数B1から関数C1が呼び出され、関数C1が実行される。しかし、関数C1のバグによる処理の不具合の影響で、データに異常が発生する。次に、時刻T4において、プロセッサは、関数C1の処理を終了し、呼び出し元である関数B1の処理に復帰する。
【0018】
次に、時刻T5において、関数B1から関数C2が呼び出され、関数C2が実行される。次に、時刻T6において、プロセッサは、関数C2の処理を終了し、呼び出し元である関数B1の処理に復帰する。
【0019】
次に、時刻T7において、プロセッサは、関数B1の処理を終了し、呼び出し元である関数Aの処理に復帰する。次に、時刻T8において、関数Aから関数B2が呼び出され、関数B2が実行される。関数B2の処理において、プロセッサは、関数C1の処理におけるデータの矛盾を異常として検出し、処理の続行が不可能と判断する。そこで、プロセッサは、プログラムの実行を終了して、コアダンプファイルを生成する。
【0020】
図2は、
図1のプログラムの実行中における比較例のスタックの状態の例を示している。スタック201-1は、1番目のスタックであり、スタック201-2は、2番目のスタックであり、スタック201-3は、3番目のスタックであり、スタック201-4は、4番目のスタックである。スタック201-1~スタック201-4は、プログラムの開始時に割り当てられ、各スタックのサイズは一定値である。
【0021】
スタックポインタspは、呼び出された関数の実行情報を記録するためのスタックの位置を示す。スタックポインタspは、関数の呼び出しによりスタックのサイズ分だけ下方へ進み、呼び出し元への復帰により、スタックのサイズ分だけ上方へ戻る。
【0022】
まず、時刻T1において、スタック201-1に関数Aの実行情報が記録され、スタックポインタspは、スタック201-2の位置を指す。次に、時刻T2において、スタック201-2に関数B1の実行情報が記録され、スタックポインタspは、スタック201-3の位置を指す。
【0023】
次に、時刻T3において、スタック201-3に関数C1の実行情報が記録され、スタックポインタspは、スタック201-4の位置を指す。次に、時刻T4において、プロセッサは、関数B1の処理に復帰し、スタックポインタspは、スタック201-3の位置に戻る。
【0024】
次に、時刻T5において、スタック201-3に関数C2の実行情報が上書きされ、スタックポインタspは、スタック201-4の位置を指す。次に、時刻T6において、プロセッサは、関数B1の処理に復帰し、スタックポインタspは、スタック201-3の位置に戻る。
【0025】
次に、時刻T7において、プロセッサは、関数Aの処理に復帰し、スタックポインタspは、スタック201-2の位置に戻る。次に、時刻T8において、スタック201-2に関数B2の実行情報が上書きされ、スタックポインタspは、スタック201-3の位置を指す。
【0026】
この場合、異常の原因を調査するためには、時刻T3においてスタック201-3に記録された関数C1の実行情報が有用である。しかしながら、時刻T5においてスタック201-3に関数C2の実行情報が上書きされているため、時刻T8において問題が表面化したときには、スタック201-3に関数C1の実行情報が残っていない。したがって、異常の原因を特定することが困難になる。
【0027】
スタック201-1~スタック201-4はプログラムの開始時に割り当てられているため、これらのスタックを使い切った場合、プロセッサは、エラーを検出して、プログラムの実行を終了する。
【0028】
図3は、実施形態の情報処理装置の機能的構成例を示している。
図3の情報処理装置301は、記憶部311及び記録部312を含む。記憶部311は、プログラムの実行中に複数の関数を呼び出す呼び出し元の実行情報が記録された、呼び出し元記憶領域を含む。
【0029】
図4は、
図3の記録部312が行う記録処理の例を示すフローチャートである。まず、記録部312は、複数の関数のうち第1関数が呼び出し元から呼び出されたとき、記憶部311内に複数の記憶領域を確保する(ステップ401)。
【0030】
次に、記録部312は、複数の記憶領域のうち第1記憶領域に、呼び出し元記憶領域の位置を示す呼び出し元情報と、第1関数の実行情報とを記録する(ステップ402)。次に、記録部312は、複数の関数のうち第2関数が呼び出し元から呼び出されたとき、複数の記憶領域のうち第2記憶領域に、呼び出し元情報と、第2関数の実行情報とを記録する(ステップ403)。
【0031】
図3の情報処理装置301によれば、プログラムの実行中に呼び出される関数の実行情報を適切に記録することができる。
【0032】
図5は、
図3の情報処理装置301の具体例を示している。
図5の情報処理装置501は、記憶部511、実行部512、及び記録部513を含む。記憶部511は、プログラム521を記憶する。記憶部511及び記録部513は、
図3の記憶部311及び記録部312にそれぞれ対応する。
【0033】
実行部512は、プログラム521を実行し、記録部513は、プログラム521の実行中に呼び出された関数の実行情報を、記憶部511に記録する。
【0034】
図6は、
図5の情報処理装置501に対応する仮想化システムの例を示している。情報処理装置501のハードウェア606上でハイパーバイザ605が動作し、ハイパーバイザ605上で仮想化ソフトウェア604が動作する。仮想化ソフトウェア604上で、オペレーティングシステム(Operating System,OS)603-1及びOS603-2が動作する。
【0035】
ハードウェア606は、
図5の記憶部511、実行部512、及び記録部513に対応する。ハイパーバイザ605及び仮想化ソフトウェア604は、仮想マシンを実現するための制御プログラムである。ハイパーバイザ605は、プロセッサの動作をエミュレートする。
【0036】
OS603-1上で、アプリケーション601-1及びアプリケーション601-2が動作し、OS603-2上で、アプリケーション602-1及びアプリケーション602-2が動作する。アプリケーション601-1、アプリケーション601-2、アプリケーション602-1、及びアプリケーション602-2は、アプリケーションプログラムであり、
図5のプログラム521に対応する。
【0037】
実行部512は、仮想マシン上で、アプリケーション601-1、アプリケーション601-2、アプリケーション602-1、及びアプリケーション602-2を実行する。
【0038】
図7は、
図6の仮想化システムにおける関数の呼び出し及び復帰の例を示している。
図5の記録部513は、アプリケーション601-1が関数の呼び出し701を実行したとき、又はOS603-1が関数の呼び出し702を実行したとき、ハイパーバイザ605の処理の一部である呼び出し処理703を行う。また、記録部513は、アプリケーション601-1が関数の復帰704を実行したとき、又はOS603-1が関数の復帰705を実行したとき、ハイパーバイザ605の処理の一部である復帰処理706を行う。
【0039】
アプリケーション601-2、アプリケーション602-1、アプリケーション602-2、又はOS603-2が関数の呼び出しを実行したときも、呼び出し処理703が行われる。アプリケーション601-2、アプリケーション602-1、アプリケーション602-2、又はOS603-2が関数の復帰を実行したときも、復帰処理706が行われる。
【0040】
記録部513は、呼び出し処理703において、呼び出された関数の実行情報を記録するための記憶部511内の記憶領域のアドレスを決定する。記憶領域のアドレスは、記憶領域の位置を示す情報の一例である。例えば、プログラム521内の特定の関数から呼び出される複数の関数のうち、1番目の関数が呼び出されたとき、記録部513は、複数の関数のための実行情報領域を記憶部511内で確保する。
【0041】
実行情報領域は、関数の実行情報を記録する記憶領域をN個配置できる記憶領域である。Nは、2以上の整数である。Nは、プログラム521の規模又は複雑さ、記憶部511の記憶容量等に基づいて決定され、制御パラメータとして設定される。
【0042】
図8は、実行情報領域内に配置される各関数の記憶領域の例を示している。
図8の記憶領域は、関数の実行情報、R、C、及びSを含む。関数の実行情報は、プログラムカウンタ、引数(パラメータ)、及び作業用変数を含む。R、C、及びSは、記憶領域の管理とプログラム521の動作の制御を行うための制御情報である。
【0043】
Rは、呼び出し元の関数の実行情報が記録されている呼び出し元記憶領域のアドレスを表す。Cは、実行情報領域内のN個の記憶領域のうち、
図8の記憶領域の順位を示すカウンタであり、Sは、記憶部511内における実行情報領域のアドレスを表す。
【0044】
Rは、呼び出し元情報の一例であり、Cは、第1カウンタ情報及び第2カウンタ情報の一例である。Sとしては、例えば、N個の記憶領域のうち1番目の記憶領域のアドレスが用いられる。呼び出し元記憶領域も、
図8の記憶領域と同様に、関数の実行情報、R、C、及びSを含む。
【0045】
記録部513は、確保された実行情報領域内にN個の記憶領域を配置し、呼び出し元記憶領域のSとして、実行情報領域のアドレスを記録し、呼び出し元記憶領域のCとして1を記録する。そして、記録部513は、1番目の記憶領域のRとして、呼び出し元記憶領域のアドレスを記録し、1番目の記憶領域に1番目の関数の実行情報を記録する。
【0046】
1番目の関数の実行が終了したとき、記録部513は、1番目の記憶領域からRを取得する。プログラム521内の特定の関数から呼び出される複数の関数のうち、2番目の関数が呼び出されたとき、記録部513は、取得されたRに基づいて、呼び出し元記憶領域からC及びSを取得する。そして、記録部513は、Cを1だけインクリメントすることで、呼び出し元記憶領域のCを更新する。呼び出し元記憶領域のSは変更されない。
【0047】
呼び出し元記憶領域から取得されたC及びSは、第1情報の一例であり、更新後のCと変更されていないSは、第2情報の一例である。記録部513は、Cを更新することで、第1情報を第2情報に変更する。
【0048】
次に、記録部513は、更新後のCを用いて、2番目の記憶領域のアドレスaddを求める。記録部513は、例えば、記憶領域のサイズXを用いて、次式によりアドレスaddを計算する。
【0049】
add=S+X(C-1) (1)
【0050】
式(1)によりアドレスaddを計算することで、2番目の記憶領域が特定される。そこで、記録部513は、アドレスaddが示す2番目の記憶領域のRとして、呼び出し元記憶領域のアドレスを記録し、2番目の記憶領域に2番目の関数の実行情報を記録する。
【0051】
3番目以降の関数が呼び出されたときも、2番目の関数が呼び出されたときと同様にして、呼び出し元記憶領域のCが更新され、3番目以降の記憶領域に3番目以降の関数の実行情報が記録される。C=Nの場合、Cを1だけインクリメントした結果は1となり、N+1番目以降の関数の実行情報は、再び1番目以降の記憶領域に順番に記録される。これにより、1番目の関数が呼び出されたときに確保されたN個の記憶領域が、サイクリックに使用される。
【0052】
このように、呼び出し元記憶領域にC及びSを記録しておくことで、呼び出された関数の実行が終了したときに、記録部513は、C及びSを用いて、呼び出し元から次に呼び出される関数の記憶領域のアドレスを求めることができる。また、呼び出された関数の記憶領域にRを記録しておくことで、その関数の実行が終了したときに、記録部513は、Rを用いて、呼び出し元記憶領域からC及びSを取得することができる。
【0053】
呼び出された関数の実行が終了して次の関数が呼び出されたとき、記録部513は、呼び出し元記憶領域のCを更新するだけで、次の関数の記憶領域を示す情報を生成することができる。
【0054】
【0055】
ポインタpは、関数の実行情報を記録するための記憶部511内の記憶領域のアドレスを示す。この例では、N=4であり、各実行情報領域内に4個の記憶領域が配置される。各記憶領域のR、C、及びSには、初期値としてNULLが設定される。
【0056】
図9Aは、時刻T1における記憶領域の状態の例を示している。時刻T1において、実行部512は、関数Aを実行する。記録部513は、記憶領域901を関数Aに割り当て、ポインタpに記憶領域901のアドレスを設定し、記憶領域901に関数Aの実行情報を記録する。記憶領域901のS=NULLは、関数Aから何れの関数も呼び出されていないことを示す。
【0057】
図9Bは、時刻T2における記憶領域の状態の例を示している。時刻T2において、関数Aは、関数B1を呼び出す。記録部513は、
図9Aのポインタpが指す呼び出し元の記憶領域901からC及びSを取得する。
【0058】
この場合、S=NULLであるため、関数B1は関数Aから呼び出された1番目の関数であることが分かる。そこで、記録部513は、記憶領域902-1~記憶領域902-4を含む実行情報領域を確保する。
【0059】
次に、記録部513は、
図9Aのポインタpが指す呼び出し元の記憶領域901のSに、実行情報領域のアドレスを設定し、記憶領域901のCに1を設定する。C=1は、記憶領域902-1が実行情報領域内の1番目の記憶領域であることを示す。
【0060】
次に、記録部513は、式(1)により、記憶領域902-1のアドレスaddを計算し、記憶領域902-1を関数B1に割り当てる。この場合、C=1であるため、add=Sとなる。
【0061】
次に、記録部513は、記憶領域902-1のRに
図9Aのポインタpのアドレスを設定し、ポインタpに記憶領域902-1のアドレスを設定し、記憶領域902-1に関数B1の実行情報を記録する。記憶領域902-2~記憶領域902-4は、未使用である。
【0062】
図9Cは、時刻T3における記憶領域の状態の例を示している。時刻T3において、関数B1は、関数C1を呼び出す。記録部513は、
図9Bのポインタpが指す呼び出し元の記憶領域902-1からC及びSを取得する。
【0063】
この場合、S=NULLであるため、関数C1は関数B1から呼び出された1番目の関数であることが分かる。そこで、記録部513は、記憶領域903-1~記憶領域903-4を含む実行情報領域を確保する。
【0064】
次に、記録部513は、
図9Bのポインタpが指す呼び出し元の記憶領域902-1のSに、実行情報領域のアドレスを設定し、記憶領域902-1のCに1を設定する。C=1は、記憶領域903-1が実行情報領域内の1番目の記憶領域であることを示す。
【0065】
次に、記録部513は、式(1)により、記憶領域903-1のアドレスaddを計算し、記憶領域903-1を関数C1に割り当てる。この場合、C=1であるため、add=Sとなる。
【0066】
次に、記録部513は、記憶領域903-1のRに
図9Bのポインタpのアドレスを設定し、ポインタpに記憶領域903-1のアドレスを設定し、記憶領域903-1に関数C1の実行情報を記録する。記憶領域903-2~記憶領域903-4は、未使用である。関数C1の処理において、
図1に示したように、データに異常が発生する。
【0067】
図9Dは、時刻T4における記憶領域の状態の例を示している。時刻T4において、実行部512は、関数C1の処理を終了し、呼び出し元である関数B1の処理に復帰する。記録部513は、
図9Cのポインタpが指す記憶領域903-1からRを取得し、取得されたRが示す記憶領域902-1のアドレスをポインタpに設定する。
【0068】
図9Eは、時刻T5における記憶領域の状態の例を示している。時刻T5において、関数B1は、関数C2を呼び出す。記録部513は、
図9Dのポインタpが指す呼び出し元の記憶領域902-1からC及びSを取得する。
【0069】
この場合、SはNULLではないため、関数B1から呼び出された関数のための実行情報領域が既に確保されていることが分かる。そこで、記録部513は、記憶領域902-1のCを1だけインクリメントする。C=2は、記憶領域903-2が実行情報領域内の2番目の記憶領域であることを示す。
【0070】
次に、記録部513は、式(1)により、記憶領域903-2のアドレスaddを計算し、記憶領域903-2を関数C2に割り当てる。この場合、C=2であるため、add=S+Xとなる。
【0071】
次に、記録部513は、記憶領域903-2のRに
図9Dのポインタpのアドレスを設定し、ポインタpに記憶領域903-2のアドレスを設定し、記憶領域903-2に関数C2の実行情報を記録する。
【0072】
図9Fは、時刻T6における記憶領域の状態の例を示している。時刻T6において、実行部512は、関数C2の処理を終了し、呼び出し元である関数B1の処理に復帰する。記録部513は、
図9Eのポインタpが指す記憶領域903-2からRを取得し、取得されたRが示す記憶領域902-1のアドレスをポインタpに設定する。
【0073】
図9Gは、時刻T7における記憶領域の状態の例を示している。時刻T7において、実行部512は、関数B1の処理を終了し、呼び出し元である関数Aの処理に復帰する。記録部513は、
図9Fのポインタpが指す記憶領域902-1からRを取得し、取得されたRが示す記憶領域901のアドレスをポインタpに設定する。
【0074】
図9Hは、時刻T8における記憶領域の状態の例を示している。時刻T8において、関数Aは、関数B2を呼び出す。記録部513は、
図9Gのポインタpが指す呼び出し元の記憶領域901からC及びSを取得する。
【0075】
この場合、SはNULLではないため、関数Aから呼び出された関数のための実行情報領域が既に確保されていることが分かる。そこで、記録部513は、記憶領域901のCを1だけインクリメントする。C=2は、記憶領域902-2が実行情報領域内の2番目の記憶領域であることを示す。
【0076】
次に、記録部513は、式(1)により、記憶領域902-2のアドレスaddを計算し、記憶領域902-2を関数B2に割り当てる。この場合、C=2であるため、add=S+Xとなる。
【0077】
次に、記録部513は、記憶領域902-2のRに
図9Gのポインタpのアドレスを設定し、ポインタpに記憶領域902-2のアドレスを設定し、記憶領域902-2に関数B2の実行情報を記録する。関数B2の処理において、実行部512は、
図1に示したように、関数C1の処理に起因するデータの矛盾を異常として検出し、処理の続行が不可能と判断する。
【0078】
この場合、異常の原因を調査するためには、時刻T3において記憶領域903-1に記録された関数C1の実行情報が有用である。時刻T5において関数C2の実行情報が記憶領域903-1に上書きされず、別の記憶領域903-2に記録されるため、時刻T8において問題が表面化したとき、記憶領域903-1に関数C1の実行情報が残されている。
【0079】
したがって、プログラムの実行を終了した後の故障解析において、関数C1の実行情報を利用してプログラムの状態を把握することで、関数C1のバグを発見して異常の原因を特定することができる。
【0080】
関数B1は、第1関数の一例であり、関数B2は、第2関数の一例であり、関数C1は、第3関数の一例であり、関数C2は、第4関数の一例である。記憶領域902-1は、第1記憶領域の一例であり、記憶領域902-2は、第2記憶領域の一例であり、記憶領域903-1は、第3記憶領域の一例であり、記憶領域903-2は、第4記憶領域の一例である。
【0081】
図5の情報処理装置501によれば、プログラム521の実行に伴って、
図9A~
図9Hに示したように、関数の呼び出し関係を反映した木構造の記憶領域が生成される。木構造のノード及び葉にN個の記憶領域を確保して、呼び出された関数の実行情報を各記憶領域に記録することで、関数の実行情報の上書きが回避され、実行情報を適切に記録することができる。また、各記憶領域に呼び出し元記憶領域のアドレスを記録することで、子ノードの記憶領域から親ノードの記憶領域へアクセスすることが可能になる。
【0082】
さらに、呼び出し元記憶領域に、呼び出された関数の記憶領域を示す情報を記録することで、その情報を利用して、次に呼び出される関数の記憶領域のアドレスを求めることができる。これにより、親ノードの記憶領域から子ノードの別の記憶領域へアクセスすることが可能になる。
【0083】
新たな階層に含まれる最初の関数が呼び出されたときにN個の記憶領域が新たに確保されるため、記憶部511内に空き領域が存在する限り、プログラム521の実行に伴って記憶領域が増加していく。したがって、実行情報を記録するための記憶領域が不足して、プログラム521の実行が終了してしまうことはない。
【0084】
例えば、プログラム521の通常の実行時には、
図2に示した比較例のようなスタックを利用して実行情報を記録し、問題が発生して原因の調査を行う場合に、デバッグモードに切り替えて、木構造の記憶領域に実行情報を記録するようにしてもよい。
【0085】
図10は、
図7の呼び出し処理703の例を示すフローチャートである。まず、記録部513は、ポインタpが指す現在の記憶領域からC及びSを取得し(ステップ1001)、取得されたSの値をチェックする(ステップ1002)。現在の記憶領域は、呼び出し元の関数の実行情報が記録されている記憶領域である。
【0086】
S=NULLである場合(ステップ1002,YES)、記録部513は、N個の記憶領域を含む実行情報領域を、記憶部511内で確保する(ステップ1007)。そして、記録部513は、現在の記憶領域のSに実行情報領域のアドレスを設定し(ステップ1008)、現在の記憶領域のCに1を設定する(ステップ1009)。
【0087】
次に、記録部513は、式(1)により、呼び出された関数のための記憶領域のアドレスaddを計算し、アドレスaddが指す記憶領域を、呼び出された関数に割り当てる(ステップ1004)。そして、記録部513は、アドレスaddが指す記憶領域のRに、ポインタpのアドレスを設定し(ステップ1005)、アドレスaddをポインタpに設定する(ステップ1006)。その後、記録部513は、アドレスaddが指す記憶領域に、呼び出された関数の実行情報を記録する。
【0088】
一方、SがNULLではない場合(ステップ1002,NO)、記録部513は、現在の記憶領域のCを1だけインクリメントすることで、Cを更新する(ステップ1003)。そして、記録部513は、ステップ1004以降の処理を行う。
【0089】
図11は、
図7の復帰処理706の例を示すフローチャートである。まず、記録部513は、ポインタpが指す現在の記憶領域からRを取得する(ステップ1101)。そして、記録部513は、取得されたRが示す呼び出し元の記憶領域のアドレスを、ポインタpに設定する(ステップ1102)。
【0090】
図3の情報処理装置301及び
図5の情報処理装置501の構成は一例に過ぎず、情報処理装置の用途又は条件に応じて一部の構成要素を省略又は変更してもよい。
【0091】
図6の仮想化システムの構成は一例に過ぎず、仮想化システムの用途又は条件に応じて一部の構成要素を省略又は変更してもよい。例えば、仮想化ソフトウェア604上で動作するOSの個数は、1個であってもよく、3個以上であってもよい。各OS上で動作するアプリケーションプログラムの個数は、1個であってもよく、3個以上であってもよい。ハイパーバイザ605以外の仮想化ソフトウェアを用いて、プロセッサの動作をエミュレートしてもよい。
【0092】
図4、
図10、及び
図11のフローチャートは一例に過ぎず、情報処理装置の構成又は条件に応じて、一部の処理を省略又は変更してもよい。
【0093】
図1に示したプログラムは一例に過ぎず、呼び出される関数は、プログラムに応じて変化する。
図2に示したスタックの状態は一例に過ぎず、スタックの状態は、プログラムに応じて変化する。
図7に示した呼び出し処理703及び復帰処理706は一例に過ぎず、呼び出し処理703及び復帰処理706は、ハイパーバイザ605以外の仮想化ソフトウェアを用いて行われてもよい。
【0094】
図8に示した制御情報は一例に過ぎず、別の形式の制御情報を用いて、呼び出し処理703及び復帰処理706を行ってもよい。
図9A~
図9Hに示した記憶領域の状態は一例に過ぎず、記憶領域の状態は、プログラム521に応じて変化する。式(1)は一例に過ぎず、別の計算式用いてアドレスaddを求めてもよい。
【0095】
図12は、
図3の情報処理装置301及び
図5の情報処理装置501のハードウェア構成例を示している。
図12の情報処理装置は、CPU(Central Processing Unit)1201、メモリ1202、入力装置1203、出力装置1204、補助記憶装置1205、媒体駆動装置1206、及びネットワーク接続装置1207を含む。これらの構成要素はハードウェアであり、バス1208により互いに接続されている。
【0096】
メモリ1202は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)等の半導体メモリであり、処理に用いられるプログラム及びデータを記憶する。メモリ1202は、
図3の記憶部311又は
図5の記憶部511として動作してもよい。処理に用いられるプログラムは、例えば、プログラム521及び制御プログラムである。
【0097】
CPU1201(プロセッサ)は、例えば、メモリ1202を利用して制御プログラムを実行することにより、
図3の記録部312として動作する。CPU1201は、
図5の実行部512としても動作する。CPU1201は、メモリ1202を利用して制御プログラムを実行することにより、
図5の記録部513としても動作する。
【0098】
入力装置1203は、例えば、キーボード、ポインティングデバイス等であり、ユーザ又はオペレータからの指示又は情報の入力に用いられる。出力装置1204は、例えば、表示装置、プリンタ等であり、ユーザ又はオペレータへの問い合わせ又は指示、及び処理結果の出力に用いられる。処理結果は、プログラム521に含まれる各関数の実行情報であってもよい。
【0099】
補助記憶装置1205は、例えば、磁気ディスク装置、光ディスク装置、光磁気ディスク装置、テープ装置等である。補助記憶装置1205は、ハードディスクドライブであってもよい。情報処理装置は、補助記憶装置1205にプログラム及びデータを格納しておき、それらをメモリ1202にロードして使用することができる。
【0100】
媒体駆動装置1206は、可搬型記録媒体1209を駆動し、その記録内容にアクセスする。可搬型記録媒体1209は、メモリデバイス、フレキシブルディスク、光ディスク、光磁気ディスク等である。可搬型記録媒体1209は、CD-ROM(Compact Disk Read Only Memory)、DVD(Digital Versatile Disk)、USB(Universal Serial Bus)メモリ等であってもよい。ユーザ又はオペレータは、可搬型記録媒体1209にプログラム及びデータを格納しておき、それらをメモリ1202にロードして使用することができる。
【0101】
このように、処理に用いられるプログラム及びデータを格納するコンピュータ読み取り可能な記録媒体は、メモリ1202、補助記憶装置1205、又は可搬型記録媒体1209のような、物理的な(非一時的な)記録媒体である。
【0102】
ネットワーク接続装置1207は、LAN(Local Area Network)、WAN(Wide Area Network)等の通信ネットワークに接続され、通信に伴うデータ変換を行う通信インタフェース回路である。情報処理装置は、プログラム及びデータを外部の装置からネットワーク接続装置1207を介して受信し、それらをメモリ1202にロードして使用することができる。
【0103】
なお、情報処理装置が
図12のすべての構成要素を含む必要はなく、情報処理装置の用途又は条件に応じて一部の構成要素を省略することも可能である。例えば、ユーザ又はオペレータとのインタフェースが不要である場合は、入力装置1203及び出力装置1204を省略してもよい。可搬型記録媒体1209又は通信ネットワークを使用しない場合は、媒体駆動装置1206又はネットワーク接続装置1207を省略してもよい。
【0104】
開示の実施形態とその利点について詳しく説明したが、当業者は、特許請求の範囲に明確に記載した本発明の範囲から逸脱することなく、様々な変更、追加、省略をすることができるであろう。
【0105】
図1乃至
図12を参照しながら説明した実施形態に関し、さらに以下の付記を開示する。
(付記1)
プログラムの実行中に複数の関数を呼び出す呼び出し元の実行情報が記録された呼び出し元記憶領域を含む記憶部と、
前記複数の関数のうち第1関数が前記呼び出し元から呼び出されたとき、前記記憶部内に複数の記憶領域を確保して、前記複数の記憶領域のうち第1記憶領域に、前記呼び出し元記憶領域の位置を示す呼び出し元情報と前記第1関数の実行情報とを記録し、前記複数の関数のうち第2関数が前記呼び出し元から呼び出されたとき、前記複数の記憶領域のうち第2記憶領域に、前記呼び出し元情報と前記第2関数の実行情報とを記録する記録部と、
を備えることを特徴とする情報処理装置。
(付記2)
前記記録部は、前記第1関数が呼び出されたとき、前記呼び出し元記憶領域に前記第1記憶領域を示す第1情報を記録し、前記第2関数が呼び出されたとき、前記呼び出し元記憶領域に前記第2記憶領域を示す第2情報を記録することを特徴とする付記1記載の情報処理装置。
(付記3)
前記第1情報は、前記記憶部内における前記複数の記憶領域の位置を示す位置情報と、前記複数の記憶領域のうち1番目の記憶領域を示す第1カウンタ情報とを含み、
前記第2情報は、前記位置情報と、前記複数の記憶領域のうち2番目の記憶領域を示す第2カウンタ情報とを含み、
前記記録部は、前記第2関数が呼び出されたとき、前記第1カウンタ情報を前記第2カウンタ情報に変更することで、前記第1情報を前記第2情報に変更することを特徴とする付記2記載の情報処理装置。
(付記4)
前記記録部は、前記第1関数の実行が終了したとき、前記第1記憶領域から前記呼び出し元情報を取得し、前記第2関数が呼び出されたとき、取得された前記呼び出し元情報に基づいて、前記呼び出し元記憶領域から前記第1情報を取得し、取得された前記第1情報に基づいて、前記第2記憶領域の位置を求めることを特徴とする付記2又は3記載の情報処理装置。
(付記5)
前記記録部は、別の複数の関数のうち第3関数が前記第1関数から呼び出されたとき、前記記憶部内に別の複数の記憶領域を確保して、前記別の複数の記憶領域のうち第3記憶領域に、前記第1記憶領域の位置を示す情報と前記第3関数の実行情報とを記録し、前記別の複数の関数のうち第4関数が前記第1関数から呼び出されたとき、前記別の複数の記憶領域のうち第4記憶領域に、前記第1記憶領域の位置を示す情報と前記第4関数の実行情報とを記録することを特徴とする付記1乃至4の何れか1項に記載の情報処理装置。
(付記6)
プログラムの実行中に複数の関数を呼び出す呼び出し元から、前記複数の関数のうち第1関数が呼び出されたとき、記憶部内に複数の記憶領域を確保し、
前記複数の記憶領域のうち第1記憶領域に、前記呼び出し元の実行情報が記録されている、前記記憶部内の呼び出し元記憶領域を示す呼び出し元情報と、前記第1関数の実行情報とを記録し、
前記複数の関数のうち第2関数が前記呼び出し元から呼び出されたとき、前記複数の記憶領域のうち第2記憶領域に、前記呼び出し元情報と前記第2関数の実行情報とを記録する、
処理をコンピュータが実行することを特徴とする情報処理方法。
(付記7)
前記第1関数が呼び出されたとき、前記呼び出し元記憶領域に前記第1記憶領域を示す第1情報を記録し、
前記第2関数が呼び出されたとき、前記呼び出し元記憶領域に前記第2記憶領域を示す第2情報を記録する、
処理を前記コンピュータがさらに実行することを特徴とする付記6記載の情報処理方法。
(付記8)
前記第1情報は、前記記憶部内における前記複数の記憶領域の位置を示す位置情報と、前記複数の記憶領域のうち1番目の記憶領域を示す第1カウンタ情報とを含み、
前記第2情報は、前記位置情報と、前記複数の記憶領域のうち2番目の記憶領域を示す第2カウンタ情報とを含み、
前記第2情報を記録する処理は、前記第1カウンタ情報を前記第2カウンタ情報に変更することで、前記第1情報を前記第2情報に変更する処理を含むことを特徴とする付記7記載の情報処理方法。
(付記9)
前記第1関数の実行が終了したとき、前記第1記憶領域から前記呼び出し元情報を取得し、
前記第2関数が呼び出されたとき、取得された前記呼び出し元情報に基づいて、前記呼び出し元記憶領域から前記第1情報を取得し、
取得された前記第1情報に基づいて、前記第2記憶領域の位置を求める、
処理を前記コンピュータがさらに実行することを特徴とする付記7又は8記載の情報処理方法。
(付記10)
別の複数の関数のうち第3関数が前記第1関数から呼び出されたとき、前記記憶部内に別の複数の記憶領域を確保し、
前記別の複数の記憶領域のうち第3記憶領域に、前記第1記憶領域の位置を示す情報と前記第3関数の実行情報とを記録し、
前記別の複数の関数のうち第4関数が前記第1関数から呼び出されたとき、前記別の複数の記憶領域のうち第4記憶領域に、前記第1記憶領域の位置を示す情報と前記第4関数の実行情報とを記録する、
処理を前記コンピュータがさらに実行することを特徴とする付記6乃至9の何れか1項に記載の情報処理方法。
(付記11)
プログラムの実行中に複数の関数を呼び出す呼び出し元から、前記複数の関数のうち第1関数が呼び出されたとき、記憶部内に複数の記憶領域を確保し、
前記複数の記憶領域のうち第1記憶領域に、前記呼び出し元の実行情報が記録されている、前記記憶部内の呼び出し元記憶領域を示す呼び出し元情報と、前記第1関数の実行情報とを記録し、
前記複数の関数のうち第2関数が前記呼び出し元から呼び出されたとき、前記複数の記憶領域のうち第2記憶領域に、前記呼び出し元情報と前記第2関数の実行情報とを記録する、
処理をコンピュータに実行させることを特徴とするプログラム。
(付記12)
前記第1関数が呼び出されたとき、前記呼び出し元記憶領域に前記第1記憶領域を示す第1情報を記録し、
前記第2関数が呼び出されたとき、前記呼び出し元記憶領域に前記第2記憶領域を示す第2情報を記録する、
処理を前記コンピュータがさらに実行することを特徴とする付記11記載のプログラム。
(付記13)
前記第1情報は、前記記憶部内における前記複数の記憶領域の位置を示す位置情報と、前記複数の記憶領域のうち1番目の記憶領域を示す第1カウンタ情報とを含み、
前記第2情報は、前記位置情報と、前記複数の記憶領域のうち2番目の記憶領域を示す第2カウンタ情報とを含み、
前記第2情報を記録する処理は、前記第1カウンタ情報を前記第2カウンタ情報に変更することで、前記第1情報を前記第2情報に変更する処理を含むことを特徴とする付記12記載のプログラム。
(付記14)
前記第1関数の実行が終了したとき、前記第1記憶領域から前記呼び出し元情報を取得し、
前記第2関数が呼び出されたとき、取得された前記呼び出し元情報に基づいて、前記呼び出し元記憶領域から前記第1情報を取得し、
取得された前記第1情報に基づいて、前記第2記憶領域の位置を求める、
処理を前記コンピュータがさらに実行することを特徴とする付記12又は13記載のプログラム。
(付記15)
別の複数の関数のうち第3関数が前記第1関数から呼び出されたとき、前記記憶部内に別の複数の記憶領域を確保し、
前記別の複数の記憶領域のうち第3記憶領域に、前記第1記憶領域の位置を示す情報と前記第3関数の実行情報とを記録し、
前記別の複数の関数のうち第4関数が前記第1関数から呼び出されたとき、前記別の複数の記憶領域のうち第4記憶領域に、前記第1記憶領域の位置を示す情報と前記第4関数の実行情報とを記録する、
処理を前記コンピュータがさらに実行することを特徴とする付記11乃至14の何れか1項に記載のプログラム。
【符号の説明】
【0106】
201-1~201-4 スタック
301、501 情報処理装置
311、511 記憶部
312、513 記録部
512 実行部
521 プログラム
601-1、601-2、602-1、602-2 アプリケーション
603-1、603-2 オペレーティングシステム
604 仮想化ソフトウェア
605 ハイパーバイザ
606 ハードウェア
701、702 呼び出し
703 呼び出し処理
704、705 復帰
706 復帰処理
901、902-1~902-4、903-1~903-4 記憶領域
1201 CPU
1202 メモリ
1203 入力装置
1204 出力装置
1205 補助記憶装置
1206 媒体駆動装置
1207 ネットワーク接続装置
1208 バス
1209 可搬型記録媒体