(57)【要約】プログラム内の異常の原因箇所を絞り込むことを可能にする。  異常検出装置は、更新前プログラムの更新前実行履歴と、更新前プログラムが変更された更新後プログラムの更新後実行履歴と、を格納する実行履歴格納手段と、更新前実行履歴と更新後実行履歴から、更新前プログラムの実行回数に対する所定命令の実行回数と、更新後プログラムの実行回数に対する所定命令に対応する命令の実行回数との差が所定値以上の箇所に基づいて決定される箇所を抽出するフロー比較手段と、更新後プログラムの箇所から前方の箇所を示す原因箇所情報を出力する原因箇所絞込手段と、を含む。
2013058393.tif 000002
【特許請求の範囲】
【請求項１】
第１のプログラムの実行履歴である第１の実行履歴と、前記第１のプログラムが変更された第２のプログラムの実行履歴である第２の実行履歴と、を格納する実行履歴格納手段と、
前記第１の実行履歴と前記第２の実行履歴から、前記第１のプログラムの実行回数に対する所定命令の実行回数と、前記第２のプログラムの実行回数に対する前記所定命令に対応する命令の実行回数との差が所定値以上の箇所に基づいて決定される箇所を抽出するフロー比較手段と、
前記第２のプログラムの前記箇所から前方の箇所を示す原因箇所情報を出力する原因箇所絞込手段と、
を含む異常検出装置。
【請求項２】
前記第２のプログラム中において、前記変更に依存する部分である影響範囲を特定する影響範囲分析手段をさらに備え、
前記原因箇所絞込手段は、前記影響範囲内で前記原因箇所情報を出力する
請求項１に記載の異常検出装置。
【請求項３】
前記第１の実行履歴は、前記第１のプログラム中の分岐命令の分岐先を示す実行履歴を含み、前記第２の実行履歴は、前記第２のプログラム中の分岐命令の分岐先を示す実行履歴を含み、
前記フロー比較手段は、前記第１の実行履歴と前記第２の実行履歴とにおいて対応する分岐命令によるいずれかの分岐先にある前記所定命令の実行回数の差が所定値以上であるような分岐命令の記述された箇所を抽出する
請求項１に記載の異常検出装置。
【請求項４】
前記第１の実行履歴は、前記第１のプログラム中のループ内にある命令の実行履歴を含み、前記第２の実行履歴は、前記第２のプログラム中のループ内にある命令の実行履歴を含み、
前記フロー比較手段は、前記第１の実行履歴と前記第２の実行履歴とにおいて対応するループ内にある前記所定命令の実行回数の差が所定値以上であるようなループ命令の記述された箇所を抽出する
請求項１に記載の異常検出装置。
【請求項５】
前記第１の実行履歴は、前記第１のプログラム中のサブルーチン呼び出し命令の実行履歴を含み、前記第２の実行履歴は、前記第２のプログラム中のサブルーチン呼び出し命令の実行履歴を含み、
前記フロー比較手段は、前記第１の実行履歴と前記第２の実行履歴とにおいて対応するサブルーチン呼び出し命令によって異なる種類のサブルーチンが呼び出される回数の差が所定値以上であるようなサブルーチン呼び出し命令の記述された箇所を抽出する
請求項１に記載の異常検出装置。
【請求項６】
第１のプログラムの実行履歴である第１の実行履歴と、前記第１のプログラムが変更された第２のプログラムの実行履歴である第２の実行履歴と、を格納する実行履歴格納手段を備えるコンピュータに、
前記第１の実行履歴と前記第２の実行履歴から、前記第１のプログラムの実行回数に対する所定命令の実行回数と、前記第２のプログラムの実行回数に対する前記所定命令に対応する命令の実行回数との差が所定値以上の箇所に基づいて決定される箇所を抽出するフロー比較ステップと、
前記第２のプログラムの前記箇所から前方の箇所を示す原因箇所情報を出力する原因箇所絞込ステップと、
を実行させる異常検出プログラム。
【請求項７】
前記第２のプログラム中において、前記変更に依存する部分である影響範囲を特定する影響範囲分析ステップと、
前記影響範囲内で前記原因箇所情報を出力する前記原因箇所絞込ステップと、
を、前記コンピュータに実行させる請求項６に記載の異常検出プログラム。
【請求項８】
第１のプログラムの実行履歴である第１の実行履歴と、前記第１のプログラムが変更された第２のプログラムの実行履歴である第２の実行履歴と、を格納し、
前記第１の実行履歴と前記第２の実行履歴から、前記第１のプログラムの実行回数に対する所定命令の実行回数と、前記第２のプログラムの実行回数に対する前記所定命令に対応する命令の実行回数との差が所定値以上の箇所に基づいて決定される箇所を抽出し、
前記第２のプログラムの前記箇所から前方の箇所を示す原因箇所情報を出力する異常検出方法。
【請求項９】
前記第２のプログラム中において、前記変更に依存する部分である影響範囲を特定し、前記影響範囲内で前記原因箇所情報を出力する請求項８に記載の異常検出方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は異常検出装置、プログラム、及び、方法に関する。
【背景技術】
【０００２】
ソフトウェアのバージョンアップ等に伴ってプログラムが修正された際に、修正部分以外の箇所で不整合や不具合が発生して品質が低下するデグレードが発生する場合がある。このようなデグレードを検出するシステムの一例が、特許文献１乃至４に記載されている。
引用文献１に記載のシステムは、改善前および改善後のプログラムを実行し、改善前プログラムによる実行結果とそのジャーナルを改善前ＤＢ（ＤａｔａＢａｓｅ）と改善前ジャーナルに格納し、改善後プログラムによる実行結果とそのジャーナルを改善後ＤＢと改善後ジャーナルに格納する。システムは、改善前後のＤＢおよびジャーナルを比較し、不一致データ項目名が改善項目内容ＤＢにあるか否かを判定し、ある場合には警告し、改善対象データ項目にない場合にはエラー表示してＤＢのキー、プログラム改善前後のデータ項目名、プログラム改善前後の内容をデグレード判別結果ファイルに出力する。
引用文献２に記載の方法は、修正対象抽出処理部が修正前ソースコード、修正後ソースコードを比較し、これらのソースコード間の相違行を抽出する処理を行い、基点フォルダ下のソースコードを解析して影響対象を検出し、影響パターンを特定して、デグレードの発生を防止するための見直し情報を生成する。
引用文献３に記載の方法は、生成されたオブジェクトのメンバ関数の実行時の動作をトレースし、その動作の履歴を各オブジェクト別に収集し、収集されたデータから、実行されたソースファイルの対応する箇所および実行回数をオブジェクト毎に表示する。
引用文献４に記載の装置は、プログラムの実行時に、実行時点ごとに制御依存関係およびデータ依存関係からなる実行依存関係情報を抽出し、実行依存関係情報参照してエラー原因の推定に必要となる制御依存関係とデータ依存関係を取り出す。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００５−２７６０４０号公報
【特許文献２】特開２００７−１９９８００号公報
【特許文献３】特開平１１−２１２８２２号公報
【特許文献４】特開平０６−１７５８８４号公報
【発明の概要】
【０００４】
しかし、上述のシステム等では、プログラムのどの部分がデグレードの原因か分からないという課題がある。すなわち、システムがデグレードを検出しても、プログラム内のデグレードの原因箇所が分からないため、プログラムのどの部分を直すべきかを開発者が調べる必要があった。
そこで、本発明は、プログラム内の異常の原因箇所を絞り込むことを可能にする異常検出装置、プログラム、及び、方法を提供することを目的とする。
かかる目的を達成するため、本発明の一形態は、異常検出装置であって、第１のプログラムの実行履歴である第１の実行履歴と、前記第１のプログラムが変更された第２のプログラムの実行履歴である第２の実行履歴と、を格納する実行履歴格納手段と、前記第１の実行履歴と前記第２の実行履歴から、前記第１のプログラムの実行回数に対する所定命令の実行回数と、前記第２のプログラムの実行回数に対する前記所定命令に対応する命令の実行回数との差が所定値以上の箇所に基づいて決定される箇所を抽出するフロー比較手段と、前記第２のプログラムの前記箇所から前方の箇所を示す原因箇所情報を出力する原因箇所絞込手段と、を含む。
また、本発明は、第１のプログラムの実行履歴である第１の実行履歴と、前記第１のプログラムが変更された第２のプログラムの実行履歴である第２の実行履歴と、を格納する実行履歴格納手段を備えるコンピュータに、前記第１の実行履歴と前記第２の実行履歴から、前記第１のプログラムの実行回数に対する所定命令の実行回数と、前記第２のプログラムの実行回数に対する前記所定命令に対応する命令の実行回数との差が所定値以上の箇所に基づいて決定される箇所を抽出するフロー比較ステップと、前記第２のプログラムの前記箇所から前方の箇所を示す原因箇所情報を出力する原因箇所絞込ステップと、を実行させる異常検出プログラムを提供する。
また、本発明は、第１のプログラムの実行履歴である第１の実行履歴と、前記第１のプログラムが変更された第２のプログラムの実行履歴である第２の実行履歴と、を格納し、前記第１の実行履歴と前記第２の実行履歴から、前記第１のプログラムの実行回数に対する所定命令の実行回数と、前記第２のプログラムの実行回数に対する前記所定命令に対応する命令の実行回数との差が所定値以上の箇所に基づいて決定される箇所を抽出し、前記第２のプログラムの前記箇所から前方の箇所を示す原因箇所情報を出力する異常検出方法を提供する。
本発明は、プログラム内の異常の原因箇所を絞り込むことを可能にする異常検出装置、プログラム、及び、方法を提供する。
【図面の簡単な説明】
【０００５】
【図１】第１の実施の形態の構成の例を示すブロック図である。
【図２】異常検出部１１００の構成の例を示すブロック図である。
【図３】第１の実施の形態の動作の例を示す流れ図である。
【図４】第１の実施の形態の動作の例を示す流れ図である。
【図５】更新前のプログラムの例を示す図である。
【図６】更新後のプログラムの例を示す図である。
【図７】更新による影響範囲を示した、更新後のプログラムの例を示す図である。
【図８】プローブを挿入したプログラムの例を示す図である。
【図９】更新前ログや更新後ログが有するコントロールフローの例を示す図である。
【図１０】コントロールフローをもとにデグレード原因箇所を絞り込んだ例を示す図である。
【図１１】デグレード原因箇所を絞り込んだ更新後のプログラムの例を示す図である。
【図１２】第２の実施の形態の構成の例を示すブロック図である。
【図１３】第２の実施の形態の動作の例を示す流れ図である。
【図１４】第３の実施の形態の構成の例を示すブロック図である。
【発明を実施するための形態】
【０００６】
以下、本発明の実施の形態について、図面を用いて説明する。すべての図面において、同一の構成要素には同一の符号を付し、適宜説明を省略する。
なお、各実施形態の装置等を構成する各部は、論理回路等のハードウェアで構成される。また、各部は、コンピュータの制御部、メモリ、メモリにロードされたプログラム、プログラムを格納するハードディスク等の記憶ユニット、ネットワーク接続用インターフェースなどからなり、ハードウェアとソフトウェアの任意の組合せによって実現されてもよい。そして特に断りのない限り、その実現方法、装置は限定されない。
また、制御部はＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）などからなり、ＯＳ（Ｏｐｅｒａｔｉｎｇ  ｓｙｓｔｅｍ）を動作させて装置等の全体を制御するとともに、例えばドライブ装置などに装着された記録媒体からメモリにプログラムやデータを読み出し、これに従って各種の処理を実行する。記録媒体は、例えば光ディスク、フレキシブルディスク、磁気光ディスク、外付けハードディスク、半導体メモリ等であって、コンピュータプログラムをコンピュータが読み取り可能に記録する。また、コンピュータプログラムは、通信網に接続されている図示しない外部コンピュータからダウンロードされても良い。
＜実施形態１＞
次に、本発明の第１の実施の形態について図面を参照して詳細に説明する。
図１には、本実施の形態におけるデグレード検出装置１の構成例が示されている。デグレード検出装置１は、入出力部１０１０と、アップデート部１０１５と、モジュールレポジトリ１０２０と、プログラムローダ１０３０と、プローブ挿入箇所決定部１０５０と、プローブ挿入部１０６０と、プログラム実行部１０７０と、更新前ログ格納部１０８０と、更新後ログ格納部１０９０と、異常検出部１１００と、を含む。
また、異常検出部１１００は、図２に示すように、コントロールフロー比較部１２１０と、原因箇所絞込部１２２０とを含む。
入出力部１０１０は、開発者等からのモジュール改版（更新）指示を受け付ける入力手段と、デグレード分析結果を表示する出力手段からなる。
アップデート部１０１５は、入出力部１０１０からの指示に基づき、モジュールレポジトリ１０２０に格納されたプログラム（更新前プログラム）をコピーして、複製したコピーを改版（更新）する。アップデート部１０１５は、改版したプログラム（更新後プログラム）をモジュールレポジトリ１０２０に格納する。
モジュールレポジトリ１０２０は、プログラム（更新前プログラム、更新後プログラム）やライブラリ、関連モジュールを格納する。
プログラムローダ１０３０は、プログラムやプログラムの実行に必要なモジュールをモジュールレポジトリ１０２０からロードする。
プローブ挿入箇所決定部１０５０は、更新前プログラムと更新後プログラムにおいて、コントロールフロー上の流量を計測可能な箇所を決定する。
ここで、コントロールフローとは、プログラムの実行結果のトレースである。例えば、図９には、図５、６に示すプログラムが実行されたトレースであるコントロールフローの一例が示されている。図９には、ｃａｌｃＤｅｂｔ関数が、ｃａｃｌＩｎｔｅｒｅｓｔ関数を呼び出し、ｃａｌｃＩｎｔｅｒｅｓｔ関数がｇｅｔＹｅａｒ関数を呼び出していること、ｃａｌｃＩｎｔｅｒｅｓｔ関数の中には条件分岐が一つあることが示されている。このように、コントロールフローを構成するノード（節点）は所定のプログラム文（条件分岐文、ループ文（ｗｈｉｌｅ文など）、サブルーチンの呼び出し、例外の受理部分（ｃａｔｃｈ文など）である。また、コントロールフローを構成するノードによって実行される処理を、ノードとノードをつなぐ経路（パス、辺）として表す。すなわち、辺は、所定のプログラム文（命令文）と、その次に実行する可能性のある所定のプログラム文（命令文）とをつないでいる。
また、プログラムが実行されたときに、コントロールフロー上で通過する（実行される）可能性のある全経路（パス）のうち、実際にあるパスを通過した回数（実行回数）をそのパスの流量という。例えば、図９のようにｃａｌｃＩｎｔｅｒｅｓｔ関数の中には条件分岐があり、その左右のどちらのパスを通過するかは条件により異なりうる。そこで、例えば、左のパスを通過した回数を左のパスを通過した流量とよぶ。
更新前プログラムと更新後プログラムにおいてコントロールフロー上の流量を計測可能な箇所とは、例えば、サブルーチンの先頭、条件分岐文のｔｈｅｎ節とｅｌｓｅ節の先頭、ループの先頭（ループ文等）、例外の受理部分（ｃａｔｃｈ文等）などの、プログラム上、ある命令文が記述された箇所の次に記述された命令文の実行以外の処理が発生する可能性のある所定の箇所である。本実施の形態では、プローブ挿入箇所決定部１０５０は、このようなコントロールフロー上の流量を計測可能な所定の箇所をプローブ挿入箇所とする。なお、人が、更新前後のプログラムの対応する箇所に同じＩＤを付してプローブを挿入しても良い。
プローブ挿入部１０６０は、プローブ挿入箇所決定部１０５０が決定した箇所、すなわち、更新前プログラムと更新後プログラムにおいてコントロールフロー上の流量を計測可能な所定の箇所にプローブ記述（以下、単にプローブという）を挿入する（図８参照）。プローブは、プログラムにおいてプローブが挿入された箇所の命令が実行された場合に、該箇所の直前（または直後）に記述された命令の実行結果（ログ）を出力する。
プログラム実行部１０７０は、更新前のプログラムと、更新後プログラムを実行する。
更新前ログ格納部１０８０、更新後ログ格納部１０９０は、更新前プログラム、更新後プログラムに挿入されたプローブが出力するログをそれぞれ格納する。すなわち、更新前ログ格納部１０８０は、更新前プログラムのコントロールフロー上のパスごとの流量（実行回数）を記録したログを格納し、更新後ログ格納部１０９０は、更新後プログラムのコントロールフロー上のパスごとの流量（実行回数）を記録したログを格納する。
異常検出部１１００は、更新前ログ格納部１０８０に格納されたログ（更新前ログ）と更新後ログ格納部１０９０に格納されたログ（更新後ログ）とを比較することで、デグレードの発生原因がある箇所を絞り込む。具体的には、異常検出部１１００は、図２に示すようにコントロールフロー比較部１２１０と原因箇所絞込部１２２０を含み、これらの各部が以下のように動作する。
コントロールフロー比較部１２１０は、更新前ログ格納部１０８０に格納されたログ（更新前ログ）と更新後ログ格納部１０９０に格納されたログ（更新後ログ）とに記録されたコントロールフロー上のパスごとの流量の割合（プログラムの全実行回数に対するそのパスの実行回数）を比較し、流量の割合の差が、予め指定された閾値以上となっている箇所を特定する。すなわち、コントロールフロー比較部１２１０は、更新前ログと更新後ログから、更新前プログラムの実行回数に対する所定命令の実行回数と、更新後プログラムの実行回数に対する前記所定命令に対応する命令の実行回数との差が所定値以上の箇所を特定する。
例えば、更新前ログにおけるコントロールフローを示す図９左図のコントロールフローでは、ｉｆ文の分岐（ｎｅｎｓｕ＞５）で２種類のパスがある。ここで、ｃａｌｃＤｅｂｔ関数が１００回実行されたとき、分岐の一方を通った回数が３０回で、もう一方を通った回数が７０回だとすると、分岐の一方を通るパスの流量の割合は３０％で、分岐のもう一方を通るパスの流量の割合は７０％となる。一方、更新後ログにおけるコントロールフローを示す図９右図のコントロールフローでは、同様の分岐において、一方の流量の割合が０％、もう一方の流量の割合が１００％となっている。つまり、更新前ログにおけるコントロールフロー上のパスの流量と、更新後ログにおいて対応するパスの流量との実行割合の差が３０％であることになる。そこで、例えば予め指定された閾値が２０％だとすれば、当該パスの流量の割合の差は閾値以上となるため、コントロールフロー比較部１２１０は、ｉｆ文の分岐（ｎｅｎｓｕ＞５）の箇所を特定する。
また、例えば、更新前後のプログラム中にループ文が存在する場合において当該プログラムが１００回実行されたとき、更新前ログにおけるコントロールフロー上ではループする命令列の先頭であるループ文の実行回数が３００回（３００％）であり、更新後ログにおけるコントロールフロー上では対応するループ文の実行回数が６００回（６００％）であったとすれば、同一のパスの流量（実行回数）の割合の差は、３００％となる。そこで、閾値が２００％だとすれば、流量の割合の差が閾値以上となっているから、コントロール比較部１２１０は、当該ループ文の記述箇所を特定する。
また、例えば、更新前後のプログラム中にサブルーチン呼び出し命令が存在する場合において当該プログラムが１００回実行されたとき、更新前ログにおけるコントロールフロー上では、サブルーチンＡが５０回（５０％）、サブルーチンＢが２０回（２０％）呼び出されたとする。一方、更新後ログにおけるコントロールフロー上では、サブルーチンＡが２０回（２０％）、サブルーチンＢが３０回（３０％）、サブルーチンＣが５０回（５０％）呼び出されたとする。この場合、サブルーチンの実行回数の割合は、サブルーチンＡについては３０％、サブルーチンＢについては１０％、サブルーチンＣについては５０％となる。したがって、閾値が２０％であれば、サブルーチンＡ、Ｃについては閾値を超える。そこで、コントロールフロー比較部１２１０は、サブルーチンＡ、Ｃの記述された箇所を特定する。
原因箇所絞込部１２２０は、更新後ログにおけるコントロールフロー上で、コントロールフロー比較部１２１０が特定したパスよりも前方の箇所をデグレード発生原因がある問題箇所（デグレード原因箇所）として絞り込む（図１０右図の太線部参照）。コントロールフローは、プログラムの実行の順番に従った順序性をもつため、コントロールフロー上で“あるパスよりも前方の箇所”とは、当該パスに対応する命令の順番よりも前の命令に対応するパスを含む箇所である。
また、原因箇所絞込部１２２０は、コントロールフローと更新後プログラムとの対応関係から、更新後プログラム上でデグレード原因箇所を絞り込む（図１１参照、第２実施形態で詳述）。そして、原因箇所絞込部１２２０は、入出力部１０１０に、更新後プログラムにおけるデグレード原因箇所を示す情報を出力する。
同一用途に使われているシステムにおいては、改版前プログラム（更新前プログラム）も改版後プログラム（更新後プログラム）も、それらの間で対応するコントロールフロー上の対応するパスに対しては同程度の流量を発生させると仮定できるため、改版前プログラムと改版後プログラムとにおける対応するコントロールフロー上の対応するパスの流量の割合が大きく異なれば、デグレードが発生している可能性が高い。そのため、上述の原因箇所絞込部１２２０の動作によって、デグレード原因箇所を絞り込むことができる。
次に、図３、４のフローチャートを参照して本実施の形態の全体の動作について説明する。
まず、開発者等によって入出力部１０１０を通じてプログラムの更新が指示される（図３のステップＡ１１０）。プログラムには予め各々ＩＤが付されたプローブが挿入されている。
次に、アップデート部１０１５は、モジュールレポジトリ１０２０内のプログラム（更新前プログラム）をコピーし、コピーしたプログラムを更新する（ステップＡ１２０）。アップデート部１０１５は、更新後プログラムをモジュールレポジトリ１０２０内に格納する。
次に、プログラムローダ１０３０は更新前プログラムと更新後プログラムをモジュールレポジトリ１０２０からロードする（ステップＡ１３０）。
なお、プログラムは予めプローブを含まず、プローブ挿入箇所決定部１０５０が、更新前後のプログラム中にプローブを挿入する箇所を決定しても良い（図４のステップＡ１５０）。本実施の形態では、プローブ挿入箇所決定部１０５０は、例えば、サブルーチンの先頭、条件分岐文のｔｈｅｎ節とｅｌｓｅ節の先頭、ループ文の先頭などの、コントロールフロー上の流量を計測可能な所定の箇所をプローブ挿入箇所として決定する。プログラム上、ある命令文が記述された箇所の次に記述された命令文の実行以外の処理が発生する可能性のある所定の箇所は、プローブ挿入箇所決定部１０５０がプログラム文を解析することで判別可能である。例えば、プローブ挿入箇所決定部１０５０が、プログラム中にｉｆ文を発見すれば、この箇所において分岐が発生するため、上述の所定の箇所に該当すると判別できる。したがって、プローブ挿入箇所決定部１０５０は、当該箇所にプローブを挿入すると決定する。これらの箇所は開発者等によって予め指定されていても良い。
後のステップにおいて、異常検出部１１００が、更新前ログと更新後ログにおけるコントロールフロー上で対応するパスの流量を比較するために、プローブ挿入箇所決定部１０５０は、例えば、更新後プログラムのプローブ挿入箇所を決定した後、当該プローブ挿入箇所によって特定される更新前プログラムの所定の箇所をプローブの挿入箇所と決定する。そのために、例えば、プローブ挿入箇所決定部１０５０は、プローブにＩＤ（ＩＤｅｎｔｉｆｉｃａｔｉｏｎ）を付す等の既存の方法でプローブの挿入箇所を決定しても良いし、更新後プログラムのプローブ挿入箇所によって特定される所定の命令（条件分岐の先頭等）を表す記述と同一の記述のある箇所を更新前プログラムから検索して、当該箇所をプローブ挿入箇所として決定しても良い。
プローブ挿入部１０６０は、プローブ挿入箇所決定部１０５０が決定した、更新前プログラムと更新後プログラムの所定の箇所にプローブを挿入する（ステップＡ１６０）。
次に、プログラム実行部１０７０は、更新前プログラムと、更新後プログラムを実行する（ステップＡ１７０）。
このとき、更新前プログラム及び更新後プログラムに挿入されたプローブは、更新前ログ格納部１０８０、更新後ログ格納部１０９０に、更新前プログラム、更新後プログラムの実行履歴であるログをそれぞれ出力する（ステップＡ１８０）。
次に、異常検出部１１００は、更新前ログ格納部１０８０に格納された更新前ログと、更新後ログ格納部１０９０に格納された更新後ログとを比較し、上述のようにデグレード原因箇所を絞り込む（ステップＡ１９０）。異常検出部１１００は、絞り込んだデグレード原因箇所を入出力部１０１０に送信する。
最後に、入出力部１０１０は、異常検出部１１００から取得したデグレード原因箇所を出力する（ステップＡ２００）。
本実施の形態のデグレード検出装置１は、更新前プログラム及び更新後プログラムのそれぞれのコントロールフロー上のパスごとの流量を記録したログを比較し、それらの流量のパターンが大きく異なる箇所をデグレード発生箇所として絞り込むというように構成されている。そのため、本実施の形態によれば、プログラム内のデグレードの原因箇所を絞り込むことが可能となる。
上述の引用文献に記載のシステムは、検査対象のシステムの入出力データやデータベースへのデータ入出力のみを観察対象としている。そして、引用文献に記載のシステムは、新旧システムを同一の実行状態とし、同一入力データを与えた場合に同一の出力データが得られなかった場合をデグレードの可能性がある場合として検出している。
しかし、新旧のシステムを同一の実行状態として同一入力データを与えることは、プログラム検査時以外には困難である。そのため、引用文献に記載のシステムでは、プログラム検査時以外にデグレードを検出することは困難である。
一方、本発明の本実施の形態のデグレード検出装置１によれば、運用時でのデグレード検出も容易となる。その理由は、デグレード検出装置１は、プログラムの内部の状態、すなわちコントロールフローを観察してデグレード原因箇所を特定しているためである。
＜実施形態２＞
次に、本発明の第２の実施の形態について図面を参照して詳細に説明する。第１の実施の形態と同じ構成には同じ符号を付して説明を省略する。
図１２を参照すると、本実施の形態におけるデグレード検出装置１は、影響範囲分析部１０４０を備える点で、第１の実施の形態とは異なる。影響範囲分析部１０４０は、入出力部１０１０から指定された更新モジュールが、プログラムローダ１０３０がロードしたプログラム中のどの範囲に影響するかを示す影響範囲を推定する。すなわち、影響範囲分析部１０４０は、プログラムの更新に依存する部分である影響範囲を推定する。具体例は後述する。
また、本実施の形態におけるプローブ挿入箇所決定部１０５０は、影響範囲分析部１０４０が推定した影響範囲の中からプローブの挿入箇所を決定する点で第１の実施の形態とは異なる。具体例は後述する。
図１３、図４のフローチャートを参照して本実施の形態の全体の動作について説明する。
図１３のフローチャートは、図３とステップＡ１１０〜Ａ１３０までは同じである。図１３のフローチャートは、ステップＡ１４０を有する点で第１の実施の形態と異なる。
まず、開発者等によって入出力部１０１０を通じてプログラムの更新が指示される（図１３のステップＡ１１０）。次に、アップデート部１０１５は、モジュールレポジトリ１０２０内のプログラムをコピーし、コピーしたプログラムを更新する（ステップＡ１２０）。そして、プログラムローダ１０３０は更新前のプログラムと更新後のプログラムをロードする（ステップＡ１３０）。ここまでは第１の実施の形態と同じである。
次に、影響範囲分析部１０４０は、更新前プログラムが更新されて更新後プログラムとなった場合に、該更新された箇所が、プログラム中のどの箇所に影響があったのかを分析して影響があった範囲（影響範囲）を推定する（ステップＡ１４０）。例えば、ある変数と別の変数に依存関係がある場合等に、これらの変数を含むプログラム文等が互いに影響を受けうる。すなわち、影響範囲分析部１０４０は、プログラム文間に依存関係があるかどうかを解析することで影響範囲を求めることができる。このようなプログラムの影響範囲を求める技術は、プログラムスライスなどと呼ばれて知られており、例えば、以下の文献により知られている。Ｗｅｉｓｅｒ，Ｍ．：“Ｐｒｏｇｒａｍ  Ｓｌｉｃｉｎｇ”，Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  Ｆｉｆｔｈ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｓｏｆｔｗａｒｅ  Ｅｎｇｉｎｅｅｒｉｎｇ，ｐｐ．４３９  ４４９，１９８１．。
次に、プローブ挿入箇所決定部１０５０は、影響範囲分析部１０４０が分析した影響範囲の中でコントロールフロー上の流量を測定する箇所を決定する（図４のステップＡ１５０）。
次に、プローブ挿入部１０６０は、更新後プログラムと更新前プログラムの所定の箇所にプローブを挿入する（ステップＡ１６０）。例えば、プローブ挿入箇所決定部１０５０は、プログラム中の、影響範囲分析部１０４０が分析した影響範囲に入る直前と直後の箇所、影響範囲に含まれるサブルーチンの先頭の箇所、影響範囲に含まれる条件分岐文のｔｈｅｎ節とｅｌｓｅ節の先頭の箇所、影響範囲に含まれるループ文の先頭の箇所などにプローブを挿入する。これらの箇所は開発者等によって予め指定されていても良い。このようにすることで、デグレード検出装置１は、影響範囲内でデグレード原因箇所を絞り込むことができる。なお、プログラムに予め各々ＩＤが付されたプローブが挿入されている場合にはステップＡ１５０、１６０が不要であるのは第１の実施の形態と同様である。
次に、プログラム実行部１０７０は、更新前プログラムと、更新後プログラムを実行する（ステップＡ１７０）。更新前プログラム及び更新後プログラムに挿入されたプローブは、それぞれ更新前ログ格納部１０８０及び更新後ログ格納部１０９０にログを出力する（ステップＡ１８０）。
次に、異常検出部１１００は、更新前ログ１０８０と更新後ログ１０９０を比較し、デグレード原因箇所を絞り込む（ステップＡ１９０）。最後に、入出力部１０１０は該デグレード原因箇所を表示する（ステップＡ２００）。なお、上述の説明では、ステップＡ１６０でプローブ挿入部１０６０が影響範囲内にプローブを挿入したが、これに限られない。すなわち、プローブ挿入部１０６０は、プローブを影響範囲外にも挿入し、異常検出部１１００が影響範囲内からデグレード原因箇所を絞り込むようにしても良い。
次に、図５に示すようなプログラムが更新前プログラムとして与えられている場合を例に本実施の形態の動作の一例を説明する。
このプログラムは２０００年問題に未対応であると仮定する。すなわち、このプログラムで使用しているライブラリ“Ｄａｔｅ．ｃｕｒｒｅｎｔＤａｔｅ．ｇｅｔＹｅａｒ（）”関数は、現在が西暦１９９８年である場合に”９８”を返し、西暦が２０１１年である場合に”１１”を返す。
そこで、開発者は、このプログラムを、西暦２０００年以降でも稼働できるように、“Ｄａｔｅ．ｃｕｒｒｅｎｔＤａｔｅ．ｇｅｔＹｅａｒ（）”関数を、西暦の年数を返すライブラリと置き換える。すなわち、現在が西暦２０１１年ならば、“Ｄａｔｅ．ｃｕｒｒｅｎｔＤａｔｅ．ｇｅｔＹｅａｒ（）”関数は“１１”ではなく“２０１１”を返すように、開発者がライブラリを置き換える。
しかし、ライブラリが置き換わると、ライブラリを利用していた箇所がバグを発生する可能性がある。例えば、図５の例では、１９９６年を表す下線部“９６”を“１９９６”に書き換えないとデグレードが発生する。
そこで、まず、開発者は入出力部１０１０を通じて、図５のプログラムのうち、“Ｄａｔｅ．ｃｕｒｒｅｎｔＤａｔｅ．ｇｅｔＹｅａｒ（）”関数を、２０００年問題対応済みライブラリへ置き換えることを、アップデート部１０１５に指示する（図１３のステップＡ１１０）。
次に、アップデート部１０１５は、モジュールレポジトリ１０２０内のプログラムをコピーし、コピーしたプログラムを更新して、“Ｄａｔｅ．ｃｕｒｒｅｎｔＤａｔｅ．ｇｅｔＹｅａｒ（）”関数を２０００年問題対応済みライブラリへ置き換える（ステップＡ１２０）。すなわち、アップデート部１０１５は、図６に下線部で示すように、ライブラリを、ｃｏｍ．ｎｅｃ．ｕｔｉｌ．Ｄａｔｅから、２０００年問題対応済みライブラリであるｃｏｍ．ｎｅｃ．ｕｔｉｌ２．Ｄａｔｅに置き換える。
さらに、プログラムローダ１０３０は、図５に示す更新前のプログラムと、図６に示す更新後のプログラムをロードする（ステップＡ１３０）。
次に、影響範囲分析部１０４０は、更新後プログラムにおいて、更新により影響を受ける影響範囲を推定する（ステップＡ１４０）。本例において、影響範囲分析部１０４０が推定した影響範囲の例を図７に示した。図７の枠で囲まれている部分が影響範囲である。この例では、Ｄａｔｅ．ｃｕｒｒｅｎｔＤａｔｅ．ｇｅｔＹｅａｒ（）関数が置き換えられたので、その戻り値、及び、その戻り値を使用するプログラム箇所が影響範囲となる。
次に、プローブ挿入箇所決定部１０５０は、影響範囲分析部１０４０が推定した影響範囲の中で、コントロールフロー上の流量を特定可能な所定箇所にプローブを挿入する（ステップＡ１５０）。
図５、図６で示される更新前プログラム及び更新後プログラムのプローブの挿入例を図８に示す。図８中に“ｐｒｏｂｅ（）”と示された部分が、挿入されたプローブである。
プログラム実行部１０７０は、プローブが挿入された、更新前プログラムと更新後プログラムをそれぞれ実行する（ステップＡ１７０）。
更新前プログラムに挿入されたプローブ、及び、更新後プログラムに挿入されたプローブは、更新前ログ格納部１０８０、更新後ログ格納部１０９０に更新前ログ、更新後ログをそれぞれ出力する（ステップＡ１８０）。
ログの結果は、図９と同等の情報を有する。図９では、左図が、更新前プログラムが出力したログ（更新前ログ）が有する情報であり、右図が、更新後プログラムが出力したログ（更新後ログ）が有する情報である。
図９のそれぞれの図はコントロールフローを表す。すなわち、図９には、ｃａｌｃＤｅｂｔ関数が、ｃａｃｌＩｎｔｅｒｅｓｔ関数を呼び出し、ｃａｌｃＩｎｔｅｒｅｓｔ関数がｇｅｔＹｅａｒ関数を呼び出していること、及び、ｃａｌｃＩｎｔｅｒｅｓｔ関数の中には条件分岐が一つあることが示されている。
異常検出部１１００は、コントロールフロー上のパスごとの流量の割合を計測する。例えば、更新前ログでは、ｃａｌｃＩｎｔｅｒｅｓｔ関数内の条件分岐のｔｈｅｎ節のパスでは全体の３０％、ｅｌｓｅ節のパスでは残りの７０％の流量がある。一方、更新後ログでは、ｔｈｅｎ節のパスでは０％、ｅｌｓｅ節のパスでは１００％の流量がある。この理由は以下の通りである。すなわち、更新後は、ｇｅｔＹｅａｒ関数が２０１１など４桁の数字を返すため、４桁の値と、ｉｎｉｔｉａｌＹｅａｒ変数の値である９６との差がほとんどの場合に４桁の数字になる。そのため、条件分岐で５以下となる場合がなくなるためである。
異常検出部１１００は、更新前ログと更新後ログを比較し、デグレード原因箇所を絞り込む（ステップＡ１９０）。すなわち、本例では、コントロールフロー比較部１２１０は、更新前ログと更新後ログが表すコントロールフロー上のパスごとに流量の割合を比較する。その結果、コントロールフロー比較部１２１０は、流量の割合の差が、指定された閾値以上となっているパスを、デグレードが発生した可能性がある箇所として検出する。
コントロールフロー比較部１２１０が、デグレードが発生した可能性があると判断した箇所が存在する場合、原因箇所絞込部１２２０は、流量の割合の差が閾値以上となっているパスの先頭箇所からコントールフローをさかのぼり、影響範囲の先頭までの箇所をデグレード原因箇所として絞り込む。
図１０の例の場合、原因箇所絞込部１２２０は、ｃａｌｃＤａｂｔ関数内での影響範囲開始箇所からｃａｌｃＩｎｔｅｒｅｓｔ関数内のｉｆ文までをデグレード原因箇所として絞り込む。当該箇所は、図１０の更新後ログに太線で表示されている箇所に対応する箇所である。
最後に、入出力部１０１０は、更新されたプログラム上におけるデグレード原因箇所を表示する（ステップＡ２００）。すなわち、入出力部１０１０は、図１１の枠で囲まれた部分（図１０の更新後ログの太線で表示されている箇所に対応するプログラム文の記載部分）を他の部分と区別できるようにデグレード発生箇所を開発者に提示する。開発者はデグレード発生箇所の絞り込んだ範囲を調査することで、“ｃａｌｃＩｎｔｅｒｅｓｔ（９６）”を見つけ出し、当該箇所を“ｃａｌｃＩｎｔｅｒｅｓｔ（１９９６）”などと変更をすることができる。
本実施の形態のデグレード検出装置１は、更新前プログラム及び更新後プログラムのそれぞれのコントロールフロー上のパスごとの流量を記録したログを比較し、それらの流量のパターンが大きく異なる箇所をデグレード発生箇所として絞り込むというように構成されている。そのため、本実施の形態によれば、プログラム内のデグレードの原因箇所を絞り込むことが可能となる。
また、本実施の形態では、さらに、影響範囲分析部１０４０がプログラム更新による影響範囲を絞り込み、その範囲で、プローブ挿入箇所決定部１０５０がプログラムにプローブを挿入する、というように構成されているため、最小のログでプログラム内部の問題箇所の絞り込みができる。
＜実施形態３＞
次に、本発明の第３の実施の形態について図面を用いて説明する。図１４は、本実施の形態におけるデグレード検出装置１の構成の一例を示す図である。デグレード検出装置１は、実行履歴格納部１００、コントロールフロー比較部１２１０、原因箇所絞込部１２２０を含む。
実行履歴格納部１００は、更新前プログラムの実行履歴である更新前ログと、更新後プログラムの実行履歴である更新後ログと、を格納する。
コントロールフロー比較部１２１０は、更新前ログと更新後ログから、更新前プログラムの実行回数に対する所定命令の実行回数と、更新後プログラムの実行回数に対する所定命令に対応する命令の実行回数との差が所定の閾値以上となっている箇所を抽出する。
原因箇所絞込部１２２０は、更新後プログラムの中で、コントロールフロー比較部１２１０が抽出した箇所に対応する箇所から前方の箇所を示す情報を出力する。
上記の実施形態１〜３では、旧版と新版の２つのプログラムによるデグレードを例に示したが、これに限られるものではなく、コントロールフローがほぼ変更されない状態の２つのプログラムであれば、他にも適用可能である。例えば、リレーショナルデータベースにおけるＭｙＳＱＬ（登録商標）版アプリケーションとＯＲＡＣＬＥ（登録商標）版アプリケーションの２つのプログラムを対象として適用することもできる。
本実施の形態の異常検出装置１によれば、プログラム内の異常の原因箇所を絞り込むことが可能となる。
以上、実施形態を参照して本願発明を説明したが、本願発明は上記実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解しうる様々な変更をすることができる。
この出願は、２０１１年１０月１８日に出願された日本出願特願２０１１−２２９０４２を基礎出願とする優先権を主張し、その開示の全てをここに取り込む。
【符号の説明】
【０００７】
１０１０  入出力部
１０１５  アップデート部
１０２０  モジュールレポジトリ
１０３０  プログラムローダ
１０４０  影響範囲分析部
１０５０  プローブ挿入箇所決定部
１０６０  プローブ挿入部
１０７０  プログラム実行部
１０８０  更新前ログ格納部
１０９０  更新後ログ格納部
１１００  異常検出部
１２１０  コントロールフロー比較部
１２２０  原因箇所絞込部
【図１】
2013058393.tif 000003
【図２】
2013058393.tif 000004
【図３】
2013058393.tif 000005
【図４】
2013058393.tif 000006
【図５】
2013058393.tif 000007
【図６】
2013058393.tif 000008
【図７】
2013058393.tif 000009
【図８】
2013058393.tif 000010
【図９】
2013058393.tif 000011
【図１０】
2013058393.tif 000012
【図１１】
2013058393.tif 000013
【図１２】
2013058393.tif 000014
【図１３】
2013058393.tif 000015
【図１４】
2013058393.tif 000016
【国際調査報告】
2013058393.tif 000017
2013058393.tif 000018
2013058393.tif 000019
2013058393.tif 000020