JP6070847B2 - 検証方法、検証装置および検証プログラム - Google Patents

検証方法、検証装置および検証プログラム Download PDF

Info

Publication number
JP6070847B2
JP6070847B2 JP2015530653A JP2015530653A JP6070847B2 JP 6070847 B2 JP6070847 B2 JP 6070847B2 JP 2015530653 A JP2015530653 A JP 2015530653A JP 2015530653 A JP2015530653 A JP 2015530653A JP 6070847 B2 JP6070847 B2 JP 6070847B2
Authority
JP
Japan
Prior art keywords
program
variable
log
deployment
difference
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2015530653A
Other languages
English (en)
Other versions
JPWO2015019504A1 (ja
Inventor
智弘 清水
智弘 清水
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Application granted granted Critical
Publication of JP6070847B2 publication Critical patent/JP6070847B2/ja
Publication of JPWO2015019504A1 publication Critical patent/JPWO2015019504A1/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0706Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0751Error or fault detection not based on redundancy
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0766Error or fault reporting or storing
    • G06F11/0787Storage of error reports, e.g. persistent data storage, storage using memory protection
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/079Root cause analysis, i.e. error or fault diagnosis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/3003Monitoring arrangements specially adapted to the computing system or computing system component being monitored
    • G06F11/302Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a software system
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • G06F11/3466Performance evaluation by tracing or monitoring
    • G06F11/3476Data logging
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3612Software analysis for verifying properties of programs by runtime analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2201/00Indexing scheme relating to error detection, to error correction, and to monitoring
    • G06F2201/815Virtual
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2201/00Indexing scheme relating to error detection, to error correction, and to monitoring
    • G06F2201/865Monitoring of software

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Quality & Reliability (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Computing Systems (AREA)
  • Health & Medical Sciences (AREA)
  • Biomedical Technology (AREA)
  • Software Systems (AREA)
  • Mathematical Physics (AREA)
  • Debugging And Monitoring (AREA)

Description

本発明は検証方法、検証装置および検証プログラムに関する。
現在、種々のプログラムが利用されている。ユーザは、プログラムにより、一連の手順をコンピュータに実行させることで、所定の機能をコンピュータに発揮させることができる。例えば、業務用の機能を提供するソフトウェアのプログラムや、他のソフトウェアの動作を支援するソフトウェアのプログラム等が利用されている。
ここで、プログラムの実行結果がユーザの想定する結果になることを確かめたいことがある。想定外の結果になってしまうと、システムの仕様や制約に則った運用に支障を来すおそれがあるからである。そこで、プログラムを検証することが考えられている。
例えば、データの更新を行う更新関数がオリジナルのデータを更新するときに更新関数の引数に順次与えられた値の履歴を記録しておき、更新関数の検証に用いる提案がある。この提案では、検証時に、記録された複数の値の少なくとも1つを当該複数の値に追加した数値群の各値を更新関数に順次与える。検証時のデータの最終的な更新結果が、更新後のオリジナルのデータと一致すれば、当該更新関数に可換性(データに対する更新の適用順序を変えても結果が変わらないこと)および冪等性(データに対して同じ更新を複数回適用しても、一度のみ適用した場合とその結果が変わらないこと)があると判断する。
なお、ネットワーク内の構成要素(例えば、パーソナルコンピュータやサーバ)に設定する設定パラメータおよび型定義を、設定パラメータおよび型定義のマスタとなる組と照合することで、設定内容の妥当性を検証する提案もある。
特開2010−123030号公報 特表2005−512196号公報
変数に応じた処理を示す複数のプログラム要素(例えば、命令や関数等)を含むプログラムを検証することが考えられる。例えば、複数のコンピュータ上への仮想マシン群やソフトウェア群等の配備を支援する配備プログラムが利用されることがある。配備プログラムは、仮想マシン等を動作させるための各種の設定を行う複数のプログラム要素を含み得る。このようなプログラムでは、複数のプログラム要素により複数の実行結果が生成され得る。この場合、各実行結果の妥当性をどのようにして検証するかが問題となる。
例えば、システムの部分的な仕様変更に応じて、配備プログラムにおける一部の変数の設定値が変更されたり、一部のプログラム要素自体のコードが変更されたりする。このため、配備プログラムが異なるタイミングで実行されると、一部のプログラム要素で両タイミングの実行結果が相違することがある。ところが、この場合、実行結果の相違が、両タイミング間で発生した一部の変数の設定値の変更が要因なのか、何れかのプログラム要素自体の処理が要因なのか、実行結果のみからでは適切に把握することが難しい。
1つの側面では、本発明は、実行結果が相違する要因の適切な把握を支援する検証方法、検証装置および検証プログラムを提供することを目的とする。
1つの態様では、変数に応じた処理を示す複数のプログラム要素を含むプログラムの検証方法が提供される。この検証方法では、コンピュータが、プログラムの実行時に、過去に当該プログラムを実行したときに対して入力内容が変更された変数を識別する情報、および、プログラム要素と当該プログラム要素が実行されることで出力される実行結果との対応を示す情報を含むログを取得し、プログラムの何れかの実行結果が過去の実行結果と相違するとき、ログを参照して、当該実行結果に対応するプログラム要素および当該プログラム要素に用いられる変数を検索し、当該変数に対する入力内容の変更状況に基づいて、実行結果が相違する要因と当該相違の妥当性とを評価し、実行結果の相違する箇所と相違の要因と相違の妥当性とを示す情報を出力する。
また、1つの態様では、変数に応じた処理を示す複数のプログラム要素を含むプログラムの検証に用いられる検証装置が提供される。この検証装置は、記憶部と演算部とを有する。記憶部は、プログラムの実行状況を示すログを記憶する。演算部は、プログラムの実行時に、過去に当該プログラムを実行したときに対して入力内容が変更された変数を識別する情報、および、プログラム要素と当該プログラム要素が実行されることで出力される実行結果との対応を示す情報を含むログを取得し、プログラムの何れかの実行結果が過去の実行結果と相違するとき、ログを参照して、当該実行結果に対応するプログラム要素および当該プログラム要素に用いられる変数を検索し、当該変数に対する入力内容の変更状況に基づいて、実行結果が相違する要因と当該相違の妥当性とを評価し、実行結果の相違する箇所と相違の要因と相違の妥当性とを示す情報を出力する。
また、1つの態様では、コンピュータによって実行される検証プログラムであって、変数に応じた処理を示す複数のプログラム要素を含むプログラムの検証に用いられる検証プログラムが提供される。この検証プログラムは、コンピュータに、プログラムの実行時に、過去に当該プログラムを実行したときに対して入力内容が変更された変数を識別する情報、および、プログラム要素と当該プログラム要素が実行されることで出力される実行結果との対応を示す情報を含むログを取得し、プログラムの何れかの実行結果が過去の実行結果と相違するとき、ログを参照して、当該実行結果に対応するプログラム要素および当該プログラム要素に用いられる変数を検索し、当該変数に対する入力内容の変更状況に基づいて、実行結果が相違する要因と当該相違の妥当性とを評価し、実行結果の相違する箇所と相違の要因と相違の妥当性とを示す情報を出力する、処理を実行させる。
1つの側面では、実行結果が相違する要因の適切な把握を支援できる。
本発明の上記および他の目的、特徴および利点は本発明の例として好ましい実施の形態を表す添付の図面と関連した以下の説明により明らかになるであろう。
第1の実施の形態の検証装置を示す図である。 第2の実施の形態の情報処理システムを示す図である。 配備サーバのハードウェア例を示す図である。 配備サーバの機能例を示す図である。 記憶部に格納されるデータの例を示す図である。 配備プログラムに含まれるブロックの例を示す図である。 配備プログラムの例を示す図である。 変換後配備プログラムの例を示す図である。 自由変数テーブルの例を示す図である。 システムコールログの例を示す図である。 システムコールログの例(続き)を示す図である。 ログテーブルの例を示す図である。 検証処理の全体を示すフローチャートである。 配備プログラムの変換例を示すフローチャートである。 配備プログラムの冪等性の検証例を示すフローチャートである。 ログに基づく変数の分析例を示すフローチャートである。 検証結果の出力例(その1)を示す図である。 検証結果の出力例(その2)を示す図である。 検証結果の出力例(その3)を示す図である。 配備プログラムの他の例を示す図である。 BNF記法で記したプログラムの例を示す図である。 プログラム変換用の関数の記述例(その1)を示す図である。 プログラム変換用の関数の記述例(その2)を示す図である。 プログラム変換用の関数の記述例(その3)を示す図である。 配備プログラムの他の変換例を示す図である。 ログの出力フォーマットの例を示す図である。
以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の検証装置を示す図である。検証装置1は、プログラム2の検証に用いられる。プログラム2は、プログラム要素2a,2b,2cを含む。ここで、プログラム要素とは、所定の変数に応じた処理(の実行)を示す命令や関数(あるいは命令の集合)等である。プログラム要素2aは変数Aに応じた処理を示す。プログラム要素2bは変数Bに応じた処理を示す。プログラム要素2cは変数Cに応じた処理を示す。
検証装置1は、記憶部1aおよび演算部1bを有する。記憶部1aは、RAM(Random Access Memory)等の揮発性記憶装置でもよいし、HDD(Hard Disk Drive)やフラッシュメモリ等の不揮発性記憶装置でもよい。演算部1bは、CPU(Central Processing Unit)、DSP(Digital Signal Processor)、ASIC(Application Specific Integrated Circuit)、FPGA(Field Programmable Gate Array)等を含み得る。演算部1bはプログラムを実行するプロセッサであってもよい。ここでいう「プロセッサ」には、複数のプロセッサの集合(マルチプロセッサ)も含まれ得る。
記憶部1aは、プログラム2の実行状況を示すログ3を記憶する。プログラム2は、検証装置1で実行されるものでもよいし、他の情報処理装置で実行されるものでもよい。検証装置1で実行される場合、演算部1b自身がログ3を記録できる。他の情報処理装置で実行される場合、演算部1bは、他の情報処理装置からネットワークを介して、ログ3の内容を取得し、記録できる。このように、演算部1bは検証装置1および他の情報処理装置の何れでプログラム2が実行されても、ログ3を取得し、記憶部1aに格納できる。
演算部1bは、プログラム2の実行時に、過去にプログラム2を実行したときに対して入力内容が変更された変数を識別する情報を含むログ3を取得する。変数の入力内容の情報はプログラム2に含まれてもよいし、プログラム2とは別個のデータで用意されてもよい。
例えば、演算部1bは、変数の入力内容の情報がプログラム2自体に含まれていれば、過去にプログラム2が実行されたときのプログラム2の内容と、今回実行されるプログラム2の内容とを対比することで、入力内容の変更された変数を検出し得る。あるいは、変数の入力内容の情報がプログラム2とは別個のデータとして用意されていれば、演算部1bは、当該データの過去の内容と今回の内容とを対比することで、入力内容の変更された変数を検出し得る。両方の方法を用いて、入力内容の変更された変数を検出してもよい。なお、過去に実行されたプログラム2や入力内容の情報は記憶部1aに記憶される。
例えば、過去の実行時の一例として、今回の実行時の直前の実行時(前回の実行時)が考えられる。例えば、この場合、演算部1bは、前回の実行時と今回の実行時とで入力内容が変更された変数を識別する情報をログ3に記録する。例えば、前回の各変数の入力内容は次の通りであるとする。A=1。B=1。C=A+1。これに対し、今回の各変数の入力内容は次の通りであるとする。A=2。B=1。C=A+1。
この場合、変数Aの入力内容は、前回と今回とで変更されている。変数Bの入力内容は、前回と今回とで変更されていない。変数Cの定義自体は前回と今回とで変更されていないが、変数Cは変数Aに依存する。変数Aの入力内容は前回と今回とで変更されているから、変数Cの入力内容も前回と今回とで変更されている。よって、この場合、演算部1bは、変数A,Cが変更されていることをログ3に記録する。
また、演算部1bは、プログラム2の実行時に、プログラム要素と当該プログラム要素が実行されることで出力される実行結果との対応を示す情報をログ3に記録する。例えば、プログラム2の実行に伴って、プログラム要素2aでは“$A+1”($Aは変数Aに代入されている値を示す。以下、同様)を計算し、その実行結果として“result1.dat”を出力する。プログラム要素2bでは“$B\*2”を計算し(“\*”は乗算を示す)、その実行結果として“result2.dat”を出力する。プログラム要素2cでは“$C+1”を計算し、その実行結果として“result3.dat”を出力する。
この場合、演算部1bは、プログラム要素2aと実行結果“result1.dat”との対応をログ3に記録する。プログラム要素2bと実行結果“result2.dat”との対応をログ3に記録する。プログラム要素2cと実行結果“result3.dat”との対応をログ3に記録する。演算部1bは、プログラム2の各実行結果を、過去の分についても記憶部1aに格納しておく。
演算部1bは、プログラム2の何れかの実行結果が過去の実行結果と相違するとき、記憶部1aに記憶されたログ3を参照して、当該実行結果に対応するプログラム要素および当該プログラム要素に用いられる変数を検索する。
例えば、実行結果“result1.dat”の内容は前回(“2”)と今回(“3”)とで相違する。よって、演算部1bは、ログ3を参照して、当該実行結果に対応するプログラム要素2aとプログラム要素2aに用いられる変数Aとを検索する。また、実行結果“result2.dat”の内容は前回(“4”)と今回(“2”)とで相違する。よって、演算部1bは、ログ3を参照して、当該実行結果に対応するプログラム要素2bとプログラム要素2bに用いられる変数Bとを検索する。また、実行結果“result3.dat”の内容は前回(“3”)と今回(“4”)とで相違する。よって、演算部1bは、ログ3を参照して、当該実行結果に対応するプログラム要素2cとプログラム要素2cに用いられる変数Cとを検索する。演算部1bは、各プログラム要素に用いられる各変数をプログラム2の記述から検索してもよい。または、プログラム要素と変数との一覧を予め用意しておき、当該一覧からプログラム要素に用いられる変数を検索してもよい。
演算部1bは、記憶部1aに記憶されたログ3を参照し、検索された変数に対する入力内容の変更状況に基づいて、実行結果が相違する要因と当該相違の妥当性とを評価し、評価結果と実行結果が異なる箇所とを示す情報を出力する。ここで、結果の妥当性の基準は、プログラム2に対して期待される性質による。例えば、プログラム2に冪等性(同じ入力に対しては、何回実行しても同じ結果が得られる性質)を求めるなら、同じ入力に対して同じ結果が得られるときに、その結果は妥当である。一方、同じ入力に対して同じ結果が得られなければ、その結果は妥当でない。プログラム2に冪等性を求める場合を考えると、演算部1bの出力は次のようになる。
例えば、ログ3には、前述のように変数Aの入力内容に変更があったことが記録されている。この場合、プログラム要素2aの変数Aの入力内容の変更が、前回と今回との実行結果の相違の要因であると考えられる。したがって、演算部1bは、(a1)プログラム要素2aの変数Aに対する入力内容の変更があったことを相違の要因として出力する。また、(a2)プログラム要素2aに対する入力が変わっているから実行結果の相違は妥当である旨を出力する。更に、(a3)相違する実行結果“result1.dat”の情報を出力する(当該データ内の相違箇所を出力してもよい。以下、同様)。
また、ログ3には、変数Bの入力内容に変更があったことが記録されていない。この場合、プログラム要素2bに対する入力が変更されていないにも関わらず、その実行結果が前回と今回とで相違していることになる。したがって、プログラム要素2bは、冪等性がないと考えられる。よって、演算部1bは、(b1)プログラム要素2bを相違の要因として出力する。また、(b2)プログラム要素2bは冪等性がないから実行結果の相違は妥当ではない旨を出力する。更に、(b3)相違する実行結果“result2.dat”の情報を出力する。
また、ログ3には、前述のように変数Cの入力内容に変更があったことが記録されている。この場合、プログラム要素2cの変数Cの入力内容の変更が、前回と今回との実行結果の相違の要因であると考えられる。したがって、演算部1bは、(c1)プログラム要素2cの変数Cに対する入力内容の変更があったことを相違の要因として出力する。また、(c2)プログラム要素2cに対する入力が変わっているから実行結果の相違は妥当である旨を出力する。更に、(c3)相違する実行結果“result3.dat”の情報を出力する。
検証装置1によれば、演算部1bにより、プログラム2の実行時に、過去にプログラム2を実行したときに対して入力内容が変更された変数A,Cを識別する情報、および、プログラム要素2a,2b,2cとプログラム要素2a,2b,2cが実行されることで出力される各実行結果との対応を示す情報がログ3に記録される。演算部1bにより、プログラム2の何れかの実行結果が過去の実行結果と相違するとき、ログ3が参照されて、当該実行結果に対応するプログラム要素および当該プログラム要素に用いられる変数が検索される。演算部1bにより、ログ3が参照されて、検索された当該変数に対する入力内容の変更状況に基づいて、実行結果が相違する要因と当該相違の妥当性とが評価され、評価結果と実行結果の異なる箇所とを示す情報が出力される。
これにより、実行結果が相違する要因の適切な把握を支援できる。例えば、ユーザは、上記出力(a1)〜(a3)および(c1)〜(c3)を参照することで、プログラム要素2a,2cの実行結果に相違がみられるものの、変数A,Cに対する入力内容が変更されたことに起因しており妥当であると適切かつ迅速に判断できる。
ここで、単に、プログラム要素2a,2c自体の内容が過去の実行時と書き換わっているかを確認すること(静的解析)も考えられる。しかし、プログラム要素2a,2c自体の内容が過去の実行時と同一であっても、実行結果が相違することがあり、静的解析のみでは当該相違の要因や妥当性の判断を行うのは難しい。これに対し、検証装置1を用いることで、プログラム要素2a,2c自体の内容が書き換わっていない場合でも、上記のように実行結果の相違の要因と妥当性の判断を適切に行える。
また、ユーザは、上記の出力(b1)〜(b3)を参照することで、プログラム要素2bの実行結果の相違は妥当でないことを適切かつ迅速に判断できる。具体的には、当該相違は入力の変更によるものではなく、プログラム要素2bが求められる性質(例えば、冪等性)をもっていないことに起因していることを容易に把握できる。このため、ユーザは、プログラム要素2bの見直しを迅速に開始できる。例えば、プログラム要素2b自体の処理に問題があったのか、プログラム要素2bが過去の記述から書き換えられたのか等の判断作業を迅速に行える。
このように、過去の実行結果と相違する実行結果に対して、その妥当性と要因とを出力することで、ユーザによる要因分析の作業やプログラムの修正作業の省力化を図れる。その結果、プログラム開発における作業コストの軽減にも寄与し得る。
演算部1bは、プログラム2を実行する検証装置1または他の情報処理装置がログ3を生成するように、プログラム2を変換してもよい。あるいは、そのような変換後のプログラムがプログラム2であると考えてもよい。そうすれば、ログ3を出力するためのコードのプログラム2への挿入をユーザに強いずに済み、効率的な検証作業を支援できる。
ここで、変数に対する入力内容が変更されているか否かの判断には種々の方法が考えられる。上記のように、(1)今回と前回との入力内容を直接対比して変更の有無を判断してもよい。(2)変数Zのように、第1の変数の代入文の中に含まれる第2の変数を検出して、当該第2の変数に対する入力内容の変更の有無から、第1の変数に対する入力内容の変更の有無を判断してもよい。
また、(3)1つの変数に対する代入文が条件式の複数の節(then節、else節等)それぞれに記述されている場合には、当該変数の入力内容に変更があるとみなしてログ3に出力するようにしてもよい。条件式の実行結果に応じて当該変数の代入値が変更される可能性が高いからである。(1)〜(3)のような方法を採れば、各変数の入力内容の変更の有無を適切に検出して、ログ3に出力するようプログラム2を変換できる。
このとき、演算部1bは、各プログラム要素の記述を過去に実行したときと対比することで、各プログラム要素自体のコード変更の有無を判断して、ログ3に出力するようにしてもよい。このようにすれば、プログラム要素自体のコード変更を加味して、結果データの相違の妥当性を検証できる。例えば、前回と今回とで、プログラム要素2bにコード変更があるなら、前回と今回とで結果が相違しても当該相違を妥当と評価することが考えられる。これにより、ユーザの作業負担を一層軽減でき、効率的な検証作業を支援できる。
プログラム2の具体例として、仮想マシンやソフトウェア等を情報処理装置に配備する配備プログラムが挙げられる。以下では、配備プログラムの検証を行う場合を想定して更に詳細に説明する。ただし、他の種類のプログラムに対する適用を妨げるものではない。
[第2の実施の形態]
図2は、第2の実施の形態の情報処理システムを示す図である。第2の実施の形態の情報処理システムは、配備サーバ100および配備先サーバ200,300,400を含む。配備サーバ100および配備先サーバ200,300,400は、ネットワーク10に接続されている。ネットワーク10は、LAN(Local Area Network)でもよいし、WAN(Wide Area Network)やインターネット等の広域ネットワークでもよい。
配備サーバ100は、配備先サーバ200,300,400に対する仮想マシンや所定のソフトウェアの配備(以下、単に仮想マシンの配備という)を制御するサーバコンピュータである。配備サーバ100は、配備プログラムを用いて仮想マシンの配備を行う。配備プログラムの例としては、chef、puppetおよびrundeck等が考えられる。
例えば、ユーザは、情報処理システムの仕様に応じて、配備プログラムを作成し、配備サーバ100に実行させる。配備プログラムには、ユーザにより、ディスク、ネットワークおよびユーザアカウント等の設定を行うための一連の命令(スクリプト)を示すコードが記述される。配備プログラムを配備用のスクリプトと呼んでもよい。配備サーバ100は、配備プログラムに記述された内容に従って、ディスク、ネットワークおよびユーザアカウント等の設定を配備先サーバ200,300,400に実行させる。
配備先サーバ200,300,400は、複数の仮想マシンを実行可能なサーバコンピュータである。例えば、配備先サーバ200,300,400は、ハイパーバイザと呼ばれるソフトウェアを実行する。ハイパーバイザは、配備先サーバ200,300,400のCPUやRAM等のリソースを仮想マシンに割り当てる。例えば、配備先サーバ200では、割り当てられたリソースを用いて仮想マシンV1,V2が実行される。配備先サーバ200,300,400は、配備サーバ100の指示に従って、仮想マシンの動作環境を設定する。例えば、配備先サーバ200,300,400には、配備サーバ100と連携する配備用のクライアントアプリケーションが実行される。
ここで、配備プログラムでは、設定内容が同じである複数の仮想マシンの配備手順が1つの配備プログラム中に記述されることが多い。また、多数の仮想マシンが1つの配備プログラムによって配備先サーバ200,300,400に配備され得る。このような情報処理システムでは、何れかの仮想マシンで配備の失敗が起こったとしても、何れの仮想マシンの何れの設定で失敗が起こったかを把握して、設定内容を個別に訂正するのは作業に時間がかかり非効率的である。そこで、そのような場合は、全ての仮想マシンの配備を配備プログラムにより再実行する。設定内容を個別に検査して訂正するよりも全ての仮想マシンの配備をやり直した方が効率的だからである。
例えば、複数の仮想マシンの配備を配備プログラムにより行う場合、配備手順で一部失敗があった仮想マシンが存在しても、当該仮想マシンを指定することなく、全ての仮想マシンの再配備を行う。また、例えば、当該仮想マシンにアカウント追加を行おうとする場合、アカウント設定のプログラムを別個に用意せずに、配備プログラムに入力するパラメータを変更し、配備プログラム全体を再実行する。
このような作業を行うに当たり、配備プログラムには冪等性が求められる。具体的には、配備の手順に失敗していない同一の仮想マシンの再配備を行っても結果が変わらないことが望まれる。また、例えば、変更された設定(例えば、アカウント設定)とは関係ない設定(例えば、ネットワーク設定)に対して、再配備後も設定結果が変わらないことが望まれる。
そこで、第2の実施の形態では配備プログラムの冪等性の検証を支援する機能を提供する。当該検証は、例えば、1台の配備先サーバ(例えば、配備先サーバ200)を用いて行える。以下では、配備先サーバ200を用いて検証を行うことを想定する。
図3は、配備サーバのハードウェア例を示す図である。配備サーバ100は、プロセッサ101、RAM(Random Access Memory)102、HDD(Hard Disk Drive)103、通信部104、画像信号処理部105、入力信号処理部106、ディスクドライブ107および機器接続部108を有する。各ユニットが配備サーバ100のバスに接続されている。配備先サーバ200,300,400も配備サーバ100と同様のユニットを用いて実現できる。
プロセッサ101は、配備サーバ100の情報処理を制御する。プロセッサ101は、マルチプロセッサであってもよい。プロセッサ101は、例えばCPU、MPU(Micro Processing Unit)、DSP、ASIC、FPGAまたはPLD(Programmable Logic Device)等である。プロセッサ101は、CPU、MPU、DSP、ASIC、FPGA、PLDのうちの2以上の要素の組み合わせであってもよい。
RAM102は、配備サーバ100の主記憶装置である。RAM102は、プロセッサ101に実行させるOS(Operating System)のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、RAM102は、プロセッサ101による処理に用いる各種データを記憶する。
HDD103は、配備サーバ100の補助記憶装置である。HDD103は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。HDD103には、OSのプログラム、アプリケーションプログラム、および各種データが格納される。配備サーバ100は、フラッシュメモリやSSD(Solid State Drive)等の他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
通信部104は、ネットワーク10を介して他のコンピュータと通信を行えるインタフェースである。通信部104は、有線インタフェースでもよいし、無線インタフェースでもよい。
画像信号処理部105は、プロセッサ101からの命令に従って、配備サーバ100に接続されたディスプレイ11に画像を出力する。ディスプレイ11としては、CRT(Cathode Ray Tube)ディスプレイや液晶ディスプレイ等を用いることができる。
入力信号処理部106は、配備サーバ100に接続された入力デバイス12から入力信号を取得し、プロセッサ101に出力する。入力デバイス12としては、例えば、マウスやタッチパネル等のポインティングデバイス、キーボード等を用いることができる。
ディスクドライブ107は、レーザ光等を利用して、光ディスク13に記録されたプログラムやデータを読み取る駆動装置である。光ディスク13として、例えば、DVD(Digital Versatile Disc)、DVD−RAM、CD−ROM(Compact Disc Read Only Memory)、CD−R(Recordable)/RW(ReWritable)等を使用できる。ディスクドライブ107は、例えば、プロセッサ101からの命令に従って、光ディスク13から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
機器接続部108は、配備サーバ100に周辺機器を接続するための通信インタフェースである。例えば、機器接続部108にはメモリ装置14やリーダライタ装置15を接続できる。メモリ装置14は、機器接続部108との通信機能を搭載した記録媒体である。リーダライタ装置15は、メモリカード16へのデータの書き込み、またはメモリカード16からのデータの読み出しを行う装置である。メモリカード16は、カード型の記録媒体である。機器接続部108は、例えば、プロセッサ101からの命令に従って、メモリ装置14またはメモリカード16から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
図4は、配備サーバの機能例を示す図である。配備サーバ100は、記憶部110、プログラム変換部120、配備実行部130および検証部140を有する。記憶部110は、RAM102またはHDD103に確保した記憶領域として実現できる。プログラム変換部120、配備実行部130および検証部140は、プロセッサ101が実行するソフトウェアのモジュールとして実現できる。
記憶部110は、プログラム変換部120、配備実行部130および検証部140の処理に用いられる各種のデータを記憶する。例えば、記憶部110が記憶するデータには、配備プログラムや配備プログラムの実行に伴って生成されたログ等が含まれる。配備プログラムは、ユーザによって作成され、記憶部110に予め格納される。
プログラム変換部120は、記憶部110に記憶された配備プログラムを変換することで、変換後配備プログラムを生成する。プログラム変換部120は、変換後配備プログラムを記憶部110に格納する。具体的には、プログラム変換部120は次の変換を行う。
第1に、プログラム変換部120は、配備プログラムの変数に対する前回の入力内容と今回の入力内容とを比較し、入力内容が変更されている変数を検出する。そして、プログラム変換部120は、当該変数について入力内容が変更されている旨を示すログを出力するように配備プログラムを変換する。
第2に、プログラム変換部120は、配備プログラム内のコードを設定内容で区分したブロック(ブロックID(IDentifier)で識別される)という単位でラベリングする。プログラム変換部120は、各ブロックの実行を示すログを出力するように配備プログラムを変換する。すると、後述するように、ブロックと、ブロック内のコードが実行されることで出力された結果データ(実行結果)との対応をログにより容易に識別可能となる。また、ブロックと変数との対応関係を事前に把握しておけば、ログにより、結果データに関与した変数を容易に識別できる。ここで、ブロックは、第1の実施の形態のプログラム要素の一例である。
配備実行部130は、プログラム変換部120により生成された変換後配備プログラムの内容を配備先サーバ200に提供することで、配備先サーバ200に仮想マシン群を配備する。配備先サーバ200は、変換後配備プログラムの記述に従って、当該変換後配備プログラムの実行状況を示すログを生成し、配備実行部130に提供する。配備実行部130は、当該ログを記憶部110に格納する。また、配備実行部130は、配備先サーバ200から仮想マシンの配備に伴って作成された複数の結果データを取得し、記憶部110に格納する。記憶部110には、配備プログラムの実行毎に、各結果データが取得され保持される。
検証部140は、記憶部110に記憶されたログおよび結果データを分析することで、配備プログラムの冪等性を検証する。検証部140による検証の対象となる場合は、前回とは異なる内容の結果データが得られた場合である。第2の実施の形態の情報処理システムでは、仮想マシンの動作環境の仕様は適宜変更され得る。それに伴い、ユーザにより、ブロックに対する変数の入力内容が変更されたり、ブロック内のコードが書き換えられたりする。このため、結果データの相違を調べるのみでは、冪等性の検証には不十分である。結果データを出力したブロックへの入力が変更されている可能性があるからである。
そこで、検証部140は、上記ログを参照して、前回と相違する結果データに対応するブロックと、当該ブロックに用いられる変数とを検索する。更に、検証部140は、当該ログを参照して、検索した変数に対する入力内容の変更状況を把握する。検証部140は、ブロックの変数に対する入力内容の変更状況に基づいて、結果データの相違が相違する要因と相違の妥当性を評価する。検証部140は、当該評価結果と前回とは異なる内容となった結果データとを出力する。例えば、検証部140は、ディスプレイ11に出力内容を表示させる。
図5は、記憶部に格納されるデータの例を示す図である。記憶部110は、旧配備プログラム111、配備プログラム112、変換後配備プログラム113、自由変数テーブル114、システムコールログ115、ログテーブル116、旧結果データ群117および結果データ群118を記憶する。
旧配備プログラム111は、前回の仮想マシンの配備を行うために、ユーザにより作成された配備プログラムである。配備プログラム112は、今回の仮想マシンの配備を行うために、ユーザにより作成された配備プログラムである。
変換後配備プログラム113は、プログラム変換部120により配備プログラム112が変換されることで生成された変換後の配備プログラムである。前述のように、プログラム変換部120は、変数およびブロックに関する所定のログを記録できるように、配備プログラム112を変換し、変換後配備プログラム113を生成する。
自由変数テーブル114は、配備プログラムに用いられている自由変数と、当該自由変数が用いられているブロックとの対応関係を登録した情報である。自由変数とは、当該ブロック内で束縛されない(ブロック内のコードによって代入値が限定されない)変数である。自由変数は、ブロック外部から与えられる入力であるということもできる。以下の説明では、単に変数という場合は、自由変数(ただし、自由変数を強調したい場合には、自由変数と明示することもある)を指すものとする。
システムコールログ115は、配備先サーバ200で仮想マシンの配備に伴って生成されたシステムコールログである。システムコールログ115には、変換後配備プログラム113に基づく所定のログ(変数やブロックに関するログ)が含まれる。例えば、配備先サーバ200のOSにUnix(登録商標)を用いるならtrussコマンドによりシステムコールログを得ることができる。あるいは、配備先サーバ200のOSにLinux(登録商標)を用いるならstraceコマンドによりシステムコールログを得ることができる。例えば、配備実行部130は、変換後配備プログラム113を用いた配備を行う前に、配備先サーバ200により、これらのコマンドを実行させ、システムコールログを取得可能な状態にしておく。
ログテーブル116は、システムコールログ115を変換した情報である。ログテーブル116には、入力内容の変更された変数を識別する情報が含まれる。ログテーブル116には、ブロックと当該ブロックの処理により出力された結果データとの対応が含まれる。
旧結果データ群117は、前回の配備により配備先サーバ200で生成された旧結果データの集合である。例えば、旧結果データには、仮想マシンの配備に伴って生成されたネットワーク、アカウントおよび各種ソフトウェアの動作用のパラメータ等を設定したデータが含まれる。
結果データ群118は、今回の配備により配備先サーバ200で生成された結果データの集合である。旧結果データ群117と同様に、当該結果データには、仮想マシンの配備に伴って生成されたネットワーク、アカウントおよび各種ソフトウェアの動作用のパラメータ等を設定したデータが含まれる。
ここで、システムコールログ115、旧結果データ群117および結果データ群118は、配備先サーバ200が備える記憶装置に格納されてもよい。その場合、配備サーバ100は、配備サーバ100の処理に応じて、配備先サーバ200からこれらの情報を取得することができる。
図6は、配備プログラムに含まれるブロックの例を示す図である。配備プログラム112は、仮想マシンの動作環境を設定するための各種のブロック(プログラム要素)を含む。通常、1つの設定項目は、配備プログラムの一部分に連続して記述される。具体的には、配備プログラム112は、ディスク設定部分B1、ディレクトリ設定部分B2、ネットワーク設定部分B3、アカウント設定部分B4、NFS(Network File System)設定部分B5およびDB(DataBase)設定部分B6を含む。
ディスク設定部分B1は、ハードディスクに対するデバイスファイルの作成を行うブロックである。ディレクトリ設定部分B2は、ディレクトリの作成を行うブロックである。ネットワーク設定部分B3は、ネットワークに関する設定を行うブロックである。アカウント設定部分B4は、ユーザのアカウント設定を行うブロックである。NFS設定部分B5は、NFSサーバの設定を行うブロックである。DB設定部分B6は、DBMS(DataBase Management System)の設定を行うブロックである。
配備プログラム112の記述に従えば、ディスク設定、ディレクトリ設定、ネットワーク設定、アカウント設定、NFS設定およびDB設定が上側から下側へ順番に行われることになる。なお、仮想マシンの各項目の設定を上記順序で行うことは一例である。例示した項目以外の設定が行われてもよいし、任意の順序で行える設定については、順番を入れ替えてもよい。例示した項目の代わりに他の項目の設定が行われてもよい。
ここで、後述するように、プログラム変換部120は、配備プログラム112の各ブロックを識別してブロックIDでラベリングする。具体的には、ディスク設定部分B1のブロックIDを“1”とする。ディレクトリ設定部分B2のブロックIDを“2”とする。ネットワーク設定部分B3のブロックIDを“3”とする。アカウント設定部分B4のブロックIDを“4”とする。NFS設定部分B5のブロックIDを“5”とする。DB設定部分B6のブロックIDを“6”とする。
図7は、配備プログラムの例を示す図である。図7では、旧配備プログラム111および配備プログラム112の一部の内容を例示している。以下、旧配備プログラム111および配備プログラム112の内容を図7に付した行番号により指し示す(なお、省略された行については、省略が1行か複数行かに関わらず、1つの行番号(例えば、“1”)を付している。以下、同様)。
旧配備プログラム111について、各行には次のような記述がある。2行目は“DISK=“/dev/hda1””である。4行目は“W=“pochi””である。5行目は“X=“192.168.0.1””である。6行目は“Y=“taro””である。7行目は“Z=f(X)”である。9行目は“execute “pvcreate #{DISK}” do command “pvcreate #{DISK}””である。10行目は“end”である。ここで、変数Zの定義に含まれる“f(X)”は、変数Xを用いた所定の関数を示している(変数Zの定義の記述の中に変数Xが含まれている)。すなわち、変数Zは変数Xに依存する。例えば、“f(x)”は変数Xで示されるIP(Internet Protocol)アドレスのホストアドレス部に対して、1を加算したIPアドレスを得る演算である(ただし、変数Xに対する別の演算でもよい)。
配備プログラム112について、各行には次のような記述がある。2行目は“DISK=“/dev/hda0””である。4行目は“W=“pochi””である。5行目は“X=“192.168.10.1””である。6行目は“Y=“jiro””である。7行目は“Z=“f(X)””である。9行目は“execute “pvcreate #{DISK}” do command “pvcreate #{DISK}””である。10行目は“end”である。
旧配備プログラム111および配備プログラム112を参照すると、プログラムの構文の特徴から次のことが分かる。配備プログラムの構文の規約では、等号“=”を用いて変数に数値や文字列等の値の代入を記述し、等号の左側に変数を記述することになっている。よって、2行目および4行目〜7行目は、それぞれ、変数DISK,W,X,Y,Zに対する代入文である。
また、配備プログラムの構文の規約では、コマンド“execute”および“end”を用い、これら2つのコマンドの間に1つの設定内容を記述することになっている。9行目には、設定の実行を示すコマンド“execute”が記述されている。更に、続く10行目には、1つの設定の終わりを示す“end”が記述されている。したがって、9行目〜10行目で1つの設定内容となる。この場合、9行目〜10行目は1つのブロックである。
また、配備プログラムの構文の規約では、ブロック内で変数に代入された値を利用する場合、シャープ記号“#”に続けて中括弧“{}”で変数名(“DISK”や“X”等)を括ることになっている。9行目には文字列“#{DISK}”が含まれている。したがって、9行目〜10行目のブロックは、変数DISKを用いるブロックである。
更に、旧配備プログラム111と配備プログラム112とを対比すると、配備プログラム112の上記各行について次のことが分かる。2行目の記述は変更されている。4行目の記述は変更されていない。5行目の記述は変更されている。6行目の記述は変更されている。7行目の記述は変更されていない(ただし、後述するように変数Zへの代入値に関しては別の判断となる)。9行目の記述は変更されていない。10行目の記述は変更されていない。
プログラム変換部120は、上記のように構文上の規約に従って、旧配備プログラム111や配備プログラム112から、変数やブロックを抽出することができる。その際に用いる構文上の規約は、プログラム変換部120に予め与えられる。
図8は、変換後配備プログラムの例を示す図である。変換後配備プログラム113は、プログラム変換部120により配備プログラム112が変換された結果である。以下、変換後配備プログラム113の内容を図8に付した行番号により指し示す。変換後配備プログラム113には例えば次の記述がある。
2行目は“DISK=“/dev/hda0””である。3行目は“log_write(“DISK changed”)”である。5行目は“W=“pochi””である。6行目は“X=“192.168.10.1””である。7行目は“log_write(“X changed”)”である。
8行目は“Y=jiro”である。9行目は“log_write(“Y changed”)”である。10行目は“Z=f(X)”である。11行目は“log_write(“Z changed;use X”)”である。
13行目は“log_write(“block 1 enter”)”である。14行目は“execute “pvcreate #{DISK}” do command “pvcreate #{DISK}””である。15行目は“end”である。16行目は“log_write(“block 1 exit”)”である。
このうち、3,7,9,11,13,16行目は、プログラム変換部120により挿入されたコードである。
ここで、関数“log_write(“<文字列>”)”は、“<文字列>”部分に記述された文字列を、配備先サーバ200により、システムコールログ115に出力させるものである。当該関数は配備先サーバ200の関数ライブラリに予め登録されている。
例えば、“log_write(“DISK changed”)”であれば、配備先サーバ200は“DISK changed”の文字列をシステムコールログ115に出力する。これは、変数DISKの入力内容が変更されていることを示している。
また、11行目の記述“log_write(“Z changed;use X”)”は、変数Zに対する入力内容が変更されていることを示している。特に、当該記述において、“use X”の部分は、変数Zの入力内容が変数Xの入力内容に依存していることを示す。図7の例示では変数Zの定義自体は変更されていない。しかし、変数Xの入力内容が変更されていれば、プログラム変換部120は変数Zの入力内容も変更されているとみなす。
更に、13行目の記述“log_write(“block 1 enter”)”および16行目の記述“log_write(“block 1 exit”)”は、14行目〜15行目で記述されたブロックの実行開始および終了を示す。変換後配備プログラム113の14行目〜15行目は、配備プログラム112の9行目〜10行目に対応している。プログラム変換部120は、これらのコードを挿入することで、当該ブロックをブロックID“1”としてラベリングしている。
図9は、自由変数テーブルの例を示す図である。自由変数テーブル114は、プログラム変換部120により生成される。自由変数テーブル114には、ブロックIDおよび自由変数集合の項目が含まれる。ブロックIDの項目には、ブロックIDが登録される。自由変数集合の項目には、当該ブロックIDで示されるブロックで利用される自由変数の集合が登録される。
例えば、自由変数テーブル114には、ブロックIDが“1”、自由変数集合が“DISK”という情報が登録される。これは、ブロックID“1”のブロックにおいて、自由変数DISKが用いられていることを示す。
また、自由変数テーブル114には、ブロックIDが“2”、自由変数集合が設定なし“−(ハイフン)”という情報が登録されている。これは、ブロックID“2”のブロックにおいて、利用される自由変数がないことを示す。
また、自由変数テーブル114には、ブロックIDが“3”、自由変数集合が“W,X”という情報が登録されている。これは、ブロックID“3”のブロックにおいて、自由変数W,Xが用いられていることを示す。
図10は、システムコールログの例を示す図である。システムコールログ115は、配備先サーバ200によって生成される。以下、システムコールログ115の内容を図10に付した行番号により指し示す。システムコールログ115には例えば次の記述がある。
2行目は“open f”である。“f”は所定のファイルを示す。2行目は“f”で示されるファイルのオープン処理である。3行目は“write f “DISK changed””である。“f”で示されるファイルに“DISK changed”を書き込んだことを示す。4行目は“close f”である。“f”で示されるファイルのクローズ処理である。
6行目〜8行目(“f”への“X change”の書き込み)、10行目〜12行目(“f”への“Y changed”の書き込み)、14行目〜16行目(“f”への“Z changed;use X”)も同様の処理を示している。また、18行目〜20行目(“f”への“block 1 enter”の書き込み)、26行目〜28行目(“f”への“block 1 exit”の書き込み)も同様の処理を示している。
22行目は、“open /var/log/messages”である。“/var/log/messages”ファイルのオープン処理である。23行目は“write /var/log/messages “/dev/hda0 created””である。同ファイルに“/dev/hda0 created”を書き込んだことを示す。24行目は“close /var/log/messages”である。同ファイルのクローズ処理である。
図11は、システムコールログの例(続き)を示す図である。更に、システムコールログ115には例えば次の記述がある。31行目〜33行目、40行目〜42行目、44行目〜46行目、52行目〜54行目、56行目〜58行目、64行目〜66行目は、前述の18行目〜20行目および26行目〜28行目と同様である(記録されているブロックIDが異なる)。
また、35行目は、“open /etc/hosts”である。“/etc/hosts”ファイルのオープン処理である。36行目は、“write /etc/hosts “127.0.0.1 localhost””である。同ファイルに“127.0.0.1 localhost”を書き込んだことを示す。37行目は、“write /etc/hosts “192.168.10.1 pochi””である。同ファイルに“192.168.10.1 pochi”を書き込んだことを示す。38行目は、“close /etc/hosts”である。同ファイルのクローズ処理である。
また、48行目は、“open /etc/passwd”である。“/etc/passwd”ファイルのオープン処理である。49行目は、“write /etc/passwd “jiro ...””である。同ファイルに“jiro ...”を書き込んだことを示す。50行目は“close /etc/passwd”である。同ファイルのクローズ処理である。
また、60行目は、“open /etc/exports”である。“/etc/exports”ファイルのオープン処理である。61行目は、“write /etc/exports “/home/nfs 192.168.10.2/24 (rw)””である。同ファイルに“/home/nfs 192.168.10.2/24 (rw)”を書き込んだことを示す。62行目は“close /etc/exports”である。同ファイルのクローズ処理である。
図12は、ログテーブルの例を示す図である。ログテーブル116は、システムコールログ115に基づいて検証部140により生成される。ログテーブル116は、ブロックIDおよびログの項目を含む。ブロックIDの項目にはブロックIDが登録される。ただし、ブロックIDの登録がないレコードもある。ブロックIDの登録がない場合、当該レコードは変数に対する入力内容の変更に関するものである。ログの項目には、ログの記述内容が登録される。
例えば、ログテーブル116には、ブロックIDが設定なし“−”、ログが“DISK changed”という情報が登録されている。これは、図10で例示したシステムコールログ115の3行目の記述に対応している(“write f”の記述は後の処理で用いないため省いている。以下、同様)。当該レコードは変数DISKが変更されたことを示す。他の変数X,Y,Zに関するレコードも同様の意味である。
また、ログテーブル116には、ブロックIDが“1”、ログが“block 1 enter”という情報が登録されている。これは、図10で例示したシステムコールログ115の19行目の記述に対応している。当該レコードは、ブロックID“1”のブロックに対して、ブロックの実行開始を示すログ“block 1 enter”が記録されたことを示す。また、以降の記述がブロックID“1”のブロックに関するものであることを示す。
また、ログテーブル116には、ブロックIDが“1”、ログが“write /var/log/messages “/dev/hda0 created””という情報が登録されている。これは、図10で例示したシステムコールログ115の23行目の記述に対応している。当該レコードは、ブロックID“1”のブロックの処理により、“/dev/hda0”というデバイスファイルが作成され、その結果が“/var/log/messages”ファイルに書き込まれたことを示す。
更に、ログテーブル116には、ブロックIDが“1”、ログが“block 1 exit”という情報が登録されている。これは、図10で例示したシステムコールログ115の27行目の記述に対応している。当該レコードは、ブロックID“1”のブロックに対して、ブロックの実行終了を示すログ“block 1 exit”が記録されたことを示す。また、ブロックID“1”のブロックの処理が完了したことを示す。他のブロックID“2”、“3”等に関するレコードも同様の意味である。
図13は、検証処理の全体を示すフローチャートである。以下、図13に示す処理をステップ番号に沿って説明する。
(S1)プログラム変換部120は、検証の対象となる配備プログラム112を変換することで、変換後配備プログラム113を生成する。当該変換処理の詳細は後述する。
(S2)配備実行部130は、変換後配備プログラム113を用いて、配備先サーバ200に対する仮想マシンの配備を行う。具体的には、配備実行部130は、変換後配備プログラム113に含まれる各ブロックのコマンドを配備先サーバ200に提供することで、仮想マシンの動作環境の設定を行わせる。配備先サーバ200では、配備の実行に伴ってシステムコールログ115が生成される。また、配備先サーバ200では、変換後配備プログラム113の各ブロックのコマンドに従って、結果データ群118が生成される。
(S3)配備実行部130は、変換後配備プログラム113による配備が完了すると、システムコールログ115および結果データ群118を配備先サーバ200から取得し、記憶部110に格納する。結果データ群118には、前述した“messages”(ログファイル)、“hosts”(ホスト名の静的定義ファイル)、“passwd”(アカウント設定ファイル)および“exports”(NFS設定ファイル)等の結果データが含まれる。
(S4)検証部140は、記憶部110に記憶されたシステムコールログ115に基づいて、ログテーブル116を作成する。具体的には、システムコールログ115のうち、変数に関するファイル“f”への出力内容をブロックIDなし(“−”)でログテーブル116に登録する。ログテーブル116の例では、変数のログに対しては“write f”の記述も省いている。また、検証部140は、システムコールログ115のうち、ブロックに関する各ファイルへの出力内容を、当該ブロックのブロックIDと出力先のファイルとが分かるように対応付けてログテーブル116に登録する。ログテーブル116の具体的な内容は、図12で例示した通りである。
(S5)検証部140は、ログテーブル116および結果データ群118を分析することで、配備プログラム112の冪等性を検証する。検証部140は、検証結果を出力する。例えば、検証部140は、検証結果を示す画像をディスプレイ11に表示させることで、ユーザに検証結果を提示する。
図14は、配備プログラムの変換例を示すフローチャートである。以下、図14に示す処理をステップ番号に沿って説明する。以下に示す処理は、図13のステップS1に相当する。
(S11)プログラム変換部120は、検証の比較対象として、旧配備プログラム111のユーザによる指定を受け付ける。また、プログラム変換部120は、検証対象として、配備プログラム112のユーザによる指定を受け付ける。
(S12)プログラム変換部120は、旧配備プログラム111と配備プログラム112とを比較して、配備プログラム112の変数のうち、旧配備プログラム111と代入値の異なる変数を1つ検索する。以降のステップS14〜S16を実行済の変数は検索の対象外となる。図7で例示したように、プログラム変換部120は、旧配備プログラム111および配備プログラム112の構文から変数および代入値を特定できるし、同じ変数に対する代入値の相違も把握できる。
ここで、プログラム変換部120は、他の変数に依存する変数について、当該他の変数の代入値の変更があるとき、当該変数の代入値にも変更があると判断する。当該他の変数の代入値の変更がないとき、当該変数の代入値にも変更がないと判断する。図7で例示したように、プログラム変換部120は、検索された変数の定義の記述に、他の変数名が含まれているか否かを判定することで、検索した変数が他の変数に依存するか否かを判定できる。配備プログラム112の例でいえば、変数Xに関する“X=“192.168.10.1””の記述は他の変数を含まないから、変数Xは他の変数に依存しない。変数Zに関する“Z=f(X)”は他の変数Xを含むから、変数Zは変数Xに依存する。
(S13)プログラム変換部120は、何れかの変数を検索できたか否かを判定する。検索できた場合、処理をステップS14に進める。検索できなかった場合、処理をステップS17に進める。
(S14)プログラム変換部120は、配備プログラム112を参照して、検索した変数が他の変数に依存するか否かを判定する。依存する場合、処理をステップS15に進める。依存しない場合、処理をステップS16に進める。
(S15)プログラム変換部120は、当該変数の直後に、“log_write(“<変数名> changed:use <他の変数名>”)”の記述を挿入する。例えば、ステップS13で検索された変数が変数Zであれば、“log_write(“Z changed:use X”)”という記述を“Z=f(X)”の直後に挿入する。これは、図8で例示した変換後配備プログラム113の11行目に相当する。そして、処理をステップS12に進める。
(S16)プログラム変換部120は、当該変数の直後に、“log_write(“<変数名> changed”)”の記述を挿入する。例えば、ステップS13で検索された変数が変数Xであれば、“log_write(“X changed”)”という記述を“X=“192.168.10.1””の直後に挿入する。これは、図8で例示した変換後配備プログラム113の7行目に相当する。そして、処理をステップS12に進める。
(S17)プログラム変換部120は、配備プログラム112を参照して、ブロックを1つ検索する。以降のステップS19を実行済のブロックは検索の対象外となる。図7で例示したように、プログラム変換部120は、配備プログラム112の構文からブロックを特定できる。
(S18)プログラム変換部120は、何れかのブロックを検索できたか否かを判定する。検索できた場合、処理をステップS19に進める。検索できなかった場合、処理を終了する(変換後配備プログラム113の生成が完了する)。
(S19)プログラム変換部120は、検索したブロックに対してブロックIDを付与する。例えば、ブロックIDとして番号を昇順に付与することが考えられる。プログラム変換部120は、当該ブロックの直前に、“log_write(“block <ブロックID> enter”)”の記述を挿入する。例えば、ブロックID“1”のブロックであれば、“log_write(“block 1 enter”)”という記述を当該ブロックの直前に挿入する。プログラム変換部120は、当該ブロックの直後に、“log_write(“block <ブロックID> exit”)”の記述を挿入する。例えば、ブロックID“1”のブロックであれば、“log_write(“block 1 exit”)”という記述を当該ブロックの直後に挿入する。
(S20)プログラム変換部120は、検索したブロック内の自由変数を、ステップS19で付与したブロックIDに対応付けて自由変数テーブル114に登録する。図7で例示したように、プログラム変換部120は、配備プログラム112の構文によってブロックで用いられる変数を特定し、ブロック内で代入式の定義がない変数(あるいは、ブロック内の束縛変数以外の変数)を自由変数として特定できる。そして、処理をステップS17に進める。
このようにして、プログラム変換部120は、配備プログラム112を変換することで、変換後配備プログラム113を生成する。なお、旧配備プログラム111および配備プログラム112の例では、同プログラム内に変数の入力値が含まれるものとしたが、別個のファイルを用意して各変数の入力値を与えてもよい。その場合、プログラム変換部120は、旧配備プログラム111と配備プログラム112と各配備プログラムに対する入力内容のデータとを比較することで、ステップS12の処理を実行できる。
なお、配備サーバ100は、旧配備プログラム111についても上記と同様に変換し、変換後の旧配備プログラム111による配備を配備先サーバ200で事前に行っている。配備サーバ100は、当該事前の配備により旧結果データ群117を予め取得し、記憶部110に格納している。旧結果データ群117には、結果データ群118の各結果データに対応する旧結果データが含まれる。
図15は、配備プログラムの冪等性の検証例を示すフローチャートである。以下、図15に示す処理をステップ番号に沿って説明する。以下に示す処理は、図13のステップS5に相当する。
(S21)検証部140は、旧結果データ群117に含まれる各旧結果データと、結果データ群118に含まれる今回の各結果データとを比較する。検証部140は、同じファイル名の結果データ同士を比較する。例えば、今回の結果データとして“hosts”ファイルがあれば、当該結果データに対応する前回の“hosts”ファイルと今回の“hosts”ファイルとを比較する。
(S22)検証部140は、旧結果データと内容の相違する結果データがあるか否かを判定する。ある場合、処理をステップS23に進める。ない場合、処理をステップS29に進める。“hosts”ファイルの例でいえば、前回の“hosts”ファイルに“192.168.0.1 pochi”が記述され、今回の“hosts”ファイルに“192.168.10.1 pochi”が記述されている。この場合、今回の“hosts”ファイルの当該レコードは、前回の“hosts”ファイルには含まれていないから、内容が相違していることになる。
(S23)検証部140は、ステップS22で旧結果データと相違すると判定された結果データのうち、未分析(ステップS24〜S27の処理を行っていないもの)のものを1つ抽出する。
(S24)検証部140は、当該結果データを出力したブロックの変数の分析処理を行う。検証部140は、当該分析により、旧結果データが得られたとき(旧配備プログラム111または旧配備プログラム111をプログラム変換部120により変換したプログラムで配備を行ったとき)に対して、当該変数の入力内容に変更があったかを確認する。変数の分析処理の詳細は後述する。
(S25)検証部140は、ステップS24の分析結果に基づいて、当該結果データを出力したブロックの変数の代入値に変更があったか否かを判定する。変更があった場合、処理をステップS26に進める。変更がなかった場合、処理をステップS27に進める。
(S26)検証部140は、結果データの相違を妥当と判断する。検証部140は、当該相違が妥当である旨を出力する。検証部140は、相違箇所(当該結果データ)と当該結果データを出力したブロックと入力変更のあった変数箇所とを当該相違の要因として出力する。検証部140は、結果データ内の相違箇所(相違するレコード)を出力することもできる。具体的には、ステップS22で例示した“hosts”ファイルに対して、“192.168.10.1 pochi”のレコードを相違箇所として出力してもよい。そして、処理をステップS28に進める。
(S27)検証部140は、結果データの相違を非妥当と判断する。検証部140は、当該相違が非妥当である旨を出力する。検証部140は、相違箇所(当該結果データ)と当該結果データを出力したブロックとを当該相違の要因として出力する。検証部140は、結果データ内の相違箇所(相違するレコード)を出力することもできる。具体例は、ステップS26と同様である。
(S28)検証部140は、ステップS22で旧結果データと相違があると判定された全ての結果データを分析済であるか否かを判定する。全て分析済であれば、処理を終了する。全て分析済でなければ、処理をステップS23に進める。
(S29)検証部140は、旧結果データ群117と結果データ群118との間に差異がないことを出力する。この場合、ユーザは、配備プログラム112の冪等性は確保されていると判断できる。
図16は、ログに基づく変数の分析例を示すフローチャートである。以下、図16に示す処理をステップ番号に沿って説明する。以下に示す処理は、図15のステップS24に相当する。
(S31)検証部140は、ログテーブル116を参照して、旧結果データと内容の相違する結果データを出力したブロックを検索する。例えば、検証部140は、結果データ“hosts”ファイルを出力したブロックのブロックID“3”を、ログテーブル116から取得できる。
(S32)検証部140は、自由変数テーブル114を参照して、検索されたブロックで用いられる変数を検索する。例えば、検証部140は、ブロックID“3”のブロックに対して、当該ブロックで用いられる変数W,Xを自由変数テーブル114から取得できる。
(S33)検証部140は、ステップS32の検索の結果、該当のブロックで用いられる何れかの変数を取得できたか否かを判定する。取得できた場合、処理をステップS34に進める。取得できない場合、処理を終了する。取得できない場合とは、自由変数テーブル114において、該当のブロックに対応する自由変数集合の設定がない(“−”)場合である。なお、ステップS32で複数の変数が取得されている場合、以降のステップS34〜S40の処理は、変数毎に実行される(例えば、変数Wについての処理を実行した後、変数Xについての処理を実行する等)。
(S34)検証部140は、ログテーブル116を参照して、着目する変数(ステップS32の検索で取得された何れかの変数)について、着目するブロックよりも前のログから変更ログ(“<変数名> changed”)を検索する。例えば、変数Wであれば着目するブロック(ブロックID“3”のブロック)よりも前のログに変更ログは存在していない。また、変数Xであれば、着目する同ブロックよりも前のログに変更ログ“X changed”が存在している。
(S35)検証部140は、着目する変数に対する変更ログがあるか否かを判定する。変更ログがある場合、処理をステップS36に進める。変更ログがない場合、処理を終了する。例えば、変数Wであれば前述のように変更ログがないので変数Wに関する処理は終了となる。変数Xであれば前述のように変更ログがあるので処理をステップS36に進めることになる。
(S36)検証部140は、着目する変数を、代入値の変更された変数として記憶部110に記録する。
(S37)検証部140は、ログテーブル116を参照して、着目する変数が依存する他の変数があるか否かを判定する。依存する他の変数がある場合、処理をステップS38に進める。依存する他の変数がない場合、処理を終了する。検証部140は、着目する変数の変更ログに“use <他の変数名>”の記述が含まれていれば、当該着目する変数が依存する他の変数があると判定できる。例えば、ログテーブル116には変数Zに対して“Z changed:use X”という記述が含まれているから、着目する変数がZであれば、変数Zが依存する他の変数として変数Xを特定できる。当該記述が含まれていなければ、当該着目する変数が依存する他の変数がないと判定できる。
(S38)検証部140は、着目する変数と他の変数との依存関係を記憶部110に記録する。
(S39)検証部140は、ログテーブル116を参照して、着目する変数の変更ログよりも前の箇所から、当該変数が依存する他の変数を検索する。検証部140は当該他の変数を着目する変数に切り替える。そして、処理をステップS37に進める。
このようにして、検証部140は、入力内容の変更された変数および変数の依存関係を記憶部110に記録する。例えば、検証部140は、グラフ構造を用いて変数の依存関係を記録することができる。例えば、図15のステップS26において、検証部140は、結果データの相違の要因となった変数間の依存関係を、ユーザに提示することもできる。
図17は、検証結果の出力例(その1)を示す図である。GUI(Graphical User Interface)510は、図15のステップS26の出力例である。GUI520は、図15のステップS27の出力例である。GUI510,520は、検証部140により生成され、ディスプレイ11に表示される。検証部140は、GUI510,520により、配備プログラム112の検証結果をユーザに提示できる。
GUI510は、旧結果データに対する相違が妥当であると判断された結果データの一覧を含む。表示内容には、当該相違が妥当であること、相違のある箇所(結果データ)、要因となったブロックおよび変数を示す文字列が含まれる。
検証部140は、相違のある箇所として、結果データを示す情報(例えば、“/etc/hosts”)を提示する。結果データとして、デバイスファイル(例えば、“/dev/hda0”)や他の種類のファイル名を提示することもできる。
また、検証部140は、相違の要因となったブロックの配備プログラム112における記述箇所を提示する。具体的には、当該ブロックの記述箇所が配備プログラム112内の何行目に相当するか(例えば、“lines x2−y2”)を提示する。なお、各ブロックが配備プログラム112の何行目に相当するかは、例えば、変換後配備プログラム113において、配備プログラム112のどの行に“log_write(“block <ブロックID> enter”)”を挿入したかにより把握できる。
また、検証部140は、要因となった変数の配備プログラム112における記述箇所(例えば、代入式やブロック内の箇所)を提示する。具体的には、当該変数の記述箇所が配備プログラム112内の何行目に相当するか(例えば、“line b”)を提示する。
GUI520は、旧結果データに対する相違が非妥当であると判断された結果データの一覧を含む。表示内容には、当該相違が非妥当であること、相違のある箇所(結果データ)、要因となったブロックおよび変数を示す文字列が含まれる。
検証部140は、相違のある箇所として、結果データを示す情報(例えば、“/usr/lib/xxx”)を提示する。また、検証部140は、相違の要因となったブロックの配備プログラム112における記述箇所を提示する。具体的な提示方法は、GUI510と同様である。
また、検証部140は、GUI520において、相違の要因となった変数を提示しない。結果の相違が非妥当な場合、変数に対する入力内容の変更はないと判断されているからである。したがって、この場合、ユーザは、ブロック自体の処理が要因となって配備プログラム112の冪等性が失われていると判断できる。
図18は、検証結果の出力例(その2)を示す図である。GUI511は、“/etc/exports”が旧結果データ(例えば、前回配備時に得られた“/etc/exports”)と相違する各要因の関連を示している。例えば、検証部140は、GUI510に表示された相違箇所(“/etc/exports”)、要因となるブロック箇所(“lines x4−y4”)または変数箇所(“lines d,b”)のユーザによる選択入力を受け付ける。すると、検証部140は、選択された箇所に応じて、GUI511を生成し、ディスプレイ11に表示させる。ユーザは、例えば、入力デバイス12を用いて、当該選択入力を行える。
例えば、GUI511では、相違箇所とブロックと変数Zと変数Xとを関連線で結ぶことで、各要因の関連が示されている。検証部140は、図16のステップS37〜S39で記録された変数間の依存関係に基づいて、変数Zと変数Xとの関連をユーザに提示することができる。
また、GUI521は、“/usr/lib/xxx”が旧結果データ(例えば、前回配備時に得られた“/usr/lib/xxx”)と相違する各要因の関連を示している。例えば、検証部140は、GUI520に表示された相違箇所(“/usr/lib/xxx”)または要因となるブロック箇所(“lines x5−y5”)のユーザによる選択入力を受け付ける。すると、検証部140は、選択された箇所に応じて、GUI521を生成し、ディスプレイ11に表示させる。例えば、GUI520では、相違箇所とブロックとを関連線で結ぶことで、各要因の関連が示されている。
図19は、検証結果の出力例(その3)を示す図である。GUI512は、“/etc/exports”の旧結果データと相違する各要因の関連を示す他の出力例である。例えば、ブロックID“5”のブロックが、前述の変数Z以外の他の変数も用いるなら、当該ブロックに関連する変数の系統として、変数Zの系統と、当該他の変数の系統とを分離して、ユーザに提示することもできる。
ここで、第2の実施の形態の情報処理システムでは、仮想マシン自体の設定変更や実行させるソフトウェアの追加・変更等の仕様変更に伴って、配備プログラムもメンテナンスされる。例えば、配備プログラムにおいて、ユーザアカウントの追加といったパラメータの一部変更が行われることもある。また、例えば、ソフトウェアや設定内容の追加に伴ってブロック自体の記述の変更が行われることもある。
この場合、各ブロックによって生成された各結果データに対し、その妥当性(本例では、冪等であるか)をどのように検証するかが問題となる。結果データが旧結果データと相違する場合、その相違の要因が、一部の変数の設定値の変更なのか、何れかのブロック自体の処理なのか、を結果データのみからでは適切に把握することが難しいからである。
そこで、配備サーバ100は、配備プログラム112から、変換後配備プログラム113を生成する。配備サーバ100は、配備プログラム112に代えて、変換後配備プログラム113を用いて配備を行うことで、変数に対する入力内容の変更やブロックを識別するためのログを配備先サーバ200に出力させる。そして、結果データが旧結果データと相違する場合には、当該結果データを出力したブロックおよび当該ブロックに用いられる変数をログから特定し、当該変数に対する入力内容の変更の有無を確認することで、当該相違の妥当性を評価し、ユーザに提示する。
ユーザは、図17〜19で例示した各GUIを参照することで、配備プログラム112の冪等性を確保するために、見直すべき箇所を容易に把握することができる。例えば、GUI510で提示された相違箇所は、変数に対する入力内容に応じた妥当な相違箇所である。このため、ユーザは、GUI510で提示されたブロックの見直しの優先度を下げると判断できる。または、ユーザは、GUI510で提示されたブロックの見直しを行わないと判断してもよい。
また、例えば、GUI520で提示された相違箇所は、変数に対する入力内容が要因となっていない非妥当な相違箇所である。このため、ユーザは、GUI520で提示されたブロックの見直しの優先度を上げると判断できる。その際、GUI520を参照することで、対象のブロックの配備プログラム112における記述箇所を容易に把握でき、迅速に作業に着手できる。
このように、旧結果データと相違する結果データに対して、その妥当性と要因とを出力することで、ユーザによる要因分析の作業や配備プログラム112の修正作業の省力化を図れる。これにより、実行結果が相違する要因の適切な把握を支援できる。また、プログラム開発における作業コストの軽減に寄与し得る。
なお、配備プログラムでは、ブロック自体の記述の変更が行われることもある。配備サーバ100は当該ブロック自体の記述の変更もシステムコールログ115として取得できるように、変換後配備プログラム113を生成してもよい。
図20は、配備プログラムの他の例を示す図である。配備プログラム112aは、旧配備プログラム111に対する、ユーザによる変更の他の例を示している。旧配備プログラム111の9行目の記述が、配備プログラム112aでは、“execute “pvcreate #{DISK}” do command “pvcreate −−uuid #{node{‘uuid’}} #{DISK}”と変更されている。
プログラム変換部120は、当該ブロック(例えば、ブロックID“1”のブロック)に変更がある旨をシステムコールログ115として取得できるように、変換後配備プログラム113を生成してもよい。具体的には、プログラム変換部120は、旧配備プログラム111および配備プログラム112の同じ設定を行う当該ブロック同士(例えば、ディスク設定部分B1)を比較する。そして、ブロックのコードに相違があることを検出すると、“log_write(“block 1 enter”)の記述の直前に、“log_write(“block changed”)”といった記述を挿入する。例えば、プログラム変換部120によるこの処理を図14のステップS19に追加することができる。
すると、配備実行部130が、配備先サーバ200から取得するシステムコールログ115には当該ブロックに変更がある旨も記述されることになる。また、検証部140により生成されたログテーブル116においても、当該ブロックに変更がある旨が登録されることになる。具体的には、上記の例によれば、“block 1 enter”の直前に、“block changed”が登録され、ブロックID“1”のブロック自体のコードに変更があった旨をログテーブル116から把握できるようになる。例えば、配備実行部130および検証部140による、これらの処理を図13のステップS3,S4に追加することができる。
この場合、検証部140は、旧結果データと相違する結果データがある場合に、「当該結果データを出力したブロックで用いられる変数の入力内容に変更があったか否か」に加え、「当該ブロックのコードに変更があったか否か」に基づく妥当性の判断を行える。例えば、冪等性の検証において、旧結果データと相違する結果データが得られる場合、当該相違の妥当性について次のような判断基準を設けることができる。
(1)当該結果データを出力したブロックにコード変更があり、かつ、当該ブロックで用いられる変数の入力内容に変更がある場合、当該相違は妥当である。
(2)当該結果データを出力したブロックにコード変更があり、かつ、当該ブロックで用いられる変数の入力内容に変更がない場合、当該相違は妥当である。
(3)当該結果データを出力したブロックにコード変更がなく、かつ、当該ブロックで用いられる変数の入力内容に変更がある場合、当該相違は妥当である。
(4)当該結果データを出力したブロックにコード変更がなく、かつ、当該ブロックで用いられる変数の入力内容に変更がない場合、当該相違は非妥当である。
この場合、図15のステップS25の検証部140による判定を、ログテーブル116(ブロックのコード変更が登録されたもの)に基づいて、着目するブロック(ステップS23で抽出した結果データを出力したブロック)が上記(1)〜(4)の何れを満たしているかの判定に置き換える。そして、(1)〜(3)に該当する場合、処理をステップS26に進める。(4)に該当する場合、処理をステップS27に進める。ただし、(2)に該当する場合、ステップS26では、変数箇所を要因として出力しなくてもよい(入力内容に変更がない場合だからである)。このようにすれば、ユーザによるプログラムの検証作業を一層省力化することができる。
次に、図13のステップS1におけるプログラム変換部120の機能を記述したプログラムの例(一部拡張も含む)を説明する。一例として、バッカス・ナウア(BNF:Backus - Naur)記法と呼ばれるメタ言語で当該プログラムのアブストラクトシンタクスを記す。
図21は、BNF記法で記したプログラムの例を示す図である。以下、図21に付した行番号により各記述を指し示す(以降の図も同様)。1行目の“P”はプログラムを表す。“C”は代入、while文、if文、ブロックの何れかを表す。2行目の“e”は式を表す。“D”は配備のためのブロック(例えば、アカウントの設定といった機能毎のブロック)を表す。3行目の“op”は等号“=”や不等号“<”、“>”等の比較演算子やプラス記号“+”やマイナス記号“−”等の基本演算子を表す。“v”は数や文字列等の値を表す。
図22は、プログラム変換用の関数の記述例(その1)を示す図である。ここで、集合演算はプログラムで定義されているものとする。入力内容に変更のあった変数の集合を表す変数changed_varを最初に宣言し、空集合とする。changed_varへの要素の追加は、関数changed_var.addで実行するものとする。changed_varの中にリストの要素があるかどうかを判定するのは、関数changed_var.includedで行うものとする。
プログラム610は、配備プログラム112(または配備プログラム112a。以下同様)の構文から変数を取り出して、変数のリストを作成する関数varsの記述例である。プログラム620は、変数の依存関係を示す文字列を生成する関数Vの記述例である。ここで、“V(e)”といった表記は、“V”という関数が“e”というプログラムを引数にとることを示す。“e”の具体的な値は、“x=1”だったり、“if x=0 then y=1 else y=2”というようなプログラムである。
例えば、“U(e)=case e with x=1 => x=1;log_write(“x changed”);”という記述があるとすると、これは関数U(e)の定義である。関数U(e)は、“e”が“x=1”という構文のとき、“x=1;log_write(“x changed”);”に変換することを意味する。
図23は、プログラム変換用の関数の記述例(その2)を示す図である。プログラム630は、配備プログラム112を変換する関数Tの記述例である。プログラム630の関数Tは、旧配備プログラム111と配備プログラム112との間で、代入を行う部分が変更されているときと、各ブロック自体のコードが変更されているときに、変更を示すログを出力するように配備プログラム112を変換する。関数changecheckは、“C”が変更された部分であるか否かを確認する関数である。
関数Sは、変数に対する入力が変更された可能性が高いとみなせる箇所を検出して、当該箇所について変更を示すログを出力するように配備プログラム112を変換するための関数である。変数に対する入力が変更された可能性が高いとみなせる箇所とは、具体的には、while文やif文を用いて変数が定義されている箇所である。if文やwhile文では、条件が変わることで変数への代入値が変わる可能性が高いからである。
また、20行目には、コードの変更があったブロックに対して“log_write(“block changed;”)”を挿入する処理も記述されている。
図24は、プログラム変換用の関数の記述例(その3)を示す図である。プログラム640は、上記関数Sの記述例である。関数Sは、if文やwhile文の条件式が変わって、変数に対する代入箇所が変更される可能性があるときに、代入値の変更に関わりなく、代入値の変更の可能性が記録されるようにするものである。すなわち、変数に対する代入文は入力値や式それ自体に変更がなくても、条件によって代入値が変更される可能性がある。
例えば、while文では、繰り返す回数が異なることで、変数への代入値が変化することがある。また、if文では、条件式に対する入力が変わることで、実行される節がthen節からelse節に変わり、実行される変数への代入文が変化することがある。このため、while文やif文の中で定義されている変数については、変更された可能性が高いと考えて、入力内容に変更がある(変更された可能性がある)旨をログに出力するようにする。また、代入文が明らかに変わっている場合や入力が変わった場合には、その旨をログに出力することで、単なる可能性と区別できるようにする。
図25は、配備プログラムの他の変換例を示す図である。配備プログラム112bでは、変数DISKに対する代入式がif文の中に記述されている場合を例示している。この場合、if文の条件式に対する入力に応じて、変数DISKへの代入値が変更されることになる。具体的には、if文の条件式に応じて、then節の“DISK=“/dev/hda0””が実行されたり、else節の“DISK=“/dev/hda1””が実行されたりする。
変換後配備プログラム113aは、関数Tを用いて配備プログラム112bが変換された結果を例示している。例えば、関数T,Sによれば、(旧配備プログラム111と比べて)変数DISKに対する代入値が変更されているか否かに関わらず、then節およびelse節における変数DISKの代入文の直後に“log_write(“DISK changed;”)”をそれぞれ挿入する。挿入された記述は、変換後配備プログラム113aの5,9行目に相当する。プログラム変換部120は、図13のステップS1において、このような変換を行ってもよい。これにより、入力内容が変更される可能性の高い変数DISKについて、その旨をシステムコールログ115に記録できる。
図26は、ログの出力フォーマットの例を示す図である。ログフォーマット650は、ログの文法をBNF記法で示したものである。ログは、起こった順に並ぶリストである。3行目の“X”はプログラムの変数を表す。また、“ID”はブロックIDを表す。
2行目の記述“following blocks can be changed; LS prev blocks can be changed;”は、“LS”の部分の定義が変更され得る可能性があることを示している。
3行目の記述“X changed ADD_LIST”は、変数Xに対する入力内容が変更されたことを示している。その変更に際し、“ADD_LIST”が変更された入力(依存先の変数)であったことを示す。例えば、“ADD_LIST”が“use Y;use Z;”ならば、変数Xに代入する値に“Y+Z”のように変数Y,Zが用いられている(変数Xは変数Y,Zに依存している)ことを示す。
3行目の記述“block ID enter”は、“ID”で示されるブロックの処理の開始を示す。“block changed;block ID enter”は、“ID”で示されるブロックのコードが変更されていること、および、当該ブロックの処理の開始を示す。“block ID exit”は、“ID”で示されるブロックの処理の終了を示す。
配備サーバ100は、図22〜24で例示した各関数を用いて、変換後配備プログラムを生成できる。配備サーバ100は、当該変換後配備プログラムを用いて配備を行うことで、配備先サーバ200によりログフォーマット650で示されるログを含むシステムコールログ115を出力させ、配備プログラムの検証に利用できる。システムコールログ115(およびログテーブル116)による検証方法は、前述の通りである。
なお、第1の実施の形態の情報処理は、演算部1bにプログラムを実行させることで実現できる。また、第2の実施の形態の情報処理は、プロセッサ101にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体(例えば、光ディスク13、メモリ装置14およびメモリカード16等)に記録できる。
例えば、プログラムを記録した記録媒体を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM102やHDD103等の記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。
上記については単に本発明の原理を示すものである。更に、多数の変形や変更が当業者にとって可能であり、本発明は上記に示し、説明した正確な構成および応用例に限定されるものではなく、対応する全ての変形例および均等物は、添付の請求項およびその均等物による本発明の範囲とみなされる。
1 検証装置
1a 記憶部
1b 演算部
2 プログラム
2a,2b,2c プログラム要素
3 ログ

Claims (10)

  1. 変数に応じた処理を示す複数のプログラム要素を含むプログラムの検証方法であって、コンピュータが、
    プログラムの実行時に、過去に当該プログラムを実行したときに対して入力内容が変更された変数を識別する情報、および、プログラム要素と当該プログラム要素が実行されることで出力される実行結果との対応を示す情報を含むログを取得し、
    プログラムの何れかの実行結果が過去の実行結果と相違するとき、前記ログを参照して、当該実行結果に対応するプログラム要素および当該プログラム要素に用いられる変数を検索し、検索した変数に対する入力内容の変更状況に基づいて、実行結果が相違する要因と当該相違の妥当性とを評価し、
    実行結果の相違する箇所と相違の要因と相違の妥当性とを示す情報を出力する、
    検証方法。
  2. 前記評価では、検索した変数に対する入力内容の変更がある場合、当該変数に対する入力内容の変更と当該変数を用いるプログラム要素とが相違の要因であり、当該相違が妥当であると評価し、また、検索した変数に対する入力内容に変更がない場合、当該変数を用いるプログラム要素が相違の要因であり、当該相違が妥当でないと評価する、請求項1記載の検証方法。
  3. 前記取得では、前記ログとして、過去にプログラムを実行したときとプログラム要素の記述が変更されたプログラム要素を識別する情報を更に取得し、
    前記評価では、前記ログを参照して、過去の実行結果と相違する実行結果に対応するプログラム要素の記述の変更状況に基づいて、実行結果が相違する要因と当該相違の妥当性とを評価する、請求項1または2記載の検証方法。
  4. 前記評価では、検索した変数に対する入力内容の変更がなく、かつプログラム要素の記述に変更がある場合、当該プログラム要素が相違の要因であり、当該相違が妥当であると評価し、また、検索した変数に対する入力内容の変更がなく、かつプログラム要素の記述に変更がない場合、当該プログラム要素が相違の要因であり、当該相違が妥当でないと評価する、請求項3記載の検証方法。
  5. プログラムの実行中に前記ログに含まれる情報を出力するコードを、当該プログラムの実行前に、当該プログラムに挿入する、請求項1乃至4の何れか1項に記載の検証方法。
  6. 前記挿入では、過去にプログラムを実行したときの各変数の入力内容と、今回の各変数の入力内容とを比較することで、入力内容が変更された変数を特定し、当該変数を識別する情報を出力するコードを挿入する、請求項5記載の検証方法。
  7. 前記挿入では、第1の変数により依存される第2の変数を特定し、前記第2の変数の入力内容が過去の入力内容に対して変更されているか否かに応じて、前記第1の変数の入力内容が変更されているか否かを判定する、請求項6記載の検証方法。
  8. 前記挿入では、各変数の入力内容を定めた情報を参照して、条件文の中の複数の節それぞれで入力内容が定められた変数を特定し、特定した変数を入力内容が変更された変数として識別する情報を出力するコードを挿入する、請求項5乃至7の何れか1項に記載の検証方法。
  9. 変数に応じた処理を示す複数のプログラム要素を含むプログラムの検証に用いられる検証装置であって、
    プログラムの実行状況を示すログを記憶する記憶部と、
    プログラムの実行時に、過去に当該プログラムを実行したときに対して入力内容が変更された変数を識別する情報、および、プログラム要素と当該プログラム要素が実行されることで出力される実行結果との対応を示す情報を含む前記ログを取得し、
    プログラムの何れかの実行結果が過去の実行結果と相違するとき、前記ログを参照して、当該実行結果に対応するプログラム要素および当該プログラム要素に用いられる変数を検索し、当該変数に対する入力内容の変更状況に基づいて、実行結果が相違する要因と当該相違の妥当性とを評価し、
    実行結果の相違する箇所と相違の要因と相違の妥当性とを示す情報を出力する、演算部と、
    を有する検証装置。
  10. 変数に応じた処理を示す複数のプログラム要素を含むプログラムの検証に用いられる検証プログラムであって、コンピュータに、
    プログラムの実行時に、過去に当該プログラムを実行したときに対して入力内容が変更された変数を識別する情報、および、プログラム要素と当該プログラム要素が実行されることで出力される実行結果との対応を示す情報を含むログを取得し、
    プログラムの何れかの実行結果が過去の実行結果と相違するとき、前記ログを参照して、当該実行結果に対応するプログラム要素および当該プログラム要素に用いられる変数を検索し、当該変数に対する入力内容の変更状況に基づいて、実行結果が相違する要因と当該相違の妥当性とを評価し、
    実行結果の相違する箇所と相違の要因と相違の妥当性とを示す情報を出力する、
    処理を実行させる検証プログラム。
JP2015530653A 2013-08-09 2013-08-09 検証方法、検証装置および検証プログラム Expired - Fee Related JP6070847B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/JP2013/071724 WO2015019504A1 (ja) 2013-08-09 2013-08-09 検証方法、検証装置および検証プログラム

Publications (2)

Publication Number Publication Date
JP6070847B2 true JP6070847B2 (ja) 2017-02-01
JPWO2015019504A1 JPWO2015019504A1 (ja) 2017-03-02

Family

ID=52460870

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015530653A Expired - Fee Related JP6070847B2 (ja) 2013-08-09 2013-08-09 検証方法、検証装置および検証プログラム

Country Status (3)

Country Link
US (1) US20160124795A1 (ja)
JP (1) JP6070847B2 (ja)
WO (1) WO2015019504A1 (ja)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP6451417B2 (ja) * 2015-03-10 2019-01-16 日本電気株式会社 デバッグ支援装置、デバッグ支援システム、デバッグ支援方法、および、デバッグ支援プログラム
CN108304311A (zh) * 2015-06-26 2018-07-20 中兴通讯股份有限公司 一种日志信息检测方法及装置
US10180872B2 (en) * 2016-04-14 2019-01-15 Vmware, Inc. Methods and systems that identify problems in applications
JP6407919B2 (ja) * 2016-06-15 2018-10-17 ファナック株式会社 数値制御装置および変数判定方法
CN109857431B (zh) * 2019-01-11 2022-06-03 平安科技(深圳)有限公司 代码修改方法及装置、计算机可读介质及电子设备
US11023358B2 (en) * 2019-07-19 2021-06-01 Vmware, Inc. Review process for evaluating changes to target code for a software-based product

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH10320234A (ja) * 1997-05-21 1998-12-04 Hitachi Ltd ソフトウェアの自動テスト方法

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
AU682869B2 (en) * 1993-05-10 1997-10-23 Thinking Software, Inc Method for minimizing uncertainty in computer software processes allowing for automatic identification of faults locations and locations for modifications due to new system requirements with introduction of an alternative form of the target process object code allowing for less recompilation and re-linkage processing
US8234256B2 (en) * 2003-11-26 2012-07-31 Loglogic, Inc. System and method for parsing, summarizing and reporting log data
US7698305B2 (en) * 2006-12-01 2010-04-13 Microsoft Corporation Program modification and loading times in computing devices
US8694966B2 (en) * 2010-03-04 2014-04-08 Oracle International Corporation Identifying test cases to be run after changes to modules of a software application
US9092568B2 (en) * 2012-04-30 2015-07-28 Nec Laboratories America, Inc. Method and system for correlated tracing with automated multi-layer function instrumentation localization

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH10320234A (ja) * 1997-05-21 1998-12-04 Hitachi Ltd ソフトウェアの自動テスト方法

Also Published As

Publication number Publication date
US20160124795A1 (en) 2016-05-05
WO2015019504A1 (ja) 2015-02-12
JPWO2015019504A1 (ja) 2017-03-02

Similar Documents

Publication Publication Date Title
JP6070847B2 (ja) 検証方法、検証装置および検証プログラム
US8930884B2 (en) Efficient extraction of software dependencies from program code
US7975256B2 (en) Optimizing application performance through data mining
JP4395761B2 (ja) プログラムテスト支援装置およびその方法
US7945902B1 (en) Detection of non-standard application programming interface usage via analysis of executable code
CN109564540B (zh) 用于jit编译器的调试的系统、方法和设备
JP2019053729A (ja) スマートコントラクトのテスト方法及びテスト装置
US20120266131A1 (en) Automatic program generation device, method, and computer program
JP5303795B2 (ja) アプリケーションの解析方法、解析システム及び解析プログラム
JP2020119348A (ja) 解析プログラム、解析方法および解析装置
US20160253157A1 (en) Software refactoring
JP6440895B2 (ja) ソフトウェア分析装置及びソフトウェア分析方法
US7958422B2 (en) Method and apparatus for generating self-verifying device scenario code
US7100039B2 (en) Systems and methods for a bootstrap mechanism for software execution
JP6890557B2 (ja) 分析モデル作成システム、プログラミング装置および分析モデル作成方法
JP7380851B2 (ja) テストスクリプト生成装置、テストスクリプト生成方法及びプログラム
JP5163172B2 (ja) ソフトウェアテスト項目編集支援装置およびソフトウェアテスト項目編集支援方法
JP7318704B2 (ja) テスト装置、テスト方法及びプログラム
JP5728979B2 (ja) 情報処理装置、ソフトウェア検査方法およびソフトウェア検査プログラム
JP5578625B2 (ja) プログラム分析装置、プログラム分析方法、及びプログラム
JP6748357B2 (ja) 解析装置、解析プログラムおよび解析方法
JP6770335B2 (ja) 解析装置及びプログラム
CN117215965B (zh) 基于测试用例识别的测试方法、装置、电子设备和介质
JP6397800B2 (ja) テスト支援システムおよびテスト支援方法
JP2010277288A (ja) Webアプリケーション診断装置、Webアプリケーション診断プログラム及びWebアプリケーション診断方法

Legal Events

Date Code Title Description
TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20161206

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20161219

R150 Certificate of patent or registration of utility model

Ref document number: 6070847

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees