(57)【要約】【課題】ソフトウェア開発において不具合解析時に用いると有用なデータ解析システムを提供すること。【解決手段】本発明にかかるデータ解析システムは、関数毎に命令領域を有し、関数呼び出し命令の位置と、関数呼び出し命令後の戻り位置が連続して配置された命令領域１０８と、関数呼び出しに応じて各関数に対応したスタック領域が積み上げられて格納され、当該スタック領域中に呼び出し命令後の戻り位置情報が格納されたソフトウェアスタック１０７と、前記ソフトウェアスタックにおけるスタック領域のデータが前記命令領域における位置情報であるとした場合に、その位置情報により特定される位置の直前の位置にある命令が関数呼び出し命令であるかを判定することによって関数呼び出し命令を認識し、これにより、呼び出し情報および呼び出し順序情報を取得する追跡手段を備えている。【選択図】図１
2008107908.tif 000002
【特許請求の範囲】
【請求項１】
関数毎に命令領域を有し、関数呼び出し命令の位置と、関数呼び出し命令後の戻り位置が連続して配置された命令領域と、
関数呼び出しに応じて各関数に対応したスタック領域が積み上げられて格納され、当該スタック領域中に呼び出し命令後の戻り位置情報が格納されたソフトウェアスタックと、
前記ソフトウェアスタックにおけるスタック領域のデータが前記命令領域における位置情報であるとした場合に、その位置情報により特定される位置の直前の位置にある命令が関数呼び出し命令であるかを判定することによって関数呼び出し命令を認識し、これにより、呼び出し情報および呼び出し順序情報を取得する追跡手段を備えたデータ解析システム。
【請求項２】
さらに、最新のスタック領域の位置情報を格納するスタック位置格納手段を有し、
前記追跡手段は、スタック位置格納手段により特定されるスタック位置より追跡処理を開始することを特徴とする請求項１記載のデータ解析システム。
【請求項３】
さらに、処理中の関数の戻り位置を格納する戻り位置格納手段を備えていることを特徴とする請求項１記載のデータ解析システム。
【請求項４】
前記追跡手段は、
前記スタック位置格納手段からスタック位置をスタック検索位置格納手段へコピーする手段と、
前記スタック検索位置格納手段へコピーされたスタック位置により定められる前記ソフトウェア上のデータを前記命令領域における位置情報であるとして、その直前の命令を前記命令領域より取り出す手段と、
取り出した命令が関数呼び出しかいなかを判定する手段と、
判定の結果、取り出した命令が関数呼び出しである場合に、関数呼び出し命令を認識する手段と、
認識された関数呼び出し命令より呼び出し情報および呼び出し順序情報を取得する手段とを有することを特徴とする請求項２記載のデータ解析システム。
【請求項５】
判定の結果、取り出した命令が関数呼び出しでない場合に、前記スタック検索位置格納手段のスタック位置を次の位置に更新する手段をさらに備えたことを特徴とする請求項４記載のデータ解析システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ解析システムに関するものであり、特に、ソフトウェア開発において不具合解析時に用いると有用なデータ解析システムに関する。
【背景技術】
【０００２】
ソフトウェアの規模は大規模化が進む一方であり、その開発環境の効率向上が望まれている。ソフトウェア開発において最大の障害となるのが不具合発生時の解析に多大なコストを浪費することである。不具合が発生した場合にこれを解析するために、一般的に、不具合解析専用の機能をハードウェア上に追加することが行われている。しかしながら、この不具合解析専用の機能は、コスト削減の観点からすると、搭載しないことが望ましい。特別な追加コストなしに使用可能な不具合解析手段が待望されている。
【０００３】
図９及び図１０に、特許文献１に記載された従来のデータ解析システムの全体構成及びテーブル構成を示す。図９において、カーネルスタック１１は、呼び出し元関数のフレームポインタをベースアドレスとし、呼び出す関数の戻り番地と、自関数のベースアドレスをポイントするフレームポインタとを有する関数の情報が順次格納される。ポインタ手段１３は、最後に実行された関数のフレームポインタをポイントする。追跡手段１５は、最後に実行された関数のフレームポインタから、順次呼び出し元関数のフレームポインタに遡り、各情報格納領域から戻り番地を取り出す。ネームリスト１７は、システムで使用される静的に結合された関数の関数名および先頭アドレスが、先頭アドレスの昇順に格納される。関数名特定手段１９は、戻り番地が入力され、昇順に並べられた先頭アドレスを探索範囲とし、二分探索法により、戻り番地が含まれる先頭アドレス範囲を求め、その関数名を特定する。
【０００４】
図１０において、システムベクタテーブル（ＳＶＴ）３１、３３は、システムが使用する各種テーブルをポイントする。カーネルスタック１１には、関数ごとにローカルにしようされるデータ及びレジスタ内容が格納される。また、別の関数を呼び出したときには、戻り番地と、実行中の関数情報のベースアドレスをポイントするフレームポインタが格納される。このフレームポインタが格納された位置は、次の関数のベースアドレスとして使用される。ネームリスト１７は、システム内で静的に結合された関数名と、その先頭アドレスとを対応づけるリストであり、関数名が先頭アドレスの昇順に格納される。
【０００５】
【特許文献１】特開平４−９６１４８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
特許文献１に開示された従来技術では、追跡手段を実現するために本来不要なフレームポインタ及び戻り番地の記録が必須となる。そのため、フレームポインタ及び戻り番地の記録によってソフトウェア効率が悪化するという問題点や、専用のフレームポインタ及び戻り番地記録領域の設定によってスタックフレームが増大するという問題点があった。さらには、コンパイラ・ソフトウェアに特別な修正が必要となるという問題点もあった。コンパイラ・ソフトウェアに特別な修正が必要となる問題点については、コンパイラ・ソフトウェアに機械語を記述することにより特別な修正を不必要とすることもできるが、その記述者にとって大きな負担となるため開発コストの大幅な増加を招いてしまう。
【課題を解決するための手段】
【０００７】
本発明にかかるデータ解析システムは、上記のような課題を解決するためになされたものであり、関数毎に命令領域を有し、関数呼び出し命令の位置と、関数呼び出し命令後の戻り位置が連続して配置された命令領域と、関数呼び出しに応じて各関数に対応したスタック領域が積み上げられて格納され、当該スタック領域中に呼び出し命令後の戻り位置情報が格納されたソフトウェアスタックと、前記ソフトウェアスタックにおけるスタック領域のデータが前記命令領域における位置情報であるとした場合に、その位置情報により特定される位置の直前の位置にある命令が関数呼び出し命令であるかを判定することによって関数呼び出し命令を認識し、これにより、呼び出し情報および呼び出し順序情報を取得する追跡手段を備えている。
【発明の効果】
【０００８】
本発明により、ソフトウェア開発において不具合解析時に用いると有用なデータ解析システムを提供することができる。
【発明を実施するための最良の形態】
【０００９】
本発明の実施の形態１．
最初に、図１を用いて、本発明の実施の形態１にかかるデータ解析システムの構成について説明する。当該データ解析システムは、関数毎に任意のサイズのスタックフレーム（スタック領域）を使用し、関数呼び出しが発生する度にスタックフレームを積み上げるデータ／アドレス混合スタックベースのシステムである。このシステムは、スタック位置格納手段１０１、スタック検索位置格納手段１０２、戻り番地格納手段１０３、呼び出し関係確認手段１０４、呼び出し関係整列手段１０５、関数情報抽出手段１０６、ソフトウェアスタック１０７及び命令領域１０８を備えている。
【００１０】
スタック位置格納手段１０１は、ソフトウェアスタック１０７において直近に呼び出した関数のスタック位置の情報を一時的に格納する手段である。具体的には、スタック位置格納手段１０１に、フレームの先頭位置に関する情報が格納される。したがって、関数が呼び出されると、このスタック位置格納手段１０１に格納される情報が変更される。
【００１１】
スタック検索位置格納手段１０２は、追跡処理のために、スタック位置格納手段１０１に格納されたスタックの位置情報を複写（コピー）し、これを格納する手段である。
戻り番地格納手段１０３は、直近に呼び出した関数の呼び出し元の関数の戻り番地を一時的に格納する手段である。したがって、関数の呼び出し毎に、この一時的領域に格納される情報が変更される。
【００１２】
呼び出し関係確認手段１０４は、ソフトウェアスタック１０７のデータにより特定される、命令領域１０８上の番地の直前の番地にある命令が、関数呼び出し情報であるかを判定する手段である。
呼び出し関係整列手段１０５は、呼び出し順序に関する情報を取得する手段である。
関数情報抽出手段１０６は、呼び出された関数に関する情報を取得する手段である。
【００１３】
ソフトウェアスタック１０７は、関数呼び出しに応じて各関数に対応したスタック領域が積み上げられて格納され、当該スタック領域中に呼び出し命令後の戻り位置情報が格納されるものである。このソフトウェアスタック１０７には、関数毎に独立して設けられたスタック領域と未使用領域から構成されている領域を有する。スタック位置格納手段１０１に格納されたスタック位置に対応する関数以外の関数のスタック領域には、関数の呼び出し元の戻り番地の領域が格納されている場合がある。
【００１４】
命令領域１０８には、関数毎に命令領域を有し、関数呼び出し命令の位置と、関数呼び出し命令後の戻り位置が連続して配置されている。具体的には、命令領域１０８には、各関数の命令、すなわちプログラム言語が格納されている。特に、関数呼び出し命令を含む関数の命令については、当該関数呼び出し命令及び戻り番地位置の情報が含まれている。
【００１５】
図２に本発明の実施の形態１にかかるデータ解析システムのハードウェア構成例を示す。図に示されるように、当該データ解析システム２０は、ＣＰＵ２１１、ＲＯＭ２１２、ＲＡＭ２１３より構成される制御部２１、入力装置２２、出力装置２３、入出力制御回路２４、記憶部２５を備えており、これらの構成要素は相互にシステムバスにより接続されている。
【００１６】
制御部２１は、データ解析システムを実現するための種々の演算処理を実行する。ＣＰＵ２１１は、中央演算装置であり、ＲＯＭ２１２に格納されたメインプログラムや、ＲＡＭ２１３等に展開されたプログラム、一時的に格納されたデータ等に基づき転送や演算処理を実行する。ＲＡＭ２１３は、一時的にデータを格納する記憶部として機能する。
【００１７】
入力装置２２は、例えばキーボードやマウス等のデータ入力デバイスである。この入力装置２２により記憶部２５へデータを入力できる。出力装置２３は、ＬＣＤ、ＣＲＴやプロジェクタ等の表示装置やプリンタ（印刷装置）である。入出力制御回路２４は、外部装置との間でデータの入出力を実行するための制御を行う。
【００１８】
記憶部２５は、プログラムやデータを格納する記憶手段であり、メモリやハードディスク等によって構成される。記憶部２５は、スタック位置格納手段１０１、スタック検索位置格納手段１０２、戻り番地格納手段１０３、呼び出し関係確認手段１０４、呼び出し関係整列手段１０５、関数情報抽出手段１０６、ソフトウェアスタック１０７及び命令領域１０８を構成する。
【００１９】
次に、図３を用いて、本発明の実施の形態１にかかるデータ解析システムにおける処理について説明する。図は、関数Ｃ、関数Ｂの順で関数を呼び出したときのソフトウェアスタック１０７の状態を示している。
【００２０】
図に示されるように、関数Ｃを呼び出すと、関数Ｃのスタック位置の情報（ここでは、関数Ｃスタックフレームの先頭番地）がスタック位置格納手段１０１に格納され、かつ関数Ｃのスタックフレームがソフトウェアスタック１０７に格納される。このときのソフトウェアスタック１０７の状態は図３の左側に示されるとおりである。ソフトウェアスタック１０７において何の情報も格納されていない領域が未使用領域である。
【００２１】
続いて、関数Ｂを呼び出すと、関数Ｂのスタック位置の情報（ここでは、関数Ｂスタックフレームの先頭番地）がスタック位置格納手段１０１に格納され、かつ関数Ｂのスタックフレームがソフトウェアスタック１０７に格納される。このとき、関数Ｂのスタックフレームは、先に格納されていた関数Ｃのスタックフレームに対して積み上げられる。この関数Ｂの呼び出しによって、スタック位置格納手段１０１に格納されていた関数Ｃのスタック位置の情報は、関数Ｂのスタック位置の情報に上書きされる。このときのソフトウェアスタック１０７の状態が図３の右側に示されている。
【００２２】
次に、図４を用いて、関数Ｃ、関数Ｂ、関数Ａの順で呼び出したときのソフトウェアスタック１０７の状態の変化について説明する。
図４（ａ）に示されるように、関数Ｃを呼び出すと、関数Ｃのスタックフレームがソフトウェアスタック１０７に格納される。戻り番地格納手段１０３の状態は、未使用である。
【００２３】
続いて、関数Ｂを呼び出すと、関数Ｃの戻り番地が戻り番地格納手段１０３に、関数Ｂのスタックフレームがソフトウェアスタック１０７にそれぞれ格納される。このときの戻り番地格納手段４０２及びソフトウェアスタック１０７の状態は、図４（ｂ）に示されるとおりである。
【００２４】
続いて、関数Ａを呼び出すと、関数Ｂの戻り番地が戻り番地格納手段１０３に、関数Ａのスタックフレームがソフトウェアスタック１０７にそれぞれ格納される。この関数Ａの呼び出し前に、戻り番地格納手段１０３に格納されていた関数Ｃの戻り番地の情報は、関数Ｂのスタック領域に格納される。本例では、戻り番地格納手段１０３に格納されていた関数Ｃの戻り番地の情報は、関数Ｂのスタック領域に格納されているが、ソフトウェアスタック１０７上であれば、任意の領域に格納してもよい。また、この関数Ａの呼び出しによって、戻り番地格納手段１０３に格納されていた関数Ｃの戻り番地の情報は、関数Ｂの戻り番地の情報に上書きされている。このときの戻り番地格納手段１０３及びソフトウェアスタック１０７の状態は、図４（ｃ）に示されるとおりである。
【００２５】
次に、図５を用いて、関数呼び出しの処理について説明する。図５は、関数呼び出しの処理のフローチャートである。この例では、関数Ｂの処理において関数Ａを呼び出す処理について説明する。
【００２６】
図に示されるように、戻り番地格納手段１０３から関数Ｃの戻り番地を取り出し（Ｓ５０１）、関数Ｃの戻り番地を関数Ｂのスタックフレームに格納する（Ｓ５０２）。関数Ｂの戻り番地を戻り番地格納手段１０３に格納し（Ｓ５０３）、関数Ａの先頭番地に処理を戻す（Ｓ５０４）。関数Ａのスタック位置の位置情報（ここでは、スタックフレームの先頭番地）をスタック位置格納手段１０１に格納し（Ｓ５０５）、関数Ａの処理を実行する（Ｓ５０６）。関数Ｂのスタック位置の位置情報（ここでは、スタックフレームの先頭番地）をスタック位置格納手段１０１に格納し（Ｓ５０７）、関数Ｂの戻り番地に処理を戻す（Ｓ５０８）。
【００２７】
続いて、図６を用いて、命令領域における関数呼び出し及び関数復帰の処理について説明する。この例では、関数Ｂにおいて関数Ａを呼び出す処理について説明する。図に示されるように、命令領域１０８は、他の関数の命令領域、関数Ａ命令領域及び関数Ｂ命令領域で構成されている。
【００２８】
関数Ｂが実行され、その中で関数Ａの呼び出し命令が実行される。この関数Ａの呼び出し命令によって関数Ａが実行される。この関数Ａの実行が終了すると、関数Ｂ復帰となり、関数Ｂの実行が再開される。このとき、関数Ａの呼び出し命令直後の次の命令から実行が再開される。
【００２９】
最初に、図７を用いて、本発明のデータ解析システムにおける追跡処理に関する処理について説明する。図は、関数Ｄ、関数Ｃ、関数Ｂ、関数Ａの順で呼び出したときの戻り番地格納手段１０３、ソフトウェアスタック１０７及び命令領域１０８の状態を示している。
【００３０】
図に示されるように、関数Ｄを呼び出すと、関数Ｄのスタックフレームがソフトウェアスタック１０７に、関数Ｄ命令領域が命令領域１０８にそれぞれ格納される。
【００３１】
続いて、関数Ｃを呼び出すと、関数Ｄの戻り番地が戻り番地格納手段１０３に、関数Ｃのスタック領域がソフトウェアスタック１０７に、関数Ｃ命令領域が命令領域１０８にそれぞれ格納される。
【００３２】
続いて、関数Ｂを呼び出すと、関数Ｃの戻り番地が戻り番地格納手段１０３に、関数Ｂのスタック領域がソフトウェアスタック１０７に、関数Ｂ命令領域が命令領域１０８にそれぞれ格納される。
【００３３】
続いて、関数Ａを呼び出すと、関数Ｂの戻り番地が戻り番地格納手段１０３に、関数Ａのスタック領域がソフトウェアスタック１０７に、関数Ａ命令領域が命令領域１０８にそれぞれ格納される。
【００３４】
続いて、図８を用いて、本発明にかかるデータ解析システムにおける追跡処理について説明する。
【００３５】
最初に、スタック位置格納手段１０１から、スタック先頭番地を読み出し、スタック検索位置格納手段１０２に格納することによって、当該スタック先頭番地をスタック位置格納手段１０１からスタック検索位置格納手段１０２に複写（コピー）する。次に、スタック検索位置格納手段１０２に格納されたスタック先頭番地により示される、ソフトウェアスタック１０７上のデータを戻り番地と解釈する（Ｓ８０２）。このとき、スタック先頭番地により特定されるソフトウェアスタック１０７上のデータは、戻り番地である場合もあるが、そうでない場合もある。これを続いて実行される処理によっていずれかを判断する。
【００３６】
次に、ステップＳ８０２において戻り番地として解釈されたデータにより特定される番地の直前の番地上の命令を読み出す（Ｓ８０３）。そして、読み出された命令が関数呼び出しであるかを判定する（Ｓ８０４）。戻り番地である場合には、直前の命令が関数呼び出しであるから、直前の命令が関数呼び出しでないと判定された場合には、このデータは戻り番地ではないと判断することができる（Ｓ８０５）。この場合には、スタック検索位置格納手段に格納されたデータを更新する。具体的には、ソフトウェアスタック１０７上で現在格納されている番地の直後の番地に更新する。
【００３７】
ステップＳ８０４において、読み出された命令が関数呼び出しであると判定された場合には、戻り番地と解釈したデータが、戻り番地であったと確認し、呼び出し関係整列手段へ呼び出し先関数を登録する（Ｓ８０７）。
【００３８】
スタック検索位置格納手段に格納された番地が、スタック終端番地であるかを判定することによってスタック終端まで処理が終了したかどうかを判定する（Ｓ８０８）。スタック終端まで処理が終了していないと判定された場合には、再度ステップＳ８０３を実行する。スタック終端まで処理を終了したと判定した場合には、すべての処理を終了する。
【００３９】
このようにして、ソフトウェアスタック１０７上に格納されたデータが所定関数の戻り番地であるかを、戻り番地であれば命令領域において戻り関数である場合には直前の命令が呼び出し命令であることを利用して判断する。これにより、呼び出し情報および呼び出し順序情報を得ることができる。得られた各情報は、所定の記憶領域に格納される。
【００４０】
たとえば、図８に示したソフトウェアスタック１０７の状態であれば、
（１）接続情報１：関数Ａ（現在実行中）←関数Ｂ
（２）接続情報２：関数Ｂ←関数Ｃ
（３）接続情報３：関数Ｃ←関数Ｄ
よりなる呼び出し情報と、接続情報３→接続情報２→接続情報１の順を特定する呼び出し順序情報を得ることができる。このようにして、たとえば、特許文献１における追跡手段を実現することが可能となる。
【００４１】
本発明の実施の形態にかかるデータ解析システムにおいては、ソフトウェアスタック１０７が関数の実行順に同一メモリ空間に連続して配置されており、一方向に向かって検索することにより、時間情報を間接的に取得できる。また、新たに関数呼び出しを行う場合、必ず戻り番地は、ソフトウェアスタック１０７に記録されるため、漏れのない時間情報を取得できる。さらに、ソフトウェアスタックに記録された戻り番地は、関数毎に一つしかないので、戻り番地を呼び出し順に矛盾なく並べることが可能となる。
【００４２】
このように本発明の実施の形態にかかるデータ解析システムによれば、スタックフレーム、関数呼び出し関係等のデバッグ情報を出力する特別なソフトウェアがなくとも、関数のトレースバックを行うことができる。
また、現状のデバッグ環境をそのまま使用し、アドオンの形で提供できる。メモリ上の情報のみを必要とするため、メモリダンプ等の記録のみで関数トレースバックを再現することが可能である。
【図面の簡単な説明】
【００４３】
【図１】本発明の実施の形態にかかるデータ解析システムの構成図である。
【図２】本発明の実施の形態にかかるデータ解析システムの機能ブロック図である。
【図３】本発明の実施の形態にかかる処理を示す構成図である。
【図４】本発明の実施の形態にかかる処理を示す構成図である。
【図５】本発明にかかる関数呼び出しの処理を示すフローチャートである。
【図６】本発明の実施の形態にかかるデータ解析システムにおける命令領域を説明するための図である。
【図７】本発明の実施の形態にかかるデータ解析システムにおける追跡処理の動作例を示す概念図である。
【図８】本発明の実施の形態にかかるデータ解析システムにおける追跡処理を示すフローチャートである。
【図９】従来の追跡処理を実現するシステムを示すブロック図である。
【図１０】従来の追跡処理を実現するシステムにおける情報テーブルの構成を示すブロック図である。
【符号の説明】
【００４４】
１０１  スタック位置格納手段
１０２  スタック検索位置格納手段
１０３  戻り番地格納手段
１０４  呼び出し関係確認手段
１０５  呼び出し関係整列手段
１０６  関数情報抽出手段
１０７  ソフトウェアスタック
１０８  命令領域
【図１】
2008107908.tif 000003
【図２】
2008107908.tif 000004
【図３】
2008107908.tif 000005
【図４】
2008107908.tif 000006
【図５】
2008107908.tif 000007
【図６】
2008107908.tif 000008
【図７】
2008107908.tif 000009
【図８】
2008107908.tif 000010
【図９】
2008107908.tif 000011
【図１０】
2008107908.tif 000012