(57)【要約】  テストプログラムによる演算装置の性能評価の精度を向上させるために、プログラム作成装置に、小区間開始位置の第１の演算手段の状態に関する初期値情報と小区間で第１の演算手段が実行する命令と参照データに関する情報とを小区間の実行履歴に記憶する実行履歴採取手段と、実行履歴から第１の演算手段が小区間の実行に必要なデータを再現するメモリイメージを生成するメモリイメージ作成手段と、メモリイメージ、初期値情報、第２の演算手段が使用する第２の記憶手段にメモリイメージを展開し、初期値情報から小区間開始位置の第１の演算手段と同じ状態に第２の演算手段を設定し、第２の演算手段に小区間だけ第１のプログラムを実行させるプログラム制御部、オペレーティング・システムの一部の機能を含むモニタプログラム、モニタプログラムを初期化するモニタプログラム初期化部、を含むテストプログラムを生成するプログラム生成手段と、を備える。
2011018828.tif 000002
【特許請求の範囲】
【請求項１】
データを記憶する第１の記憶手段と、
前記第１の記憶手段に展開された第１のプログラムを実行する第１の演算手段と、
前記第１の演算手段が前記第１のプログラムを実行する場合、前記第１の演算手段によって実行される前記第１のプログラムの一部の区間である小区間の開始位置における前記第１の演算手段の状態に関する初期値情報と、前記小区間に前記第１の演算手段が実行する命令と該命令を実行したことにより参照されるデータとに関する情報と、を前記小区間の実行履歴として記憶する実行履歴採取手段と、
前記実行履歴から、前記第１の記憶手段に展開された前記第１のプログラムのうち、前記第１の演算手段による前記小区間の実行に用いられるデータを再現するメモリイメージを生成するメモリイメージ作成手段と、
前記小区間の開始位置における前記初期値情報を含む小区間情報を生成する小区間情報生成手段と、
前記メモリイメージと、前記小区間情報と、任意のプログラムを実行する第２の演算手段が使用する第２の記憶手段に前記メモリイメージを展開し、前記小区間情報にしたがって前記小区間の開始位置における前記第１の演算手段と同じ状態に前記第２の演算手段を設定し、前記第２の演算手段に前記小区間だけ前記第１のプログラムを実行させるプログラム制御部と、オペレーティング・システムの機能のうち前記小区間における前記第１のプログラムの実行に必要な機能を含むモニタプログラムと、該モニタプログラムを前記第２の記憶手段に展開して前記第２の演算手段による前記第１のプログラム実行時に要求なサービスが前記モニタプログラムから提供されるように設定するモニタプログラム初期化部と、を含む第２のプログラムを生成する第２のプログラム生成手段と、
を備えるプログラム作成装置。
【請求項２】
前記小区間情報生成手段は、前記小区間が複数与えられると、第１の小区間の終了位置における前記第１の記憶手段の内容から、前記第１の小区間の次の第２の小区間の開始位置における前記第１の記憶手段の内容を再現する推測情報を生成し、第２の小区間情報に含める、
ことを特徴とする請求項１に記載のプログラム作成装置。
【請求項３】
前記プログラム制御部は、前記第１の小区間の終了位置における前記第２の記憶手段の内容と、前記第２の小区間情報に含まれる前記推測情報と、から前記第２の小区間の開始位置における前記第１の記憶手段が保持する内容と同じ内容を前記第２の記憶手段に再現し、前記第２の小区間情報に含まれる前記初期値情報にしたがって前記第２の小区間の開始位置における前記第１の演算手段と同じ状態に前記第２の演算手段を設定し、前記第２の演算手段に前記第２の小区間だけ前記第１のプログラムを実行させる
ことを特徴とする請求項２に記載のプログラム作成装置。
【請求項４】
前記小区間情報生成手段は、前記第１の小区間の実行履歴から再現した前記第１の小区間内の第１の終了位置における前記第１の記憶手段の内容と、前記第１の小区間の実行履歴から再現した前記第１の小区間内の第２の終了位置における前記第１の記憶手段の内容と、前記第２の小区間の実行履歴から再現した前記第２の小区間の開始位置における前記第１の記憶手段の内容と、の比較結果から前記推測情報を生成する、
ことを特徴とする請求項２に記載のプログラム作成装置。
【請求項５】
前記初期値情報には、前記第１の演算手段に備わるレジスタ、キャッシュメモリおよびページ変換テーブルの内容が含まれる、
ことを特徴とする請求項１に記載のプログラム作成装置。
【請求項６】
前記第１の演算手段は、オペレーティング・システム上で実行されるプログラムであって、任意の演算装置をエミュレートする、
ことを特徴とする請求項１に記載のプログラム作成装置。
【請求項７】
前記第１の演算手段は、命令を１命令ずつ実行する機能を有する演算装置であって、命令を１命令実行する毎に、前記実行履歴採取手段を実行する、
ことを特徴とする請求項１に記載のプログラム作成装置。
【請求項８】
前記実行履歴採取手段は、ユーザモードで実行された命令と、該命令を実行したことにより参照されるデータと、に関する情報を実行履歴に記憶する、
ことを特徴とする請求項７に記載のプログラム作成装置。
【請求項９】
前記プログラム制御部は、前記第１の演算手段に対して、前記小区間に相当する命令数を実行すると割り込みを発生させて前記第１のプログラムの実行を終了させる、
ことを特徴とする請求項１に記載のプログラム作成装置。
【請求項１０】
データを記憶する第１の記憶手段に展開された第１のプログラムを実行する第１の演算手段が前記第１のプログラムを実行する場合、前記第１の演算手段によって実行される前記第１のプログラムの一部の区間である小区間の開始位置における前記第１の演算手段の状態に関する初期値情報と、前記小区間に前記第１の演算手段が実行する命令と該命令を実行したことにより参照されるデータとに関する情報と、を前記小区間の実行履歴として記憶し、
前記実行履歴から、前記第１の記憶手段に展開された前記第１のプログラムのうち、前記第１の演算手段による前記小区間の実行に用いられるデータを再現するメモリイメージを生成し、
前記小区間の開始位置における前記初期値情報を含む小区間情報を生成し、
前記メモリイメージと、前記小区間情報と、任意のプログラムを実行する第２の演算手段が使用する第２の記憶手段に前記メモリイメージを展開し、前記小区間情報にしたがって前記小区間の開始位置における前記第１の演算手段と同じ状態に前記第２の演算手段を設定し、前記第２の演算手段に前記小区間だけ前記第１のプログラムを実行させるプログラム制御部と、オペレーティング・システムの機能のうち前記小区間における前記第１のプログラムの実行に必要な機能を含むモニタプログラムと、該モニタプログラムを前記第２の記憶手段に展開して前記第２の演算手段による前記第１のプログラム実行時に要求なサービスが前記モニタプログラムから提供されるように設定するモニタプログラム初期化部と、を含む第２のプログラムを生成する、プログラム作成方法。
【請求項１１】
前記小区間が複数与えられると、第１の小区間の終了位置における前記第１の記憶手段の内容から、前記第１の小区間の次の第２の小区間の開始位置における前記第１の記憶手段の内容を再現する推測情報を生成し、第２の小区間情報に含める、
ことを特徴とする請求項１０に記載のプログラム作成方法。
【請求項１２】
前記小区間が複数与えられると、前記第１の小区間の終了位置における前記第２の記憶手段の内容と、前記第２の小区間情報に含まれる前記推測情報と、から前記第２の小区間の開始位置における前記第１の記憶手段が保持する内容と同じ内容を前記第２の記憶手段に再現し、前記第２の小区間情報に含まれる前記初期値情報にしたがって前記第２の小区間の開始位置における前記第１の演算手段と同じ状態に前記第２の演算手段を設定し、前記第２の演算手段に前記第２の小区間だけ前記第１のプログラムを実行させる
ことを特徴とする請求項１１に記載のプログラム作成方法。
【請求項１３】
前記第１の小区間の実行履歴から再現した前記第１の小区間内の第１の終了位置における前記第１の記憶手段の内容と、前記第１の小区間の実行履歴から再現した前記第１の小区間内の第２の終了位置における前記第１の記憶手段の内容と、前記第２の小区間の実行履歴から再現した前記第２の小区間の開始位置における前記第１の記憶手段の内容と、の比較結果から前記推測情報を生成する、
ことを特徴とする請求項１１に記載のプログラム作成方法。
【請求項１４】
データを記憶する第１の記憶手段に展開された第１のプログラムを実行する第１の演算手段が前記第１のプログラムを実行する場合、前記第１の演算手段によって実行される前記第１のプログラムの一部の区間である小区間の開始位置における前記第１の演算手段の状態に関する初期値情報と、前記小区間に前記第１の演算手段が実行する命令と該命令を実行したことにより参照されるデータとに関する情報と、を前記小区間の実行履歴として記憶するステップと、
前記実行履歴から、前記第１の記憶手段に展開された前記第１のプログラムのうち、前記第１の演算手段による前記小区間の実行に用いられるデータを再現するメモリイメージを生成するステップと、
前記小区間の開始位置における前記初期値情報を含む小区間情報を生成するステップと、
前記メモリイメージと、前記小区間情報と、任意のプログラムを実行する第２の演算手段が使用する第２の記憶手段に前記メモリイメージを展開し、前記小区間情報にしたがって前記小区間の開始位置における前記第１の演算手段と同じ状態に前記第２の演算手段を設定し、前記第２の演算手段に前記小区間だけ前記第１のプログラムを実行させるプログラム制御部と、オペレーティング・システムの機能のうち前記小区間における前記第１のプログラムの実行に必要な機能を含むモニタプログラムと、該モニタプログラムを前記第２の記憶手段に展開して前記第２の演算手段による前記第１のプログラム実行時に要求なサービスが前記モニタプログラムから提供されるように設定するモニタプログラム初期化部と、を含む第２のプログラムを生成するステップと、
を情報処理装置に実行させるプログラム。
【請求項１５】
前記小区間が複数与えられると、第１の小区間の終了位置における前記第１の記憶手段の内容から、前記第１の小区間の次の第２の小区間の開始位置における前記第１の記憶手段の内容を再現する推測情報を生成し、第２の小区間情報に含める、
ことを特徴とする請求項１４に記載のプログラム。
【請求項１６】
前記小区間が複数与えられると、前記第１の小区間の終了位置における前記第２の記憶手段の内容と、前記第２の小区間情報に含まれる前記推測情報と、から前記第２の小区間の開始位置における前記第１の記憶手段が保持する内容と同じ内容を前記第２の記憶手段に再現し、前記第２の小区間情報に含まれる前記初期値情報にしたがって前記第２の小区間の開始位置における前記第１の演算手段と同じ状態に前記第２の演算手段を設定し、前記第２の演算手段に前記第２の小区間だけ前記第１のプログラムを実行させる
ことを特徴とする請求項１５に記載のプログラム作成方法。
【請求項１７】
前記第１の小区間の実行履歴から再現した前記第１の小区間内の第１の終了位置における前記第１の記憶手段の内容と、前記第１の小区間の実行履歴から再現した前記第１の小区間内の第２の終了位置における前記第１の記憶手段の内容と、前記第２の小区間の実行履歴から再現した前記第２の小区間の開始位置における前記第１の記憶手段の内容と、の比較結果から前記推測情報を生成する、
ことを特徴とする請求項１５に記載のプログラム作成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムを作成する装置および方法に関する。
【背景技術】
【０００２】
従来、開発中の情報処理装置に所定のプログラムを実行させることによって、その情報処理装置の評価を行なう手法が知られている。この開発中の情報処理装置を評価するプログラムをテストプログラムという。【０００３】
開発中の情報処理装置を精度よく評価するためには、テストプログラムが重要な役割を担うことになる。
上記技術に関連して、既存の情報処理装置上でプログラムを実行してその実行の様子を逐一記録し、その記録からメモリ内容を再生することにより、テストプログラムを作成する方法が知られている。この方法は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）はメモリに置かれたプログラムを実行しその実行の際にメモリ内容の読み書きを行なうので、メモリ内容が再現できればＣＰＵの動作を追跡（トレース）できるという考えに基づいている。【０００４】
また、ペリフェラル装置（周辺装置）を複数の種類のホスト装置に対応させるために、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）非依存部分とＯＳ依存部分とに分けてデバイスドライバを記憶し、ホスト装置が使用するデバイスドライバを用いてペリフェラル装置を制御することが知られている。【０００５】
また、被テストプログラムのうち所望の部分だけを、被テストプログラムの編集の有無に左右されず、テストするために必要となる変数の設定や検証の手間をかけずに、テストするテストプログラム支援システムが知られている。
【特許文献１】特開２００３−０１５９１４号公報
【特許文献２】特開２００５−０３８２９７号公報
【特許文献３】特開２００７−１９３５８６号公報
【発明の開示】
【０００６】
しかし、実際には、既存の情報処理装置上では実行可能なプログラムであっても、開発中の情報処理装置では実行できない場合もある。例えば、開発中のＣＰＵを評価する場合、ＣＰＵの設計に基づくエミュレータ上でテストプログラムを実行させて評価を行なうことがある。この場合、エミュレータにおけるメモリ容量の制限等により、ＯＳをエミュレータ上で動作させることができないために、既存の情報処理装置上で実行させたプログラムと同一のプログラムを実行できない場合がある。
【０００７】
このように、既存の情報処理装置と開発中の情報処理装置とに同じテストプログラムを実行させて性能評価を行なうことが難しい場合がある。この場合、既存の情報処理装置にテストプログラムを実行させた実行結果と、開発中の情報処理装置にテストプログラムを実行させた実行結果と、を単純に比較することができない。そのため、開発中の情報処理装置の性能評価、例えば開発中のＣＰＵの性能評価を精度よく行なうことが難しい。
【０００８】
また、上述のエミュレータを使用して開発中の情報処理装置の評価を行なう場合、ハードウェアをエミュレートするために膨大な時間が必要となる、大容量のメモリが必要となる、Ｉ／Ｏ処理のエミュレートが必要である、など制約が多い。
【０００９】
本プログラム作成装置は、上述した問題に鑑みてなされたものであり、その解決しようとする課題は、開発中の演算装置の性能評価の精度を向上させるテストプログラムを提供することである。
【００１０】
上記課題を解決するために、本プログラム作成装置は、以下の手段を備える。
第１の記憶手段は、データを記憶する。また、第１の演算手段は、前記第１の記憶手段に展開された第１のプログラムを実行する。
【００１１】
実行履歴採取手段は、前記第１の演算手段が前記第１のプログラムを実行する場合、前記第１の演算手段によって実行される前記第１のプログラムの一部の区間である小区間の開始位置における前記第１の演算手段の状態に関する初期値情報を前記小区間の実行履歴として記憶する。さらに、実行履歴採取手段は、前記小区間に前記第１の演算手段が実行する命令と該命令を実行したことにより参照されるデータとに関する情報を前記小区間の実行履歴として記憶する。
【００１２】
メモリイメージ作成手段は、前記実行履歴から、前記第１の記憶手段に展開された前記第１のプログラムのうち、前記第１の演算手段による前記小区間の実行に用いられるデータを再現するメモリイメージを生成する。
【００１３】
小区間情報生成手段は、前記小区間の開始位置における前記初期値情報を含む小区間情報を生成する。
第２のプログラム生成手段は、前記メモリイメージと、前記小区間情報と、プログラム制御部と、モニタプログラムと、モニタプログラム初期化部と、を含む第２のプログラムを生成する。
【００１４】
前記プログラム制御部は、任意のプログラムを実行する第２の演算手段が使用する第２の記憶手段に前記メモリイメージを展開し、前記小区間情報にしたがって前記小区間の開始位置における前記第１の演算手段と同じ状態に前記第２の演算手段を設定する。そして、前記プログラム制御部は、前記第２の演算手段に前記小区間だけ前記第１のプログラムを実行させる。
【００１５】
前記モニタプログラムは、オペレーティング・システムの機能のうち前記小区間における前記第１のプログラムの実行に必要な機能を提供する。また、モニタプログラム初期化部は、前記モニタプログラムを前記第２の記憶手段に展開して前記第２の演算手段による前記第１のプログラム実行時に要求なサービスが前記モニタプログラムから提供されるように設定する。
【００１６】
以上に説明した本プログラム作成装置によると、開発中の演算装置の性能評価の精度を向上させるテストプログラムを提供できる。
【図面の簡単な説明】
【００１７】
【図１】テストプログラム作成装置を説明する図である。
【図２】テストプログラムを作成する処理の概要を説明する図である。
【図３】テストプログラムを作成する処理の概要を説明する図である。
【図４】テストプログラムの概要を説明する図である。
【図５】テストプログラムを実行する処理の概要を説明する図である。
【図６】テストプログラムの実行形態について説明する図である。
【図７】テストプログラムの実行を終了する処理を説明する図である。
【図８】メモリ空間の推測処理を説明する図である。
【図９】テストプログラムの小区間の初期状態の推測を説明する図である。
【図１０】前小区間終了位置が不正確な場合にメモリ初期イメージ推測情報を作成する方法について説明する図である。
【図１１】テストプログラムを作成するテストプログラム作成装置の主要部を示す図である。
【図１２】テストプログラムを作成する処理の概要を示すフローチャートである。
【図１３】実行履歴を採取する処理の概要を説明する図である。
【図１４】実行履歴の具体例を説明する図である。
【図１５】実行履歴の採取する処理の具体的な処理を示すフローチャートである。
【図１６】実行履歴を採取する処理のもう１つの例の概要を説明する図である。
【図１７】実行履歴を採取する処理のもう１つの例の具体的な処理を示すフローチャートである。
【図１８】テストプログラムを作成する処理の具体的な流れを説明する図である。
【図１９】ステップＳ１２０５の具体的な処理を示すフローチャートである。
【図２０】ステップＳ１２０９の具体的な処理を示すフローチャートである。
【図２１】テストプログラムをスタンドアロンで実行する場合の実行処理の概要を説明する図である。
【図２２】テストプログラムをスタンドアロンで実行する場合の概要を示すフローチャートである。
【図２３】テストプログラムをスタンドアロンで実行する場合の具体的な実行処理を示すフローチャートである。
【図２４】テストプログラムをＯＳ上で実行する場合の実行処理の概要を説明する図である。
【図２５】テストプログラムをＯＳ上で実行する場合の概要を示すフローチャートである。
【図２６】テストプログラムをＯＳ上で実行する場合の具体的な実行処理を示すフローチャートである。
【図２７】テストプログラム作成装置の構成例を示す図である。
【図２８】テストプログラムを使用した性能評価の概要を示す図である。
【発明を実施するための形態】
【００１８】
以下、本実施形態について、図１〜図２８に基づいて説明する。
【第１の実施例】
【００１９】
図１は、テストプログラム作成装置１００を説明する図である。
プログラム作成装置１００は、第１の記憶手段１０１と、第１の演算手段１０２と、実行履歴採取手段１０３と、メモリイメージ作成手段１０４と、小区間情報生成手段１０５と、第２のプログラム生成手段１０６と、を備える。
第１の記憶手段１０１は、データを記憶する記憶手段である。
【００２０】
第１の演算手段１０２は、第１の記憶手段１０１に展開された第１のプログラムを実行する演算手段である。ただし、第１の演算手段１０２を、第１のプログラムのみを実行する演算手段に限定する趣旨ではない。また、第１の演算手段１０２は、必要に応じて、ハードウェアで実現してもよいし、演算装置をエミュレートするエミュレータのようなプログラムで実現してもよい。
【００２１】
実行履歴採取手段１０３は、第１の演算手段１０２が第１のプログラムを実行する場合、第１の演算手段１０２によって実行される第１のプログラムの一部の区間である小区間の開始位置における第１の演算手段１０２の状態に関する初期値情報を取得する。また、実行履歴採取手段１０３は、小区間に第１の演算手段１０２が実行する命令と命令を実行したことにより参照されるデータとに関する情報を取得する。そして、実行履歴採取手段１０３は、初期値情報と、小区間に第１の演算手段１０２が実行する命令と命令を実行したことにより参照されるデータとに関する情報と、を小区間の実行履歴として生成する。
【００２２】
メモリイメージ作成手段１０４は、実行履歴から、第１の記憶手段１０１に展開された第１のプログラムのうち、第１の演算手段１０２が小区間を実行するために必要なデータの再現に用いるメモリイメージを生成する。
【００２３】
小区間情報生成手段１０５は、小区間の開始位置における初期値情報を含む小区間情報を生成する。
第２のプログラム生成手段１０６は、メモリイメージと、小区間情報と、プログラム制御部と、ＯＳの機能のうち前記小区間における前記第１のプログラムの実行に必要な機能を含むモニタプログラムと、モニタプログラム初期化部と、を含む第２のプログラムを生成する。
【００２４】
なお、プログラム制御部は、任意のプログラムを実行する第２の演算手段が使用する第２の記憶手段にメモリイメージを展開する。そして、プログラム制御部は、小区間情報にしたがって小区間の開始位置における第１の演算手段１０２と同じ状態に第２の演算手段を設定する。その後、プログラム制御部は、第２の演算手段に小区間だけ第１のプログラムを実行させる。
【００２５】
また、モニタプログラム初期化部は、モニタプログラムを第２の記憶手段に展開して第２の演算手段による第１のプログラム実行時に要求なサービスがモニタプログラムから提供されるように設定するプログラムである。
【００２６】
このようにして作成された第２のプログラムは、プログラム制御部が、第２の記憶手段にメモリイメージを展開し、小区間の開始位置における第１の演算手段１０２と同じ状態に第２の演算手段を設定し、第２の演算手段に小区間だけ第１のプログラムを実行させるので、ＯＳ上で実行することができる。
【００２７】
また、この第２のプログラムは、モニタプログラム初期化部がモニタプログラムを第２の記憶手段に展開して第２の演算手段による第１のプログラム実行時に要求なサービスがモニタプログラムから提供されるように設定するので、ＯＳがない環境でも実行することができる。
【００２８】
第２のプログラムを使用することで、開発中のＣＰＵのようにＯＳが動作しない環境と、既存のＣＰＵにＯＳがインストールされている環境と、の両方の環境で同一の処理を行うことができるので、開発中のＣＰＵの性能評価の精度を向上させることが可能となる。
【第２の実施例】
【００２９】
１．テストプログラムの作成処理および実行処理の概要
１．１．テストプログラムの作成処理の概要
図２および図３は、テストプログラムを作成する処理の概要を説明する図である。
【００３０】
図２に示す時間軸ｘは、既存の情報処理装置で実行される所定のプログラムの実行経過を示している。図２に示す時間軸ｘは、時刻ｔｓに既存の情報処理装置が所定のプログラムを実行開始し、時刻ｔｅに終了することを示している。
【００３１】
既存の情報処理装置とは、例えば、既に開発を終えた情報処理装置であって開発中の情報処理装置と性能比較を行うために使用する情報処理装置である。なお、この情報処理装置には、ハードウェアをエミュレートするプログラムによって実現されるものを含まれる。この情報処理装置で実行するプログラムであって、テストプログラムの元となるプログラムを「原プログラム」という。
【００３２】
原プログラムを最初から最後まで全て実行させる場合、メモリ空間２００に示す斜線部全てのデータが必要となる。
メモリ空間２００は、情報処理装置に備わるメモリの領域であって、原プログラムが実行可能に展開されている領域を示している。そして、メモリ空間２００内の斜線部は、原プログラムが格納されている領域を示している。なお、メモリ空間２００は、大きく２つの領域を含む。１つ領域は、プログラム命令の実行に必要なデータや一時的に使用するデータなどを記憶するデータ領域である。また、もう１つの領域は、プログラム命令などを記憶する命令領域である。
【００３３】
ここで、時刻ｔ１から時刻ｔ２までの区間だけ原プログラムを実行させる場合、メモリ空間２１０に示す斜線部のデータのみがあればよい。
メモリ空間２１０は、情報処理装置に備わるメモリの領域であって、原プログラムが実行可能に展開されている領域のうち、原プログラムを時刻ｔ１から時刻ｔ２まで実行するために必要なデータを示している。
【００３４】
以下、情報処理装置により原プログラムの一部が実行される区間、例えば、図２に示す時刻ｔ１から時刻ｔ２までに実行される区間を、「小区間」という。そして、小区間開始時刻、例えば図２に示す時刻ｔ１の命令の実行位置を「小区間開始位置」といい、小区間終了時刻、例えば図２に示す時刻ｔ２の命令の実行位置を「小区間終了位置」という。
【００３５】
本実施例では、例えば、時刻ｔ１からｔ２までの小区間における原プログラムの実行履歴を採取する。そして、採取した実行履歴などから、メモリ空間２１０を再現して時刻ｔ１から時刻ｔ２までの小区間を情報処理装置に実行させるテストプログラムを作成する。
【００３６】
本実施例に係るテストプログラム作成の流れについて、図３を参照しながら説明する。
原プログラムの実行処理が小区間の開始時刻ｔ１に到達すると、テストプログラム作成装置は、実行履歴の採取を開始する。
（１）まず、テストプログラム作成装置は、小区間開始位置でのＣＰＵの状態に関する情報を履歴情報として記憶する。ＣＰＵの状態に関する情報には、小区間開始位置における実行開始命令アドレス、ＣＰＵが備える全てのレジスタの値、ＣＰＵが備えるキャッシュの内容、ＴＬＢ（Ｔｒａｎｓｌａｔｉｏｎ  Ｌｏｏｋ  ａｓｉｄｅ  Ｂｕｆｆｅｒ）の内容などを含めることができる。以下、小区間開始位置で採取するＣＰＵの状態に関する履歴情報を「初期値情報」という。
【００３７】
テストプログラム作成装置は、小区間開始位置でのメモリ空間を基準に、参照・変更されたデータを実行履歴として採取する。
なお、キャッシュやＴＬＢの内容は、ＣＰＵから読み出すことが可能であれば、読み出して記憶するのがよい。キャッシュやＴＬＢの情報はＣＰＵの性能評価に影響を与えるからである。ただし、キャッシュやＴＬＢの内容を読み出せない場合は、小区間よりも前のメモリアクセスのアドレス情報などをキャッシュやＴＬＢの内容として代替することも考えられる。
（２）テストプログラム作成装置は、小区間開始位置以後に実行される命令や参照データなどを監視する。そして、小区間に入って最初に参照される命令やデータを検出すると、テストプログラム作成装置は、それら命令やデータを実行履歴として記憶する。例えば、メモリ空間３０１にはない命令ａおよびデータｂが参照されたことを検出すると、テストプログラム作成装置は、命令ａおよびデータｂを履歴情報として記憶する。
（３）小区間に入ってから１度参照された命令やデータは、実行履歴として採取する対象としない。例えば、メモリ空間３０２に示す命令ａおよびデータｂが参照されたことを検出しても、テストプログラム作成装置は、それら命令やデータを改めて履歴情報として記憶はしない。同様に、データが更新されたことを検出しても、テストプログラム作成装置は、更新後のデータを実行履歴として記憶しない。
（４）以上の処理を小区間終了位置まで行うと、小区間の実行に必要なメモリ空間３０４が得られる。本実施例にかかるテストプログラム作成装置は、小区間開始位置で得た初期値情報と小区間の開始位置から終了位置までに得たメモリ空間３０４などからテストプログラムを作成する。
【００３８】
なお、本実施例は、時刻ｔｓから時刻ｔｅまでの全区間を小区間とすることを排除するものではない。しかし、本実施例のように、小区間だけに注目してテストプログラムを作成することによって、テストプログラム作成処理に要するメモリ量を抑えることができる。また、テストプログラムの作成時間も短くすることができる。
【００３９】
図３では、小区間が１つの場合を例にテストプログラムを作成する処理の概要を説明したが、本実施例に係るテストプログラム作成装置は、小区間を複数設定することができる。
【００４０】
図４は、複数の小区間からテストプログラムを作成する処理の概要を説明する図である。
小区間Ａは、開始時刻ｔ１から終了時刻ｔ２までの区間である。小区間Ｂは、開始時刻ｔ３から終了時刻ｔ４までの区間である。小区間Ｃは、開始時刻ｔ５から終了時刻ｔ６までの区間である。
【００４１】
テストプログラム作成装置は、図３で説明した処理によって、小区間Ａから、小区間開始位置の初期値情報４０１ａと、小区間開始位置から終了位置まで実行したときのメモリ空間４０１ｂとを得る。同様に、テストプログラム作成装置は、小区間Ｂから、小区間開始位置の初期値情報４０２ａと、小区間開始位置から終了位置までのメモリ空間４０２ｂと、を得る。また、テストプログラム作成装置は、小区間Ｃから、小区間開始位置の初期値情報４０３ａと、小区間開始位置から終了位置までのメモリ空間４０３ｂとを得る。
【００４２】
すると、テストプログラム作成装置は、初期値情報４０１ａおよびメモリ空間４０１ｂと、初期値情報４０２ａおよびメモリ空間４０２ｂと、初期値情報４０３ａおよびメモリ空間４０３ｂと、から小区間Ａ、ＢおよびＣを連続して実行するテストプログラムを作成する。
【００４３】
例えば、原プログラムのうち、特徴的な処理など所望の処理が含まれる小区間のみを複数抜き出して１つのテストプログラムを生成することにより、テストプログラムを１度実行するだけで、複数の小区間それぞれの処理結果を１度に得ることができる。そのため、開発中の情報処理装置の評価を効率よく行うことが可能となる。
【００４４】
なお、複数の小区間から作成したテストプログラムを実行する場合、各小区間開始位置におけるメモリ空間が情報として必要となる。以下、メモリ空間の再現に用いる情報を「メモリイメージ」という。
【００４５】
例えば、図４に示したテストプログラムを実行する場合、小区間Ａを実行するためにメモリ空間４０１ｂが、小区間Ｂを実行するためにメモリ空間４０２ｂが、小区間Ｃを実行するためにメモリ空間４０３ｂが、それぞれ小区間開始位置で必要となる。したがって、３つのメモリイメージが必要となり、大量にメモリが消費される可能性がある。
【００４６】
そこで、本実施例では、図８〜図１０で後述するように、各小区間開始位置におけるメモリ空間を推測することで、メモリの消費を抑えている。
１．２．テストプログラムの実行処理の概要
図５は、テストプログラムを実行する処理の概要を説明する図である。図５では、小区間Ａを実行させるテストプログラムを実行する場合について説明する。なお、図５に時刻ｔｓから時刻ｔｅまでの区間は、原プログラムの実行区間を示す。
【００４７】
図３で説明したように、テストプログラムは、小区間開始位置における初期値情報５０１ａと、小区間の開始位置から終了位置までのメモリ空間５０１ｂと、を含む。そして、テストプログラムは、実行されると、初期値情報５０１ａにしたがって小区間開始位置のＣＰＵの状態を再現する。また、テストプログラムは、後述する初期メモリイメージ１８０１によってメモリ空間５０１ｂを再現する。
【００４８】
そして、テストプログラムは、ＣＰＵまたはＣＰＵエミュレータ５０２に、再現したメモリ空間５０１ｂ内の命令実行開始アドレスから実行を開始させる。すると、ＣＰＵまたはＣＰＵエミュレータ５０２は、メモリ空間５０１ｂ内の命令を順次実行する。その結果、ＣＰＵまたはＣＰＵエミュレータ５０２は、原プログラムを小区間Ａだけ実行することになる。本実施例で述べる全てのＣＰＵエミュレータは、ＣＰＵだけでなくプログラムの実行に必要なその他のハードウェアもエミュレートするものとする。
【００４９】
なお、キャッシュの内容やＴＬＢの内容は初期値情報５０１ａに必ず含まれる必要はない。しかし、キャッシュやＴＬＢは、ＣＰＵの実行処理を高速化させる機構なので、性能評価に影響を与える場合がある。そのため、初期値情報５０１ａには、キャッシュの内容やＴＬＢの内容を含めることが望ましい。
【００５０】
図６は、テストプログラムの実行形態について説明する図である。
本実施例に係るテストプログラムの実行形態には、以下の２つの実行形態がある。なお、各実行形態は、アプリケーションなどのプログラムを動作させるユーザモードでの動作と、アプリケーションなどにサービスを提供するＯＳなどのプログラムを動作させる特権モードでの動作と、に分けて示している。
（１）第１の実行形態は、開発中のＣＰＵの設計にしたがってＣＰＵをエミュレートするＣＰＵエミュレータ上で、すなわち、ＯＳのサポートがない状態でテストプログラムを実行する実行形態である。
【００５１】
以下、ＯＳのサポートがない状態でテストプログラムを実行する実行形態を「スタンドアロンで実行する」という。
この場合、ＯＳが提供するサービス、例えばメモリ管理や入出力管理などのサービスを提供するプログラムが存在しない。そのため、ユーザモードで動作する一般的なプログラム６０１は、ＯＳが提供するはずのサービスを受けられないことになる。
【００５２】
しかし、本実施例に係るテストプログラム６０２は、特権モードで動作するプログラムを含むので、ＯＳが動作しない環境でも実行可能となっている。このテストプログラム６０２に含まれる特権モードで動作するプログラムを「モニタプログラム」という。このモニタプログラムは、テストプログラム６０２の実行に必要な最低限のサービスであってＯＳ等が提供するはずのサービスを提供する。
（２）第２の実行形態は、ＯＳがインストールされた情報処理装置、すなわちＯＳ上でテストプログラムを実行する実行形態である。
【００５３】
この場合、プログラム６０１が、ＯＳから実行に必要なサービス受けるのと同じように、本実施例に係るテストプログラム６０２も、ＯＳから実行に必要なサービスを受けることができる。したがって、テストプログラム６０２は、実行に必要なサービスをモニタプログラムからではなくＯＳから受けて動作する。この場合、モニタプログラムは、使用しないことになる。
【００５４】
以上のように、本実施例に係るテストプログラム６０２は、ＯＳのサポートがない状態でもＯＳ上でも実行することができる。例えば、既存の情報処理装置と、開発中のＣＰＵの設計にしたがって動作するＣＰＵエミュレータと、に同じテストプログラム６０２を動作させることにより、処理の同一性を評価することができる。
【００５５】
図７は、テストプログラムの実行を終了する処理を説明する図である。
テストプログラムを終了させる場合、プログラムを終了させる終了命令をテストプログラムに埋め込んでも常にうまく動くとは限らない。例えば、図７に示すループ処理中のステップＳ７０１に相当するメモリ空間７０１の命令アドレスに終了命令を埋め込むと、ステップＳ７０１でテストプログラムが終了する。この場合、ステップＳ７０１およびＳ７０２によるループ処理は実行されないことになる。したがって、ステップＳ７０１およびＳ７０２によるループ処理を検証することができないことになる。
【００５６】
このように、ループ処理の前後に終了命令を埋め込むことは可能であるが、ループ処理内に終了命令を埋め込むことはできない。そこで、本実施例に係るテストプログラムは、小区間における実行命令数をカウントし、カウント値が一定命令数に達した時点で小区間でのテストプログラムの実行を終了する。なお、実行命令数のカウントには、ＣＰＵに備わる命令計測機構などを利用することもできる。
【００５７】
本実施例では、複数の小区間から作成したテストプログラムを実行する場合、ある第１の小区間の終了位置のメモリ空間から、第１の小区間の次の第２の小区間の開始位置のメモリ空間を推測する。
【００５８】
図８は、メモリ空間の推測処理を説明する図である。
小区間Ａ終了位置のメモリ空間８０１と、小区間Ｂ開始位置のメモリ空間８０２と、を比較すると、データｐは両空間で同じデータなので、メモリ空間８０１から変更がない。一方、メモリ空間８０１のデータｑはデータｑ’に変更されている。この場合、メモリ空間８０１と、データｑがデータｑ’に変更されたという情報と、があればメモリ空間８０２を推測することができる。
【００５９】
したがって、小区間Ａ終了位置のメモリ空間８０１と、小区間Ｂ開始位置のメモリ空間８０２と、の差分情報があれば、小区間Ａ終了位置のメモリ空間８０１から小区間Ｂ開始位置のメモリ空間８０２を推測することができる。以下、この差分情報を「メモリ初期イメージ推測情報」という。
【００６０】
上記考え方を利用すると、図９に示すような複数の小区間Ａ、ＢおよびＣからなるテストプログラムの最初の小区間Ａ終了位置のメモリ空間を元に、小区間Ｂのメモリ初期イメージ推測情報９０２ｃを用いて、小区間Ｂ開始位置のメモリ空間９０２ｂを推測することができる。同様に、小区間Ｂ終了位置のメモリ空間を元に、小区間Ｃのメモリ初期イメージ推測情報９０３ｃを用いて、小区間Ｃ開始位置のメモリ空間９０３ｂを推測することができる。
【００６１】
したがって、テストプログラムの実行に際し、小区間Ｂ開始位置のメモリ空間９０２ｂおよび小区間Ｃ開始位置のメモリ空間９０３ｂが不要となるので、メモリ使用量を抑えることができる。
【００６２】
図１０は、前小区間の終了位置が不正確な場合にメモリ初期イメージ推測情報を作成する方法について説明する図である。
メモリ空間１００２は、小区間Ａの時刻ｔ２におけるメモリ空間である。また、メモリ空間１００３は、小区間Ａ終了位置、すなわち時刻ｔ３におけるメモリ空間である。また、メモリ空間１００４は、小区間Ｂ開始位置、すなわち時刻ｔ４のメモリ空間である。
【００６３】
例えば、小区間Ａ終了位置のメモリ空間１００３を元に、小区間Ｂのメモリ初期イメージ推測情報を用いて、小区間Ｂ開始位置のメモリ空間１００４を推測する場合、小区間Ａ終了位置のメモリ空間１００３の正確さが問題となる。
【００６４】
所望の小区間終了位置で正確にテストプログラムの実行を終了させることは難しい場合がある。そのため、例えば、小区間Ｂのメモリ初期イメージ推測情報を作成した時の小区間Ａ終了位置のメモリ空間１００３と、テストプログラムを実行する時の小区間Ａ終了位置のメモリ空間１００３’と、が一致しない場合がある。
【００６５】
この場合、メモリ初期イメージ推測情報を以下のように推測することができる。
テストプログラム作成装置は、小区間Ａ終了時刻ｔ３より少し前、例えば、数命令文前の時刻ｔ２におけるメモリ空間１００２を記憶する。そして、テストプログラム作成装置は、小区間Ｂの最初のメモリ参照を検出すると、その参照アドレスにおけるメモリ空間１００２の内容とメモリ空間１００４の内容とを比較する。
【００６６】
参照アドレスにおけるメモリ空間１００２の内容とメモリ空間１００４の内容とが異なる場合、テストプログラム実行装置は、小区間Ａから小区間Ｂの間の欠落部で変更されたと推測できる。
【００６７】
また、参照アドレスにおけるメモリ空間１００２の内容とメモリ空間１００４の内容とが一致する場合、テストプログラム実行装置は、さらに、参照アドレスにおけるメモリ空間１００３の内容とメモリ空間１００２の内容とを比較する。
【００６８】
参照アドレスにおけるメモリ空間１００３の内容とメモリ空間１００２の内容とが異なる場合、テストプログラム実行装置は、小区間Ａの時刻ｔ２から時刻ｔ３までの間に変更され、かつ、小区間Ａ終了時刻ｔ３から小区間Ｂ開始時刻ｔ４までの欠落部で元の値に変更されたと推測できる。
【００６９】
また、参照アドレスにおけるメモリ空間１００３の内容とメモリ空間１００４の内容とが一致する場合、テストプログラム実行装置は、小区間Ａから小区間Ｂまでの欠落部で変更されていないか、欠落部で複数回の変更後に元の値に戻ったものと推測できる。
【００７０】
以上のように、小区間Ａの時刻ｔ２および時刻ｔ３と小区間Ｂの時刻ｔ４の３つの時点でデータを比較することにより、前小区間終了位置が不正確な場合であっても、小区間の初期メモリ空間を正確に推測することが可能となる。以下、各小区間において、時刻ｔ２に該当する原プログラムの終了位置を「第１の終了位置」といい、時刻ｔ３に該当する原プログラムの終了位置を「第２の終了位置」という。
【００７１】
したがって、テストプログラム実行装置は、メモリ空間１００２の内容とメモリ空間１００４の内容との比較結果と、メモリ空間１００３の内容とメモリ空間１００４の内容との比較結果と、を「メモリ初期イメージ推測情報」として記憶することができる。
２．テストプログラムの作成処理および実行処理の詳細
２．１．テストプログラムの作成処理
図１１は、テストプログラムを作成するテストプログラム作成装置１１００の主要部を示す図である。
【００７２】
テストプログラム作成装置１１００は、メモリ１１０１と、ＣＰＵ１１０２と、記憶装置１１０５と、を備える情報処理装置である。より具体的な構成例については、図２７に示す。
【００７３】
メモリ１１０１は、ＯＳやテストプログラム作成用プログラムなどを記憶する。メモリ１１０１には、例えば、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）などの揮発性メモリを使用してもよいし、Ｆｌａｓｈメモリなどの不揮発性メモリを使用してもよい。
【００７４】
ＣＰＵ１１０２は、メモリ１１０１上に展開されるＯＳやテストプログラム作成用プログラムなどを実行する。そして、ＣＰＵ１１０２は、テストプログラム作成用プログラムにしたがって、テストプログラムを作成する。後述するように、ＣＰＵ１１０２は、命令を１命令ずつ実行する機構を備えるＣＰＵであってもよい。
【００７５】
記憶装置１１０５は、テストプログラムの作成に必要な実行履歴の他に、ＯＳやテストプログラム作成用プログラムなどを記憶する。
図１２は、テストプログラムを作成する処理の概要を示すフローチャートである。
【００７６】
テストプログラム作成装置１１００に、テストプログラム作成用プログラムを実行させると、テストプログラム作成装置１１００は、テストプログラム作成用プログラムにしたがってテストプログラム作成処理を開始する（ステップＳ１２００）。
【００７７】
ステップＳ１２０１において、テストプログラム作成装置１１００は、変数ｉに１をセットする。
ステップＳ１２０２において、変数ｉが全ての小区間の数ｎを超える場合（ステップＳ１２０２  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１２０５に移行する。また、変数ｉが全ての小区間の数ｎ以下の場合（ステップＳ１２０２  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１２０３に移行する。この場合、テストプログラム作成装置１１００は、原プログラムをＣＰＵエミュレータ上で動作させて小区間ｉにおける実行履歴ｉを採取する（ステップＳ１２０３）。
【００７８】
ステップＳ１２０４において、テストプログラム作成装置１１００は、変数ｉを１だけ増加させると、処理をステップＳ１２０２に移行する。
一方、ステップＳ１２０５において、テストプログラム作成装置１１００は、実行履歴１から小区間１の開始位置、第１の終了位置および第２の終了位置それぞれのメモリイメージを生成する。ステップＳ１２０６において、テストプログラム作成装置１１００は、実行履歴１や小区間１の開始位置、第１の終了位置および第２の終了位置のメモリイメージなどから、小区間１付随情報を生成する。
【００７９】
ステップＳ１２０７において、テストプログラム作成装置１１００は、変数ｉに２を設定する。
ステップＳ１２０８において、変数ｉが全ての小区間の数ｎを超える場合（ステップＳ１２０８  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１２１２に移行する。また、変数ｉが全ての小区間の数ｎ以下の場合（ステップＳ１２０８  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１２０９に移行する。この場合、テストプログラム作成装置１１００は、実行履歴ｉから小区間ｉの開始位置、第１の終了位置および第２の終了位置それぞれメモリイメージを生成する（ステップＳ１２０９）。ステップＳ１２１０において、テストプログラム作成装置１１００は、実行履歴ｉや小区間ｉの開始位置、第１の終了位置および第２の終了位置のメモリイメージなどから、小区間ｉ付随情報を生成する。
【００８０】
ステップＳ１２１１において、テストプログラム作成装置１１００は、変数ｉを１だけ増加させると、処理をステップＳ１２０８に移行する。
ステップＳ１２１２において、テストプログラム作成装置１１００は、小区間１開始位置のメモリイメージを、テストプログラムの初期メモリイメージとしてテストプログラム内の所定のアドレスに配置する。
【００８１】
ステップＳ１２１３において、テストプログラム作成装置１１００は、全ての小区間付随情報をテストプログラムの所定のアドレスに配置する。
ステップＳ１２１４において、テストプログラム作成装置１１００は、後述するテストプログラム制御部、モニタプログラムおよびモニタプログラム初期化部をテストプログラムの所定のアドレスに配置する。
【００８２】
以上の処理により、実行形式のテストプログラムが作成される（ステップＳ１２１５）。
２．１．１．実行履歴を採取する処理
図１３は、実行履歴を採取する処理の概要を説明する図である。
【００８３】
テストプログラム作成用プログラム１３００は、テストプログラム作成装置１１００に備わるＯＳ上で動作するプログラムである。テストプログラム作成用プログラム１３００は、ＣＰＵ１１０２がテストプログラム作成用プログラム１３００を実行することで実現されるプロセスを示しているが、処理の主体を明確にするために単に「テストプログラム作成用プログラム１３００」と記載する。
【００８４】
テストプログラム作成用プログラム１３００は、ＣＰＵエミュレータ１３０１に原プログラムを実行させる。ＣＰＵエミュレータ１３０１は、既存のＣＰＵ、すなわち開発中のＣＰＵとの比較に用いるＣＰＵであって既に開発済みのＣＰＵの動作をエミュレートして原プログラムを実行する。
【００８５】
例えば、ＣＰＵエミュレータ１３０１は、原プログラムが展開されているメモリ空間１３０２から命令を１命令ずつ読み出し、読み出した命令をエミュレートする。このとき、ＣＰＵエミュレータ１３０１は、読み出した命令にしたがってメモリ空間１３０２のデータの読み出し、更新などを行う。
【００８６】
以下、原プログラムが展開されているメモリ空間１３０２を「原プログラムメモリ空間１３０２」という。
テストプログラム作成用プログラム１３００は、実行履歴採取ステータス情報１３０３が「Ｙ」に設定されている間、ＣＰＵエミュレータ１３０１がエミュレートするＣＰＵの状態や実行する命令などを実行履歴として採取し、記憶装置１１０５に記憶する。
【００８７】
テストプログラム作成用プログラム１３００は、総実行命令数カウンタ１３０４の値が、後述の実行履歴採取開始位置および終了位置情報１３１０で指定される開始命令数になると、実行履歴採取ステータス情報１３０３をＹに設定する。このとき、テストプログラム作成用プログラム１３００は、実行履歴命令数カウンタ１３０５を０に初期化する。また、テストプログラム作成用プログラム１３００は、実行履歴命令数カウンタ１３０５の値が、後述の実行履歴採取開始位置および終了位置情報１３１０で指定される終了命令数になると、実行履歴採取ステータス情報１３０３をＮに設定する。
【００８８】
テストプログラム作成用プログラム１３００は、ＣＰＵエミュレータ１３０１に原プログラムの実行を開始させると、ＣＰＵエミュレータ１３０１が実行する原プログラムの命令数をカウントする。そして、テストプログラム作成用プログラム１３００は、そのカウント値を総実行命令数カウンタ１３０４に記憶する。
【００８９】
また、テストプログラム作成用プログラム１３００は、ＣＰＵエミュレータ１３０１による原プログラムの実行処理が小区間に入ると、ＣＰＵエミュレータ１３０１が実行する原プログラムの命令数をカウントする。そして、テストプログラム作成用プログラム１３００は、そのカウント値を実行履歴命令数カウンタ１３０５に記憶する。
【００９０】
実行履歴採取開始位置および終了位置情報１３１０には、実行履歴採取開始位置情報と、実行履歴採取終了位置情報と、が含まれる。実行履歴採取開始位置情報は、原プログラムの実行開始位置から小区間開始位置までにＣＰＵエミュレータ１３０１が実行する命令数で与えることができる。この命令数を「開始命令数」という。また、実行履歴採取終了位置情報は、例えば、小区間開始位置から小区間終了位置までにＣＰＵエミュレータ１３０１が実行する命令数で与えることができる。この命令数を「終了命令数」という。
【００９１】
また、実行履歴採取開始位置および終了位置情報１３１０は、テーブル１１３１に示すように、実行履歴番号毎に、開始位置および終了位置を指定することができる。これにより複数の小区間を指定することができる。
【００９２】
図１３では、テストプログラム作成用プログラム１３００にＣＰＵエミュレータ１３０１が含まれる場合について示したが、テストプログラム作成用プログラム１３００にＣＰＵエミュレータ１３０１を含める必要はなくてもよい。
【００９３】
同様に、図１３では、原プログラムメモリ空間１３０２は、テストプログラム作成用プログラム１３００のメモリ空間に含まれる場合について示したが、他のメモリ空間に割り当ててもよい。
【００９４】
図１４は、実行履歴の具体例を説明する図である。
実行履歴は、小区間単位で記憶装置１１０５に記憶される。小区間ｉにおける実行履歴を実行履歴ｉとする。
【００９５】
各実行履歴には、小区間開位置の実行開始命令アドレス、レジスタ値、キャッシュの内容およびＴＬＢの内容が含まれる。さらに、各実行履歴には、小区間開始位置から小区間終了位置までにＣＰＵエミュレータ１３０１が実行した命令、命令アドレス、命令実行時に参照されたデータの内容および参照されたデータのアドレスと、が含まれる。
【００９６】
図１５は、実行履歴を採取する処理の具体的な処理を示すフローチャートである。
以下の処理は、テストプログラム作成装置１１００がＯＳ上でテストプログラム作成用プログラム１３００を実行することによって行われる処理であるので、テストプログラム作成装置１１００を処理の主体として記載する。
【００９７】
ステップＳ１５０１において、テストプログラム作成装置１１００は、総実行命令数カウンタ１３０４および実行履歴命令数カウンタ１３０５を０に初期化すると、処理をステップＳ１５０２に移行する。
【００９８】
ステップＳ１５０２において、テストプログラム作成装置１１００は、原プログラムの実行が終了したか否かを判別する。原プログラムの実行が終了したと判断すると（ステップＳ１５０２  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１５２０に移行し、実行履歴を採取する処理を終了する（ステップＳ１５２０）。また、原プログラムの実行が終了していない判断すると（ステップＳ１５０２  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１５０３に移行する。この場合、テストプログラム作成装置１１００は、実行履歴採取ステータス情報１３０３を参照する。そして、テストプログラム作成装置１１００は、実行履歴採取ステータス情報１３０３にＹが設定されているか否かを判別する（ステップＳ１５０３）。
【００９９】
実行履歴採取ステータス情報１３０３にＮが設定されている場合（ステップＳ１５０３  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１５１２に移行する。また、実行履歴採取ステータス情報１３０３にＹが設定されている場合（ステップＳ１５０３  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１５０４に移行する。この場合、テストプログラム作成装置１１００は、原プログラムが展開されているメモリ空間からＣＰＵエミュレータ１３０１内のＰＣ（Ｐｒｏｇｒａｍ  Ｃｏｕｎｔｅｒ）が示す命令を読み出し、読み出した命令を実行履歴として記憶装置１１０５に記憶する（ステップＳ１５０４）。
【０１００】
ステップＳ１５０５において、テストプログラム作成装置１１００は、ステップＳ１５０４で読み出した命令がメモリ読み出し命令か否かを判別する。ステップＳ１５０４で読み出した命令がメモリ読み出し命令以外の命令の場合（ステップＳ１５０５  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１５０７に移行する。また、ステップＳ１５０４で読み出した命令がメモリ読み出し命令である場合（ステップＳ１５０５  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１５０６に移行する。この場合、テストプログラム作成装置１１００は、ステップＳ１５０４で読み出した命令が読み出すメモリ内容を、実行履歴として記憶装置１１０５に記憶する（ステップＳ１５０６）。なお、「命令が読み出すメモリ内容」には、ステップＳ１５０４で読み出した命令が読み出すデータと、そのデータが記憶されているアドレスと、が含まれる。
【０１０１】
ステップＳ１５０７において、テストプログラム作成装置１１００は、実行履歴命令数カウンタ１３０５に１を加算する。
ステップＳ１５０８において、実行履歴命令数カウンタ１３０５の値が、指定された実行履歴採取終了命令数以下の場合（ステップＳ１５０８  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１５１０に移行する。なお、実行履歴採取終了命令数は、図１３に示したように、実行履歴採取開始位置および終了位置情報１３１０によって与えることができる。
【０１０２】
実行履歴命令数カウンタ１３０５の値が、指定された実行履歴採取終了命令数を超えた場合（ステップＳ１５０８  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１５０９に移行する。この場合、テストプログラム作成装置１１００は、実行履歴採取ステータス情報１３０３をＮに設定し（ステップＳ１５０９）、処理をステップＳ１５１０に移行する。
【０１０３】
ステップＳ１５１０において、テストプログラム作成装置１１００は、ステップＳ１５０４で読み出した命令をＣＰＵエミュレータ１３０１にエミュレートさせる。そして、ステップＳ１５１１において、テストプログラム作成装置１１００は、総実行命令数カウンタ１３０４に１を加算し、処理をステップＳ１５０２に移行する。
【０１０４】
一方、ステップＳ１５１２において、テストプログラム作成装置１１００は、総実行命令数カウンタ１３０４の値が、指定された実行履歴採取開始命令数以上であるか否かを判別する。総実行命令数カウンタ１３０４の値が、指定された実行履歴採取開始命令数未満の場合（ステップＳ１５１２  ＮＯ）、テストプログラム作成装置１１００は、命令アドレスを実行履歴に記憶する（ステップＳ１５１７）。すると、テストプログラム作成装置１１００は、処理をステップＳ１５１８に移行する。総実行命令数カウンタ１３０４の値が、指定された実行履歴採取開始命令数以上の場合（ステップＳ１５１２  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１５１３に移行する。この場合、テストプログラム作成装置１１００は、ＣＰＵエミュレータ１３０１からレジスタの値を取得し実行履歴に記憶する（ステップＳ１５１３）。さらに、テストプログラム作成装置１１００は、ＣＰＵエミュレータ１３０１からキャッシュの内容やＴＬＢの内容を取得し実行履歴に記憶する（ステップＳ１５１４）。
【０１０５】
ステップＳ１５１５において、テストプログラム作成装置１１００は、実行履歴命令数カウンタ１３０５を０に初期化する。そして、ステップＳ１５１６において、テストプログラム作成装置１１００は、実行履歴採取ステータス情報１３０３をＹに設定し、処理をステップＳ１５０４に移行する。
【０１０６】
一方、ステップＳ１５１８において、テストプログラム作成装置１１００は、原プログラムが展開されているメモリ空間からＣＰＵエミュレータ１３０１内のＰＣが示す命令を読み出す。そして、読み出した命令がメモリ上のデータの読み出しや更新などを含むメモリアクセス命令である場合（ステップＳ１５１８  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１５１９に移行する。この場合、テストプログラム作成装置１１００は、アクセス先のアドレスを、実行履歴の付随情報として記憶装置１１０５に記憶する（ステップＳ１５１９）。後にキャッシュやＴＬＢの内容を再現するためである。その後、テストプログラム作成用は、処理をステップＳ１５１０に移行する。
【０１０７】
また、読み出した命令がメモリ上のデータの読み出しや更新などを含むメモリアクセス命令でない場合（ステップＳ１５１８  ＮＯ）も、テストプログラム作成用は、処理をステップＳ１５１０に移行する。
【０１０８】
以上に説明した実行履歴を採取する処理において、ステップＳ１５１８およびＳ１５１９は必ずしも必要でない。しかし、例えば、Ｓ１５１４の処理でキャッシュおよびＴＬＢの内容を取得できない場合、ステップＳ１５１９で記憶したメモリアドレスから、キャッシュおよびＴＬＢの内容を再現することができる。
【０１０９】
図１６は、実行履歴を採取する処理のもう１つの例の概要を説明する図である。
実行履歴を採取する実行履歴採取用プログラム１６００は、テストプログラム作成用プログラム１３００と独立に実行されるプログラムである。そして、実行履歴採取用プログラム１６００は、ＯＳを介すことなく、テストプログラム作成装置１１００に備わるＣＰＵ１１０２上で実行される。
【０１１０】
なお、図１６に示す実行履歴採取用プログラム１６００は、ＣＰＵ１１０２が実行履歴採取用プログラム１６００を実行することによって実現されるプロセスを示しているが、処理の主体を明確にするために単に「実行履歴採取用プログラム１６００」と記載する。
【０１１１】
実行履歴採取用プログラム１６００を使用して実行履歴を採取する場合、ＣＰＵ１１０２は、命令を１命令ずつ実行する機構を備える必要がある。実行履歴採取用プログラム１６００は、ＣＰＵ１１０２が原プログラムやＯＳを含む任意の命令を１つ実行する毎に呼び出されて実行される。
【０１１２】
例えば、ＣＰＵ１１０２が任意の命令を１つ実行すると、実行履歴採取用プログラム１６００が呼び出される。そして、実行履歴採取ステータス情報１６０１が「Ｙ」、かつ、ＣＰＵ１１０２が実行した命令が原プログラムの命令である場合、実行履歴採取用プログラム１６００は、ＣＰＵ１１０２の状態や実行した命令などを実行履歴として記憶装置１１０５に記憶する。
【０１１３】
実行履歴採取用プログラム１６００は、総実行命令数カウンタ１６０２の値が、実行履歴採取開始位置および終了位置情報１３１０で指定される開始命令数になると、実行履歴採取ステータス情報１６０１をＹに設定する。このとき、実行履歴採取用プログラム１６００は、実行履歴命令数カウンタ１６０３を０に初期化する。また、実行履歴採取用プログラム１６００は、実行履歴命令数カウンタ１６０３の値が、実行履歴採取開始位置および終了位置情報１３１０で指定される終了命令数になると、実行履歴採取ステータス情報１６０１をＮに設定する。
【０１１４】
実行履歴採取用プログラム１６００は、ＣＰＵ１１０２から呼び出されると、ＣＰＵ１１０２が原プログラムの命令を実行している場合だけ、総実行命令数カウンタ１６０２に１を加算する。
【０１１５】
また、実行履歴採取用プログラム１６００は、ＣＰＵ１１０２が原プログラムの小区間を実行している場合だけ、実行履歴命令数カウンタ１６０３に１を加算する。
図１７は、実行履歴を採取する処理のもう１つの例の具体的な処理を示すフローチャートである。
【０１１６】
１命令毎に実行履歴採取用プログラム１６００を呼び出す設定をしてＣＰＵ１１０２を起動すると、ＣＰＵ１１０２はＯＳや原プログラムなど任意の命令を１命令実行する毎に、実行履歴採取用プログラム１６００を呼び出して以下に示す処理を実行する。
【０１１７】
なお、以下の処理は、ＣＰＵ１１０２が実行履歴採取用プログラム１６００を実行することによって行われる処理であるが、処理の主体を明確にするためにＣＰＵ１１０２を備えるテストプログラム作成装置１１００を主体として記載する。
【０１１８】
実行履歴採取用プログラム１６００が最初に呼び出された場合、テストプログラム作成装置１１００は、総実行命令数カウンタ１６０２と実行履歴命令数カウンタ１６０３を初期化してから実行履歴の採取処理を開始する（ステップＳ１７００）。
【０１１９】
ステップＳ１７０１において、テストプログラム作成装置１１００は、実行履歴採取用プログラム１６００を呼び出す直前に実行した命令が実行履歴として履歴採取の対象であるか否かを判別する。以下、実行履歴採取用プログラム１６００を呼び出す直前に実行した命令を、「実行命令」という。
【０１２０】
例えば、実行命令の命令アドレスが、メモリ上に展開されている原プログラムの領域内である場合、テストプログラム作成装置１１００は、実行命令が実行履歴として履歴採取の対象であると判断できる。
【０１２１】
実行命令が実行履歴として履歴採取の対象ではないと判断した場合（ステップＳ１７０１  ＮＯ）、テストプログラム作成装置１１００は、ステップＳ１７１９に移行して実行履歴の採取処理を終了する。また、実行命令が実行履歴として履歴採取の対象であると判断した場合（ステップＳ１７０１  ＹＥＳ）、テストプログラム作成装置１１００は、ステップＳ１７０２に移行する。
【０１２２】
ステップＳ１７０２において、テストプログラム作成装置１１００は、実行命令がユーザモードで実行されたか否かを判断する。実行命令が特権モードで実行された場合（ステップＳ１７０２  ＮＯ）、テストプログラム作成装置１１００は、ステップＳ１７１９に移行して実行履歴の採取処理を終了する。原プログラムはユーザモードで実行されるプログラムだからである。
【０１２３】
実行命令がユーザモードで実行された場合（ステップＳ１７０２  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１７０３に移行する。この場合、テストプログラム作成装置１１００は、実行履歴採取ステータス情報１６０１を参照する。そして、テストプログラム作成装置１１００は、実行履歴採取ステータス情報１６０１にＹが設定されているか否かを判別する（ステップＳ１７０３）。
【０１２４】
実行履歴採取ステータス情報１６０１にＮが設定されている場合（ステップＳ１７０３  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１７１１に移行する。また、実行履歴採取ステータス情報１６０１にＹが設定されている場合（ステップＳ１７０３  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１７０４に移行する。この場合、テストプログラム作成装置１１００は、実行命令を実行履歴として記憶装置１１０５に記憶する（ステップＳ１７０４）。
【０１２５】
ステップＳ１７０５において、テストプログラム作成装置１１００は、ステップＳ１７０４で取得した命令がメモリ読み出し命令か否かを判別する。ステップＳ１７０４で取得した命令がメモリ読み出し命令以外の命令の場合（ステップＳ１７０５  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１７０７に移行する。また、ステップＳ１７０４で読み出した命令がメモリ読み出し命令である場合（ステップＳ１７０５  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１７０６に移行する。この場合、テストプログラム作成装置１１００は、ステップＳ１７０４で取得した命令が読み出すメモリ内容を、実行履歴として記憶装置１１０５に記憶する（ステップＳ１７０６）。なお、命令が読み出すメモリ内容には、ステップＳ１７０４で読み出した命令が読み出すデータと、そのデータが記憶されているアドレスと、を含む情報である。
【０１２６】
ステップＳ１７０７において、テストプログラム作成装置１１００は、実行履歴命令数カウンタ１６０３に１を加算する。
ステップＳ１７０８において、実行履歴命令数カウンタ１６０３の値が、指定された実行履歴採取終了命令数以下の場合（ステップＳ１７０８  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１７１０に移行する。なお、実行履歴採取終了命令数は、図１３に示したように、実行履歴採取開始位置および終了位置情報１３１０の実行履歴採取終了位置情報によって与えることができる。
【０１２７】
実行履歴命令数カウンタ１６０３の値が、指定された実行履歴採取終了命令数を超えた場合（ステップＳ１７０８  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１７０９に移行する。この場合、テストプログラム作成装置１１００は、実行履歴採取ステータス情報１６０１をＮに設定し、処理をステップＳ１７１０に移行する。
【０１２８】
ステップＳ１７１０において、テストプログラム作成装置１１００は、総実行命令数カウンタ１６０２に１を加算する。すると、テストプログラム作成装置１１００は、ステップＳ１７１９に移行して実行履歴の採取処理を終了する。
【０１２９】
一方、ステップＳ１７１１において、テストプログラム作成装置１１００は、総実行命令数カウンタ１６０２の値が、指定された実行履歴採取開始命令数以上であるか否かを判別する。総実行命令数カウンタ１６０２の値が、指定された実行履歴採取開始命令数未満以下の場合（ステップＳ１７１１  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１７１６に移行する。総実行命令数カウンタ１６０２の値が指定された実行履歴採取開始命令数以上の場合（ステップＳ１７１１  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１７１２に移行する。この場合、テストプログラム作成装置１１００は、ＣＰＵからレジスタの値を取得し実行履歴に記憶する（ステップＳ１７１２）。さらに、テストプログラム作成装置１１００は、ＣＰＵからキャッシュの内容やＴＬＢの内容を取得し実行履歴に記憶する（ステップＳ１７１３）。
【０１３０】
ステップＳ１７１４において、テストプログラム作成装置１１００は、実行履歴命令数カウンタ１６０３を０に初期化する。すると、ステップＳ１７１５において、テストプログラム作成装置１１００は、実行履歴採取ステータス情報１６０１をＹに設定し、処理をステップＳ１７０４に移行する。
【０１３１】
一方、ステップＳ１７１６において、テストプログラム作成装置１１００は、命令アドレスを実行履歴に記憶する（ステップＳ１７１６）。そして、テストプログラム作成装置１１００は、処理をステップＳ１７１７に移行する。実行命令がメモリ上のデータの読み出しや更新などを含むメモリアクセス命令である場合（ステップＳ１７１７  ＹＥＳ）、テストプログラム作成装置１１００は、アクセス先のアドレスを実行履歴の付随情報として記憶装置１１０５に記憶する（ステップＳ１７１８）。後にキャッシュやＴＬＢの内容を再現するためである。その後、テストプログラム作成用は、処理をステップＳ１７１０に移行する。
【０１３２】
また、読み出した命令がメモリ上のデータの読み出しや更新などを含むメモリアクセス命令でない場合（ステップＳ１７１７  ＮＯ）も、テストプログラム作成用は、処理をステップＳ１７１０に移行する。
【０１３３】
以上に説明した実行履歴を採取する処理において、ステップＳ１７１７およびＳ１７１８の処理は必ずしも必要でない。しかし、例えば、Ｓ１７１３の処理でキャッシュおよびＴＬＢの内容を取得できない場合、ステップＳ１７１８で記憶したメモリアドレスから、キャッシュおよびＴＬＢの内容を再現することができる。
２．１．２．実行履歴からテストプログラムを作成する処理
図１８は、テストプログラム１８００を作成する処理の具体的な流れを説明する図である。
【０１３４】
テストプログラム作成装置１１００は、記憶装置１１０５に記憶されている実行履歴１から、メモリ上に展開してテストプログラム実行開始位置のメモリ空間の実現に用いる初期メモリイメージ１８０１を生成する。なお、図１８には、理解を容易にするために、初期メモリイメージ１８０１がメモリ上に展開された状態を示している。
【０１３５】
また、テストプログラム作成装置１１００は、記憶装置１１０５に記憶されている実行履歴ｉにしたがって、小区間ｉにおける初期メモリイメージａ、第１の終了位置メモリイメージｂおよび第２の終了位置メモリイメージｃを生成する。
【０１３６】
小区間ｉの初期メモリイメージａは、メモリ上に展開して図１０に示した初期メモリ空間１００４の生成に用いるデータである。また、小区間ｉの第１の終了位置メモリイメージｂは、メモリ上に展開して図１０に示した第１の終了位置メモリ空間１００２の生成に用いるデータである。また、小区間ｉの第２の終了位置メモリイメージｃは、メモリ上に展開して図１０に示した第２の終了位置メモリ空間１００３の生成に用いるデータである。なお、図１８には、理解を容易にするために、初期メモリイメージａ、第１の終了位置メモリイメージｂおよび第２の終了位置メモリイメージｃが、それぞれメモリ上に展開された状態を示している。
【０１３７】
そして、テストプログラム作成装置１１００は、実行履歴ｉ、小区間ｉにおける初期メモリイメージａ、第１の終了位置メモリイメージｂおよび第２の終了位置メモリイメージｃなどから小区間ｉ付随情報を作成する。小区間１付随情報、小区間２付随情報、・・・および小区間ｎ付随情報を総じて「小区間付随情報１８０２」という。
【０１３８】
最後に、テストプログラム作成装置１１００は、初期メモリイメージ１８０１、小区間付随情報１８０２、テストプログラム制御部１８０３、モニタプログラム１８０４およびモニタプログラム初期化部１８０５を関連づけ実行形式のテストプログラム１８００を生成する。
【０１３９】
以上のようにして生成されたテストプログラム１８００は、初期メモリ空間１８０１と、小区間付随情報１８０２と、テストプログラム制御部１８０３と、モニタプログラム１８０４と、モニタプログラム初期化部１８０５と、を備える。
【０１４０】
初期メモリイメージ１８０１は、上述のように、テストプログラム１８００実行時、すなわち、小区間１開始位置のメモリ空間の実現に用いるデータである。
小区間付随情報１８０２は、小区間毎に設けられる付随情報であって、小区間１付随情報、小区間２付随情報、・・・および小区間ｎ付随情報を含む。例えば、図１８に示すように、小区間ｉ付随情報には、初期値情報と、メモリ初期状態推測情報と、実行命令数情報と、を含むことができる。
【０１４１】
初期値情報は、小区間ｎ開始位置のＣＰＵの状態を示す情報である。初期値情報には、小区間ｎ開始位置の命令アドレス、小区間開始位置のレジスタ値、小区間開始位置のＴＬＢの内容を示すＴＬＢ情報、小区間開始位置のキャッシュの内容を示すキャッシュ情報などを含めることができる。
【０１４２】
メモリ初期状態推測情報は、前小区間ｎ−１終了位置のメモリ空間と小区間ｎ開始位置のメモリ空間の差分を示す情報である。前小区間ｎ−１終了位置のメモリ空間とメモリ初期状態推測情報とから小区間ｎ開始位置のメモリ空間を推測することができる。メモリ空間の推測については、図８〜図１０で述べたとおりである。
【０１４３】
実行命令数情報は、小区間ｎ開始位置から第２の終了位置までの命令数と、小区間ｎ開始位置から第１の終了位置までの命令数と、を含むことができる。メモリ空間の推測に使用するためにある。
【０１４４】
テストプログラム制御部１８０３は、テストプログラム１８００全体を制御してテストプログラム１８００を実行させる。例えば、テストプログラム１８００は、小区間ｎ−１の実行が完了すると、小区間ｎ付随情報を読み出す。そして、テストプログラム作成装置１１００は、初期値情報にしたがってＣＰＵの状態を初期化し、小区間ｎ−１終了位置のメモリ空間とメモリ初期イメージ推測情報とから小区間ｎの初期メモリ空間を作成する。そして、テストプログラム作成装置１１００は、小区間ｎの実行を開始させる。
【０１４５】
テストプログラム制御部１８０３、の具体的な内容については、図２２〜図２３、図２５〜図２６で説明する。
モニタプログラム１８０４は、テストプログラム１８００の実行に必要な最低限のサービスであってＯＳ等が提供するはずのサービスを提供する。モニタプログラム１８０４は、あらかじめ用意しておいてもよい。この場合、テストプログラム１８００の実行に必要と思われる機能をあらかじめ組み込んでおけばよい。また、後述の図１９や図２０に示す実行履歴採取を採取する処理の時、例えば、ステップＳ１９０６やＳ２００６などに、システムコール等でＯＳに要求されたサービスを検出し、検出したサービスを提供する機能だけを組み込んでモニタプログラム１８０４を作成してもよい。
【０１４６】
モニタプログラム初期化部１８０５は、モニタプログラム１８０４を、メモリ上に展開して特権モードで実行可能な状態に初期化する。例えば、モニタプログラム初期化部１８０５は、テストプログラム１８００実行時にシステムコールが発行されるとモニタプログラム１８０４が呼び出されるように設定する。モニタプログラム初期化部１８０５は、あらかじめ用意しておくことができる。
【０１４７】
図１９は、図１２に示したステップＳ１２０５の具体的な処理を示すフローチャートである。
ステップＳ１９０１において、テストプログラム作成装置１１００は、これから作成するメモリイメージを初期化する。
【０１４８】
ステップＳ１９０２において、テストプログラム作成装置１１００は、記憶装置１１０５に記憶されている実行履歴１を参照し、実行開始命令アドレスおよびレジスタ値を読み出す。そして、テストプログラム作成装置１１００は、読み出した実行開始命令アドレスおよびレジスタ値を、テストプログラム１８００内の小区間１付随情報の所定位置に配置する。
【０１４９】
ステップＳ１９０３において、テストプログラム作成装置１１００は、記憶装置１１０５に記憶されている実行履歴１を参照し、キャッシュ情報およびＴＬＢ情報を読み出す。そして、テストプログラム作成装置１１００は、読み出したキャッシュ情報およびＴＬＢ情報を、テストプログラム１８００内の小区間１付随情報の所定位置に配置する。
【０１５０】
ステップＳ１９０４において、テストプログラム作成装置１１００は、小区間１の第１の終了位置まで処理が完了したか否かを判別する。例えば、テストプログラム作成装置１１００は、実行履歴１から読み出した命令数が、あらかじめ決められた命令数を超えたとき、小区間１の第１の終了位置まで処理が完了したと判断できる。
【０１５１】
第１の終了位置まで処理が完了したと判断すると（ステップＳ１９０４  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１９０５に移行する。この場合、テストプログラム作成装置１１００は、メモリイメージを第１の終了位置メモリイメージにコピーする（ステップＳ１９０５）。そして、テストプログラム作成装置１１００は、処理をステップＳ１９０６に移行する。また、第１の終了位置まで処理が完了していない判断すると（ステップＳ１９０４  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１９０６に移行する。
【０１５２】
ステップＳ１９０６において、テストプログラム作成装置１１００は、実行履歴１から、ｎ番目の命令および命令アドレスを読み出す。なお、ｎは１以上の自然数である。
ステップＳ１９０７において、テストプログラム作成装置１１００は、ステップＳ１９０６で読み出した命令アドレスが初出か否かを判別する。その命令アドレスが初出の場合（ステップＳ１９０７  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１９０８に移行する。この場合、テストプログラム作成装置１１００は、メモリイメージ内のアドレスであってステップＳ１９０６で読み出した命令の命令アドレスに対応するアドレスに、その読み出した命令を反映する（ステップＳ１９０８）。そして、テストプログラム作成装置１１００は、処理をステップＳ１９０９に移行する。また、ステップＳ１９０６で読み出した命令アドレスが初出でない場合（ステップＳ１９０７  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１９０９に移行する。
【０１５３】
ステップＳ１９０９において、テストプログラム作成装置１１００は、ステップＳ１９０６で読み出した命令がメモリ読み出し処理を含むか否かを判別する。ステップＳ１９０６で読み出した命令がメモリ読み出し処理を含まない場合（ステップＳ１９０９  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１９１２に移行する。また、ステップＳ１９０６で読み出した命令がメモリ読み出し処理を含む場合（ステップＳ１９０９  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１９１０に移行する。この場合、テストプログラム作成装置１１００は、ステップＳ１９０６で読み出した命令が読み出すデータのアドレスが初出か否かを判別する（ステップＳ１９１０）。
【０１５４】
読み出すデータのアドレスが初出でない場合（ステップＳ１９１０  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１９１２に移行する。また、読み出すデータのアドレスが初出の場合（ステップＳ１９１０  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１９１１に移行する。この場合、テストプログラム作成装置１１００は、メモリイメージ内のアドレスであってステップＳ１９０６で読み出した命令が読み出すデータのアドレスに対応するアドレスに、その読み出すデータを反映する（Ｓ１９１１）。
【０１５５】
ステップＳ１９１２において、テストプログラム作成装置１１００は、小区間１が終了、すなわち実行履歴１に記憶されているｎ番目の命令まで処理が完了したか否かを判別する。
【０１５６】
小区間１が終了していない場合（ステップＳ１９１２  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ１９０４に移行する。
また、小区間１が終了した場合（ステップＳ１９１２  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ１９１３に移行する。この場合、テストプログラム作成装置１１００は、メモリイメージを第２の終了位置メモリイメージにコピーする（ステップＳ１９１３）。
【０１５７】
以上の処理が完了すると、テストプログラム作成装置１１００は、処理を図１２に示したステップＳ１２０６に移行する。
ステップＳ１２０６では、テストプログラム作成装置１１００が、テストプログラム作成装置１１００内の小区間ｉ付随情報の実行命令数情報に、第１の終了位置命令数および第２の終了位置命令数を配置して小区間ｉ付随情報を完成させる。
【０１５８】
なお、小区間１付随情報のメモリ初期化イメージ推測情報は作成しなくてもよい。小空間１の初期メモリイメージは、テストプログラム１８００の初期メモリイメージ１８０１と同じだからである。
【０１５９】
図２０は、図１２に示したステップＳ１２０９の具体的な処理を示すフローチャートである。
ステップＳ２００１において、テストプログラム作成装置１１００は、これから作成するメモリイメージを初期化する。
【０１６０】
ステップＳ２００２において、テストプログラム作成装置１１００は、記憶装置１１０５に記憶されている実行履歴ｉを参照し、実行開始命令アドレスおよびレジスタ値を読み出す。そして、テストプログラム作成装置１１００は、読み出した実行開始命令アドレスおよびレジスタ値を、テストプログラム１８００内の小区間ｉ付随情報の所定位置に配置する。
【０１６１】
ステップＳ２００３において、テストプログラム作成装置１１００は、記憶装置１１０５に記憶されている実行履歴ｉを参照し、キャッシュ情報およびＴＬＢ情報を読み出す。そして、テストプログラム作成装置１１００は、読み出したキャッシュ情報およびＴＬＢ情報を、テストプログラム１８００内の小区間ｉ付随情報の所定位置に配置する。
【０１６２】
ステップＳ２００４において、テストプログラム作成装置１１００は、小区間ｉの第１の終了位置まで処理が完了したか否かを判別する。例えば、テストプログラム作成装置１１００は、実行履歴１から読み出した命令数が、あらかじめ決められた命令数を超えたとき、小区間１の第１の終了位置まで処理が完了したと判断できる。
【０１６３】
第１の終了位置まで処理が完了したと判断すると（ステップＳ２００４  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ２００５に移行する。この場合、テストプログラム作成装置１１００は、メモリイメージを第１の終了位置メモリイメージにコピーする（ステップＳ２００５）。そして、テストプログラム作成装置１１００は、処理をステップＳ２００６に移行する。また、第１の終了位置まで処理が完了していない判断すると（ステップＳ２００４  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ２００６に移行する。
【０１６４】
ステップＳ２００６において、テストプログラム作成装置１１００は、実行履歴ｉから、ｎ番目の命令および命令アドレスを読み出す。なお、ｎは１以上の自然数である。
ステップＳ２００７において、テストプログラム作成装置１１００は、ステップＳ２００６で読み出した命令アドレスが、既に処理済みの全ての実行履歴を通じて初出か否かを判別する。ステップＳ２００６で読み出した命令アドレスが既に処理済みの全ての実行履歴を通じて初出の場合（ステップＳ２００７  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ２００８に移行する。この場合、テストプログラム作成装置１１００は、メモリイメージ内のアドレスであってステップＳ２００６で読み出した命令の命令アドレスに対応するアドレスに、その読み出した命令を反映する（ステップＳ２００８）。そして、テストプログラム作成装置１１００は、処理をステップＳ２０１１に移行する。また、ステップＳ２００６で読み出した命令アドレスが既に処理済みの実行履歴のなかで既出の場合（ステップＳ２００７  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ２００９に移行する。
【０１６５】
ステップＳ２００９において、テストプログラム作成装置１１００は、ステップＳ２００６で読み出した命令アドレスが、「実行履歴ｉ−１の第１および第２の終了位置」と同じであるか否かを判別する。
【０１６６】
ステップＳ２００６で読み出した命令アドレスの命令が、「実行履歴ｉ−１の第１および第２の終了位置」と同じでない場合（ステップＳ２００９  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ２０１０に移行する。この場合、テストプログラム作成装置１１００は、ステップＳ２００６で読み出した命令アドレスの命令を、小区間ｉの初期メモリ空間の再現に用いるメモリ初期イメージ推測情報として記憶する（ステップＳ２０１０）。そして、テストプログラム作成装置１１００は、処理をステップＳ２０１１に移行する。
【０１６７】
また、ステップＳ２００６で読み出した命令アドレスの命令が、「実行履歴ｉ−１の第１および第２の終了位置」と同じである場合（ステップＳ２００９  ＹＥＳ）、テストプログラム作成装置１１００はステップＳ２０１１に移行する。
【０１６８】
ステップＳ２０１１において、テストプログラム作成装置１１００は、ステップＳ２００６で読み出した命令がメモリ読み出し処理を含むか否かを判別する。ステップＳ２００６で読み出した命令がメモリ読み出し処理を含まない場合（ステップＳ２０１１  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ２０１６に移行する。また、ステップＳ２００６で読み出した命令がメモリ読み出し処理を含む場合（ステップＳ２０１１  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ２０１２に移行する。この場合、テストプログラム作成装置１１００は、ステップＳ２００６で読み出した命令が読み出すデータのアドレスが、既に処理済みの全ての実行履歴を通じて初出か否かを判別する（ステップＳ２０１２）。
【０１６９】
読み出すデータのアドレスが、既に処理済みの全ての実行履歴を通じて初出の場合（ステップＳ２０１２  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ２０１３に移行する。この場合、テストプログラム作成装置１１００は、メモリイメージ内のアドレスであってステップＳ２００６で読み出した命令が読み出すデータのアドレスに対応するアドレスに、その読み出すデータを反映する（ステップＳ２０１３）。そして、テストプログラム作成装置１１００は、処理をステップＳ２０１６に移行する。
【０１７０】
読み出すデータのアドレスが、既に処理済みの全ての実行履歴のなかで既出の場合（ステップＳ２０１２  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ２０１４に移行する。この場合、テストプログラム作成装置１１００は、ステップＳ２００６で読み出した命令が読み出すデータのアドレスにおいて、その読み出すデータが「実行履歴ｉで初出、かつ、第２の終了位置と第１の終了位置で同じ内容」であるか否かを判別する（ステップＳ２０１４）。
【０１７１】
ステップＳ２００６で読み出した命令が読み出すデータのアドレスにおいて、その読み出すデータが、「実行履歴ｉで初出、かつ、第２の終了位置と第１の終了位置で同じ内容」でない場合（ステップＳ２０１４  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ２０１５に移行する。この場合、テストプログラム作成装置１１００は、ステップＳ２００６で読み出した命令が読み出すデータを、小区間ｉの初期メモリ空間の再現に用いるメモリ初期イメージ推測情報として記憶する。そして、テストプログラム作成装置１１００は、処理をステップＳ２０１６に移行する。
【０１７２】
ステップＳ２０１６において、テストプログラム作成装置１１００は、小区間ｉが終了、すなわち実行履歴ｉに記憶されているｎ番目の命令まで処理が完了したか否かを判別する。
【０１７３】
小区間ｉが終了していない場合（ステップＳ２０１６  ＮＯ）、テストプログラム作成装置１１００は、処理をステップＳ２００４に移行する。
また、小区間ｉが終了した場合（ステップＳ２０１６  ＹＥＳ）、テストプログラム作成装置１１００は、処理をステップＳ２０１７に移行する。この場合、テストプログラム作成装置１１００は、メモリイメージを第２の終了位置メモリイメージにコピーする（ステップＳ２０１７）。
【０１７４】
以上の処理が完了すると、テストプログラム作成装置１１００は、処理を図１２に示したステップＳ１２１０に移行する。
ステップＳ１２１０では、テストプログラム作成装置１１００が、小区間ｉー１における初期メモリイメージａと、小区間ｉにおける第１の終了位置メモリイメージｂおよび第２の終了位置メモリイメージｃと、比較する。そして、テストプログラム作成装置１１００は、比較の結果一致しないデータおよびそのデータのアドレスを、テストプログラム１８００内の小区間ｉ付随情報のメモリ初期化イメージ推測情報に配置する。
【０１７５】
さらに、テストプログラム作成装置１１００は、テストプログラム作成装置１１００内の小区間ｉ付随情報の実行命令数情報に、第１の終了位置命令数および第２の終了位置命令数を配置して小区間ｉ付随情報を完成させる。
２．２．テストプログラムの実行処理
図２１は、テストプログラム１８００をスタンドアロンで実行する場合の実行処理の概要を説明する図である。
【０１７６】
開発中のＣＰＵは、テストプログラム１８００を実行できるハードウェアとして存在しない場合も多い。そこで、本実施例では、開発中のＣＰＵの設計に基づいてＣＰＵをエミュレートするＣＰＵエミュレータ２１１０を用いてテストプログラム１８００を実行する。
【０１７７】
この場合、テストプログラム１８００をスタンドアロンで実行することになる。そのため、テストプログラム１８００の実行に必要なサービスであってＯＳが提供するものは、モニタプログラム１８０４が提供する。
【０１７８】
テストプログラム１８００は、以下のように実行される。
（１）テストプログラム１８００をメモリ上に展開し、モニタプログラム初期化部１８０５からの実行を指定した後、ＣＰＵエミュレータ２１１０を起動すると、モニタプログラム初期化部１８０５が実行される。モニタプログラム初期化部１８０５は、モニタプログラム１８０４を特権モードで実行可能な状態に初期化する。すると、モニタプログラム初期化部１８０５はテストプログラム制御部１８０３に制御を移行する。
（２）テストプログラム制御部１８０３は、初期メモリイメージ１８０１を、テストプログラム１８００が展開されるメモリ空間の所定の領域に展開する。この初期メモリイメージ１８０１が展開される所定の領域を、「原プログラム再現空間」という。
【０１７９】
また、テストプログラム制御部１８０３は、小区間１付随情報の初期値情報からレジスタ値、ＴＬＢ情報およびキャッシュ情報などを読み出す。そして、テストプログラム制御部１８０３は、読み出したレジスタ値、ＴＬＢ情報およびキャッシュ情報にしたがって、ＣＰＵエミュレータ２１１０を小区間１開始位置の状態に初期化する。
（３）テストプログラム制御部１８０３が小区間１付随情報の初期値情報が示す命令実行開始アドレスからの命令実行を指示すると、ＣＰＵエミュレータ２１１０は指示された命令実行開始アドレスから、原プログラム再現空間に展開された原プログラムの実行を開始する。
【０１８０】
原プログラムの実行中、原プログラムがＴＬＢミスやシステムコールなどＯＳが提供するサービスを要求すると、その要求をモニタプログラム１８０４が受ける。そして、モニタプログラム１８０４は、原プログラムに対して要求されたサービスを提供する。
（４）小区間１の実行が終了すると、割り込み処理などにより、原プログラム再現空間内の原プログラムからテストプログラム制御部１８０３に制御が移行する。
【０１８１】
この処理は、一定命令数を実行後に割り込みを発生させるＣＰＵの機能を使用することで実現できる。例えば、小区間１付随情報の実行命令数情報に指定された第１の終了位置命令数だけ命令を実行すると、割り込み処理により原プログラムからテストプログラム制御部１８０３に制御を移行させるようにすればよい。
（５）プログラム制御部１８０３は、原プログラムの実行命令数が、小区間１付随情報の実行命令数情報に設定された命令数の範囲内、すなわち第１の終了位置命令数と第２の終了位置命令数の間であるかを確認する。実行命令数が、小区間１付随情報の実行命令数情報に設定された命令数の範囲内にない場合、プログラム制御部１８０３は、次の小区間開始位置の初期メモリイメージａを推測できないため、テストプログラム１８００の実行を中止する。
（６）プログラム制御部１８０３は、次の小区間の付随情報である小区間２付随情報からメモリ初期イメージ推測情報を読み出し、メモリ初期イメージ推測情報から小区間２開始位置の初期メモリイメージａを推測する。そして、プログラム制御部１８０３は、推測した小区間２開始位置の初期メモリイメージａを原プログラム再現空間に展開する。
（７）テストプログラム制御部１８０３は、小区間２付随情報の初期値情報からレジスタ値、ＴＬＢ情報およびキャッシュ情報などを読み出す。そして、テストプログラム制御部１８０３は、読み出したレジスタ値、ＴＬＢ情報およびキャッシュ情報にしたがって、ＣＰＵエミュレータ２１１０を小区間２開始位置の状態に初期化する。
（８）テストプログラム制御部１８０３が小区間２付随情報の初期値情報が示す命令実行開始アドレスからの命令実行を指示すると、ＣＰＵエミュレータ２１１０は指示された命令実行開始アドレスから、原プログラム再現空間に展開された原プログラムの実行を開始する。
（９）小区間２の命令の実行を終了すると、割り込み処理などにより、原プログラム再現空間内の原プログラムからテストプログラム制御部１８０３に制御が移行する。
（１０）プログラム制御部１８０３は、原プログラムの実行命令数が、小区間２付随情報の実行命令数情報に設定された命令数の範囲内、すなわち第１の終了位置命令数と第２の終了位置命令数の間であるかを確認する。実行命令数が、小区間２付随情報の実行命令数情報に設定された命令数の範囲内にない場合、プログラム制御部１８０３は、次の小区間開始位置の初期メモリイメージａを推測できないため、テストプログラム１８００の実行を中止する。
【０１８２】
同様に、すべての小区間３、４、・・・、ｎについて上記（６）〜（１０）の処理を繰り返し実行する。
図２２は、テストプログラム１８００をスタンドアロンで実行する場合の概要を示すフローチャートである。
【０１８３】
なお、以下の処理は、ＣＰＵエミュレータ２１１０がテストプログラム１８００を実行することによって行われる処理であるが、テストプログラム１８００の動作を明確にするために実行されるプログラムを主体として記載する。同様に、図２３、図２５および図２６についても実行されるプログラムを主体として記載する。
【０１８４】
テストプログラム１８００をメモリ上に展開し、モニタプログラム初期化部１８０５からの実行を指定した後、ＣＰＵエミュレータ２１１０を起動すると、モニタプログラム初期化部１８０５が実行される（ステップＳ２２００）。すると、モニタプログラム初期化部１８０５は、モニタプログラム１８０４を特権モードで実行可能な状態に初期化する（テップＳ２２０１）。
【０１８５】
ステップＳ２２０２において、テストプログラム制御部１８０３は、変数ｉに１をセットする。そして、ステップＳ２２０３において、テストプログラム制御部１８０３は、小区間ｉにおける原プログラムを実行する。
【０１８６】
ステップＳ２２０４において、テストプログラム制御部１８０３は、ステップＳ２２０３における原プログラムの実行が正常終了したか否かを判別する。ステップＳ２２０３における原プログラムの実行が異常終了した場合（ステップＳ２２０４  ＮＯ）、プログラム制御部１８０３は、ステップＳ２２０８に移行して異常終了する。
【０１８７】
ステップＳ２２０３における原プログラムの実行が正常終了した場合（ステップＳ２２０４  ＹＥＳ）、プログラム制御部１８０３は、処理をステップＳ２２０５に移行する。この場合、テストプログラム制御部１８０３は、変数ｉを１だけ増加させる（ステップＳ２２０５）。そして、プログラム制御部１８０３は、処理をステップＳ２２０６に移行する。
【０１８８】
ステップＳ２２０６において、変数ｉが小区間付随情報１８０２に記憶されている付随情報数の数ｎ以下の場合（ステップＳ２２０６  ＮＯ）、テストプログラム制御部１８０３は、処理をステップＳ２２０３に移行する。また、変数ｉが小区間付随情報１８０２に記憶されている付随情報数の数ｎより大きい場合（ステップＳ２２０６  ＹＥＳ）、テストプログラム制御部１８０３は、ステップＳ２２０７に移行してテストプログラム１８００の実行処理を終了する。
【０１８９】
図２３は、テストプログラム１８００をスタンドアロンで実行する場合の具体的な実行処理を示すフローチャートである。
ステップＳ２３０１において、テストプログラム制御部１８０３は、変数ｉが１より大きいか否かを判別する。変数ｉが１の場合（ステップＳ２３０１  ＮＯ）、テストプログラム制御部１８０３は、処理をステップＳ２３０２に移行する。この場合、プログラム制御部１８０３は、初期化メモリイメージ１８０１を原プログラム再現空間に展開する（ステップＳ２３０２）。
【０１９０】
変数ｉが１より大きい場合（ステップＳ２３０１  ＹＥＳ）、テストプログラム制御部１８０３は、処理をステップＳ２３０３に移行する。この場合、プログラム制御部１８０３は、小区間ｉ付随情報からメモリ初期イメージ推測情報を取得する。そして、プログラム制御部１８０３は、取得したメモリ初期イメージ推測情報から小区間ｉ開始位置の初期メモリイメージａを生成し、生成した初期メモリイメージａを原プログラム再現空間に展開する（ステップＳ２３０３）。
【０１９１】
ステップＳ２３０４において、テストプログラム制御部１８０３は、小区間ｉ付随情報の実行命令数情報から第１の終了位置命令数を取得する。そして、テストプログラム制御部１８０３は、小区間ｉ開始位置から第１の終了位置命令数だけ原プログラムの命令を実行すると割り込みが発生して原プログラムからテストプログラム制御部１８０３に制御が移行するように設定する。
【０１９２】
ステップＳ２３０５において、テストプログラム制御部１８０３は、小区間ｉ付随情報の初期値情報からＴＬＢ情報およびキャッシュ情報を取得する。そして、テストプログラム制御部１８０３は、取得したＴＬＢ情報およびキャッシュ情報にしたがって、ＣＰＵエミュレータ２１１０内のＴＬＢやキャッシュの内容を変更することにより、ＣＰＵエミュレータ２１１０を小区間ｉ開始位置の状態に初期化する。
【０１９３】
ステップＳ２３０６において、テストプログラム制御部１８０３は、小区間ｉ付随情報の初期値情報から命令実行開始アドレスおよびレジスタ値を取得する。そして、テストプログラム制御部１８０３は、取得したレジスタ値を、ＣＰＵエミュレータ２１１０内のレジスタにセットする。また、テストプログラム制御部１８０３は、取得した命令実行開始アドレスをＣＰＵエミュレータ２１１０内のＰＣにセットする。
【０１９４】
ステップＳ２３０７において、テストプログラム制御部１８０３がＣＰＵエミュレータ２１１０の実行を指示すると、ＣＰＵエミュレータ２１１０は、原プログラム再現空間に展開された原プログラムの実行を開始する。
【０１９５】
ここで、原プログラムがシステムコールを発行すると（ステップＳ２４００）、モニタプログラム１８０４が読み出されて実行される（ステップＳ２４０１）。モニタプログラム１８０４は、要求されたサービスを原プログラムに提供する。要求されたサービスを提供するとモニタプログラム１８０４は実行を終了する（ステップＳ２４０２）。すると、処理がステップＳ２３０７に移行され、原プログラムの実行が再開される。
【０１９６】
ステップＳ２３０８において、ステップＳ２３０４で指定した命令数だけ原プログラムの命令を実行すると割り込みが発生し、原プログラムからテストプログラム制御部１８０３に制御が移行する。
【０１９７】
ステップＳ２３０９において、ステップＳ２３０７における実行命令数が、第１の終了位置命令数から第２の終了位置命令数の範囲である場合（ステップＳ２３０９  ＹＥＳ）、テストプログラム制御部１８０３は、処理をステップＳ２３１０に移行する。そして、テストプログラム制御部１８０３は、テストプログラム１８００の実行処理を終了する。また、ステップＳ２３０７における実行命令数が、第１の終了位置命令数から第２の終了位置命令数の範囲にない場合（ステップＳ２３０９  ＮＯ）、テストプログラム制御部１８０３は、処理をステップＳ２３１１に移行し、テストプログラム１８００の実行処理を異常終了する。
【０１９８】
図２４は、テストプログラム１８００をＯＳ上で実行する場合の実行処理の概要を説明する図である。
テストプログラム１８００をＯＳ上で動作する場合、ＯＳが動作する一般的な情報処理装置を使用することができる。図２４に示すＣＰＵ２４００は、一般的な情報処理装置に備わるＣＰＵを示している。
【０１９９】
なお、テストプログラム１８００をＯＳ上で実行する場合、テストプログラム１８００に含まれるモニタプログラム１８０４およびモニタプログラム初期化部１８０５は、使用しない。必要なサービスはＯＳから提供されるからである。
【０２００】
テストプログラム１８００は、以下のように実行される。
（１）ＯＳにテストプログラム１８００の実行を指示すると、ＯＳは、テストプログラム１８００をメモリ上に展開し、テストプログラム１８００の実行を開始する。このとき、テストプログラム１８００に含まれるテストプログラム制御部１８０３が実行される。
（２）テストプログラム制御部１８０３は、初期メモリイメージ１８０１を原プログラム再現空間に展開する。また、テストプログラム制御部１８０３は、小区間１付随情報の初期値情報からレジスタ値、ＴＬＢ情報およびキャッシュ情報などを読み出す。そして、テストプログラム制御部１８０３は、読み出したレジスタ値、ＴＬＢ情報およびキャッシュ情報にしたがって、ＣＰＵ２４００を小区間１開始位置の状態に初期化する。
（３）小区間１付随情報の初期値情報が示す命令実行開始アドレスからの命令実行を指示すると、ＣＰＵ２４００は指示された命令実行開始アドレスから、原プログラム再現空間に展開された原プログラムの実行を開始する。
【０２０１】
原プログラムの実行中、ＴＬＢミスやシステムコールなどのサービスはＯＳから提供を受ける。
（４）小区間１の命令の実行を終了すると、割り込み処理などにより、原プログラム再現空間内の原プログラムからテストプログラム制御部１８０３が移行する。
【０２０２】
この処理は、一定命令数を実行後に割り込みを発生させるＣＰＵ２４００の機能を使用することで実現できる。例えば、小区間１付随情報の実行命令数情報に指定された第１の終了位置命令数だけ命令を実行すると、割り込み処理により原プログラムからテストプログラム制御部１８０３に制御を移行させるようにすればよい。
（５）プログラム制御部１８０３は、原プログラムの実行命令数が、小区間１付随情報の実行命令数情報に設定された命令数の範囲内、すなわち第１の終了位置命令数と第２の終了位置命令数の間であるかを確認する。実行命令数が、小区間１付随情報の実行命令数情報に設定された命令数の範囲内にない場合、プログラム制御部１８０３は、次の小区間開始位置の初期メモリイメージａを推測できないため、テストプログラム１８００の実行を中止する。
（６）プログラム制御部１８０３は、次の小区間の付随情報である小区間２付随情報からメモリ初期イメージ推測情報を読み出し、メモリ初期イメージ推測情報から小区間２開始位置の初期メモリイメージａを推測する。そして、プログラム制御部１８０３は、推測した小区間２開始位置の初期メモリイメージａを原プログラム再現空間に展開する。
（７）テストプログラム制御部１８０３は、小区間２付随情報の初期値情報からレジスタ値、ＴＬＢ情報およびキャッシュ情報などを読み出す。そして、テストプログラム制御部１８０３は、読み出したレジスタ値、ＴＬＢ情報およびキャッシュ情報にしたがって、ＣＰＵ２４００を小区間２開始位置の状態に初期化する。
（８）テストプログラム制御部１８０３が小区間２付随情報の初期値情報が示す命令実行開始アドレスからの命令実行を指示すると、ＣＰＵ２４００は指示された命令実行開始アドレスから、原プログラム再現空間に展開された原プログラムの実行を開始する。
（９）小区間２の命令の実行を終了すると、割り込み処理などにより、原プログラム再現空間内の原プログラムからテストプログラム制御部１８０３に制御が移行する。
（１０）プログラム制御部１８０３は、原プログラムの実行命令数が、小区間２付随情報の実行命令数情報に設定された命令数の範囲内、すなわち第１の終了位置命令数と第２の終了位置命令数の間であるかを確認する。実行命令数が、小区間２付随情報の実行命令数情報に設定された命令数の範囲内にない場合、プログラム制御部１８０３は、次の小区間開始位置の初期メモリイメージａを推測できないため、テストプログラム１８００の実行を中止する。
【０２０３】
同様に、すべての小区間３、４、・・・、ｎについて上記（６）〜（１０）の処理を繰り返し実行する。
図２５は、テストプログラム１８００をＯＳ上で実行する場合の概要を示すフローチャートである。
【０２０４】
ＯＳにテストプログラム１８００の実行を指示すると、ＯＳは、テストプログラム１８００をメモリ上に展開し、テストプログラム１８００の実行を開始する（ステップＳ２５００）。このとき、テストプログラム１８００に含まれるテストプログラム制御部１８０３が実行される。
【０２０５】
ステップＳ２５０１において、テストプログラム制御部１８０３は、変数ｉに１をセットする。また、ステップＳ２５０２において、テストプログラム制御部１８０３は、小区間ｉにおける原プログラムを実行する。
【０２０６】
ステップＳ２５０３において、テストプログラム制御部１８０３は、ステップＳ２５０２における原プログラムの実行が正常終了したか否かを判別する。ステップＳ２５０２における原プログラムの実行が異常終了した場合（ステップＳ２５０３  ＮＯ）、プログラム制御部１８０３は、ステップＳ２５０７に移行して異常終了する。
【０２０７】
ステップＳ２５０２における原プログラムの実行が正常終了した場合（ステップＳ２５０３  ＹＥＳ）、プログラム制御部１８０３は、処理をステップＳ２５０４に移行する。この場合、テストプログラム制御部１８０３は、変数ｉを１だけ増加させる（ステップＳ２５０４）。そして、プログラム制御部１８０３は、処理をステップＳ２５０５に移行する。
【０２０８】
ステップＳ２５０５において、変数ｉが小区間付随情報１８０２に記憶されている付随情報数の数ｎ以下の場合（ステップＳ２５０５  ＮＯ）、テストプログラム制御部１８０３は、処理をステップＳ２５０２に移行する。また、変数ｉが小区間付随情報１８０２に記憶されている付随情報数の数ｎより大きい場合（ステップＳ２５０５  ＹＥＳ）、テストプログラム制御部１８０３は、ステップＳ２５０６に移行してテストプログラム１８００の実行処理を終了する。
【０２０９】
図２６は、テストプログラム１８００をＯＳ上で実行する場合の具体的な実行処理を示すフローチャートである。
ステップＳ２６０１において、テストプログラム制御部１８０３は、変数ｉが１より大きいか否かを判別する。変数ｉが１の場合（ステップＳ２６０１  ＮＯ）、テストプログラム制御部１８０３は、処理をステップＳ２６０２に移行する。この場合、プログラム制御部１８０３は、初期化メモリイメージ１８０１を原プログラム再現空間に展開する（ステップＳ２６０２）。
【０２１０】
変数ｉが１より大きい場合（ステップＳ２６０１  ＹＥＳ）、テストプログラム制御部１８０３は、処理をステップＳ２６０３に移行する。この場合、プログラム制御部１８０３は、小区間ｉ付随情報からメモリ初期イメージ推測情報を取得する。そして、プログラム制御部１８０３は、取得したメモリ初期イメージ推測情報から小区間ｉ開始位置の初期メモリイメージａを生成し、生成した初期メモリイメージａを原プログラム再現空間に展開する（ステップＳ２６０３）。
【０２１１】
ステップＳ２６０４において、テストプログラム制御部１８０３は、小区間ｉ付随情報の実行命令数情報から第１の終了位置命令数を取得する。そして、テストプログラム制御部１８０３は、小区間ｉ開始位置から第１の終了位置命令数だけ原プログラムの命令を実行すると割り込みが発生して原プログラムからテストプログラム制御部１８０３に制御が移行するように設定する。
【０２１２】
ステップＳ２６０５において、テストプログラム制御部１８０３は、小区間ｉ付随情報の初期値情報からＴＬＢ情報およびキャッシュ情報を取得する。そして、テストプログラム制御部１８０３は、取得したＴＬＢ情報およびキャッシュ情報にしたがって、ＣＰＵ２４００に備わるＴＬＢやキャッシュの内容を変更することにより、ＣＰＵ２４００を小区間ｉ開始位置の状態に初期化する。
【０２１３】
ステップＳ２６０６において、テストプログラム制御部１８０３は、小区間ｉ付随情報の初期値情報から命令実行開始アドレスおよびレジスタ値を取得する。そして、テストプログラム制御部１８０３は、取得したレジスタ値を、ＣＰＵ２４００に備わるレジスタにセットする。また、テストプログラム制御部１８０３は、取得した命令実行開始アドレスをＰＣにセットする。
【０２１４】
ステップＳ２６０７において、テストプログラム制御部１８０３がＣＰＵ２４００の実行を指示すると、ＣＰＵ２４００は、原プログラム再現空間に展開された原プログラムの実行を開始する。
【０２１５】
ここで、原プログラムがシステムコールを発行すると（ステップＳ２７００）、ＯＳは、原プログラムから要求されたサービスを原プログラムに提供する（ステップＳ２７０１）。要求されたサービスの提供が終了すると（ステップＳ２７０２）、処理がステップＳ２６０７に移行され、原プログラムの実行が再開される。
【０２１６】
ステップＳ２６０８において、ステップＳ２６０４で指定した命令数だけ原プログラムの命令を実行すると割り込みが発生し、原プログラムからテストプログラム制御部１８０３に制御が移行する。
【０２１７】
ステップＳ２６０９において、ステップＳ２６０７における実行命令数が、第１の終了位置命令数から第２の終了位置命令数の範囲である場合（ステップＳ２６０９  ＹＥＳ）、テストプログラム制御部１８０３は、処理をステップＳ２６１０に移行する。そして、テストプログラム制御部１８０３は、テストプログラム１８００の実行処理を終了する。また、ステップＳ２６０７における実行命令数が、第１の終了位置命令数から第２の終了位置命令数の範囲にない場合（ステップＳ２６０９  ＮＯ）、テストプログラム制御部１８０３は、処理をステップＳ２６１１に移行し、テストプログラム１８００の実行処理を異常終了する。
【０２１８】
図２７は、テストプログラム作成装置１１００の構成例を示す図である。
テストプログラム作成装置１１００は、メモリ１１０１と、ＣＰＵ１１０２と、入力装置１１０３と、出力装置１１０４と、記憶装置１１０５と、媒体駆動装置１１０６と、必要に応じてネットワーク接続装置１１０８と、備える情報処理装置である。
【０２１９】
メモリ１１０１は、プログラムを実行するために使用する揮発性のメモリ、例えば、ＲＡＭなどである。
ＣＰＵ１１０２は、周辺機器や各種ソフトウェアを実行する他に本実施例に係るテストプログラム作成処理を実現するプログラムを実行する手段である。ＣＰＵ１１０２は、必要に応じて命令を１命令ずつ実行する機構を備えることができる。
【０２２０】
入力装置１１０３は、外部からのデータ入力手段、例えば、キーボードやマウスなどである。出力装置１１０４は、データ等を表示装置などに出力する装置である。
記憶装置１１０５は、テストプログラム作成装置１１００が動作するために必要なプログラムやデータの他に本実施例に係るテストプログラム作成処理を実現するテストプログラム作成用プログラムを記憶する手段である。
【０２２１】
媒体駆動装置１１０６は、メモリ１１０１や記憶装置１１０５のデータを可搬記憶媒体１１０７、例えば、フロッピイディスクやＭＯディスク、ＣＤ−ＲやＤＶＤ−Ｒなどに出力し、または、可搬記憶媒体１１０７からプログラムやデータ等を読み出す手段である。テストプログラム１８００は可搬記憶媒体１１０７に記憶することもできる。
【０２２２】
ネットワーク接続装置１１０８は、ネットワーク１１０９に接続する手段である。
以上に説明したテストプログラム１８００の作成、実行に使用する装置に関し、メモリ１１０１などは、「第１の記憶手段」や「第２の記憶手段」の一例として挙げられる。そして、原プログラムなどは、「第１のプログラム」の一例として挙げられる。
【０２２３】
また、ＣＰＵ１１０２やＣＰＵエミュレータ１３０１などは、「第１の演算手段」の一例として挙げられる。そして、ＣＰＵエミュレータ２１１０やＣＰＵ２４００などは、「第２の演算手段」の一例として挙げられる。
【０２２４】
図２８は、テストプログラム作成装置１１００が作成したテストプログラム１８００を使用した性能評価の概要を示す図である。なお、下記（１）〜（３）は図２８に記載の（１）〜（３）に対応する。
【０２２５】
上述のように、テストプログラム作成装置１１００は、原プログラムをＣＰＵ１１０２やＣＰＵエミュレータ１３０１に実行させて実行履歴を採取し、実行履歴から、初期メモリイメージ１８０１と小区間付随情報１８０２を生成する。そして、テストプログラム作成装置１１００は、初期メモリイメージ１８０１、小区間付随情報１８０２、テストプログラム制御部１８０３、モニタプログラム１８０４およびモニタプログラム初期化部１８０５を含むテストプログラム１８００を作成する。
（１）このテストプログラム１８００は、図２１〜図２３に示したように、モニタプログラム初期化部１８０５がモニタプログラム１８０４を特権モードで実行可能な状態に初期化するので、ＯＳのない環境でも実行することが可能となる。例えば、テストプログラム１８００は、開発中のＣＰＵの設計にしたがってＣＰＵをエミュレートするＣＰＵエミュレータ２１１０などでも実行することができる。
【０２２６】
また、テストプログラム１８００は、図２４〜図２６に示したように、モニタプログラム１８０４およびモニタプログラム初期化部１８０５を使用しなくても、ＯＳ上で実行することができる。例えば、既存のＣＰＵ２８０１を備える情報処理装置に、ＯＳをインストールした状態でテストプログラム１８００を実行することができる。
【０２２７】
したがって、テストプログラム１８００は、開発中のＣＰＵの設計にしたがってＣＰＵをエミュレートするＣＰＵエミュレータ２１１０と、既存のＣＰＵ２８０１と、に同一の処理、すなわち、原プログラムから抜き出した小区間を実行させることができる。
【０２２８】
その結果、開発中のＣＰＵによるテストプログラム１８００の実行結果（性能指標１）と、既存のＣＰＵ２８０１によるテストプログラム１８００の実行結果（性能指標２）と、を比較してより正確な性能評価を行うことが可能となる。そして、その性能評価の結果を、開発中のＣＰＵの設計データにフィードバックすることで、試作品等を作成する前に障害等を改善することができ、開発効率を向上することができる。
【０２２９】
また、開発中のＣＰＵによるテストプログラム１８００の実行結果（性能指標１）と、既存のＣＰＵ２８０１によるテストプログラム１８００の実行結果（性能指標２）と、を比較・分析することで開発中のＣＰＵの性能予測をより正確に行うことができる。
（２）また、既存のＣＰＵ２８０１を備える情報処理装置にＯＳをインストールした状態で、テストプログラム１８００を実行した実行結果（性能指標２）と、原プログラムを実行した実行結果（性能指標３）と、を比較検証することができる。その結果、原プログラムにおける小区間と、テストプログラム１８００と、が同一の処理を行うプログラムであることを検証することができる。
（３）また、既存のＣＰＵ２８０１を備える情報処理装置にＯＳをインストールした状態でテストプログラム１８００を実行した実行結果（性能指標２）と、ＣＰＵエミュレータ１３０１でテストプログラム１８００を実行した実行結果（性能指標４）と、を比較検証することができる。なお、ＣＰＵエミュレータ１３０１は、既存のＣＰＵ２８０１の設計にしたがってＣＰＵ２８０１をエミュレートするエミュレータである。
【０２３０】
その結果、テストプログラム１８００が、ＯＳのサポートがないＣＰＵ上で実行された場合と、ＯＳ上で実行された場合と、で同一の処理が行われることを検証することができる。
【０２３１】
テストプログラム１８００を使用すると、上記（２）および（３）の検証を行うことができるので、ＯＳの有無に左右されず原プログラムと同一の処理を開発中のＣＰＵに実行させることを保証できる。その結果、上記（１）の性能評価をより厳密に行うことが可能となる。
【０２３２】
テストプログラム作成装置１１００は、原プログラムから複数の小区間の処理を抜き出してテストプログラム１８００を作成するので、原プログラムのうち、性能評価等に使用したい処理が行われる区間だけを小区間として抜き出してテストプログラム１８００を作成することができる。
【０２３３】
これにより、性能評価に必要な処理を一度に実行することができるので、性能評価の効率を向上することが可能となる。また、性能評価等に必要な処理だけを抜き出してテストプログラム１８００を作成するので、テストプログラム１８００の実行に必要なハードウェア資源、例えば、メモリ容量などを低く抑えることが可能となる。同様の理由から、一般にＣＰＵエミュレータを用いたプログラムの実行に必要とされる膨大な時間を短縮することが可能となる。
【０２３４】
テストプログラム制御部１８０３は、図２６のステップＳ２６０３などに示したように、小区間ｉ−１終了位置のメモリ空間と、小区間ｉ付随情報のメモリ初期イメージ推測情報と、から小区間ｎ開始位置の初期メモリ空間を再現する。したがって、小区間毎に小区間開始位置の初期メモリ空間の再現に用いるメモリイメージをテストプログラム１８００に備える必要がなくなる。その結果、テストプログラム１８００実行時に使用するメモリ容量を抑えることが可能となる。
【図１】
2011018828.tif 000003
【図２】
2011018828.tif 000004
【図３】
2011018828.tif 000005
【図４】
2011018828.tif 000006
【図５】
2011018828.tif 000007
【図６】
2011018828.tif 000008
【図７】
2011018828.tif 000009
【図８】
2011018828.tif 000010
【図９】
2011018828.tif 000011
【図１０】
2011018828.tif 000012
【図１１】
2011018828.tif 000013
【図１２】
2011018828.tif 000014
【図１３】
2011018828.tif 000015
【図１４】
2011018828.tif 000016
【図１５】
2011018828.tif 000017
【図１６】
2011018828.tif 000018
【図１７】
2011018828.tif 000019
【図１８】
2011018828.tif 000020
【図１９】
2011018828.tif 000021
【図２０】
2011018828.tif 000022
【図２１】
2011018828.tif 000023
【図２２】
2011018828.tif 000024
【図２３】
2011018828.tif 000025
【図２４】
2011018828.tif 000026
【図２５】
2011018828.tif 000027
【図２６】
2011018828.tif 000028
【図２７】
2011018828.tif 000029
【図２８】
2011018828.tif 000030
【手続補正書】
【提出日】平成24年2月16日(2012.2.16)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
データを記憶する第１の記憶手段と、
前記第１の記憶手段に展開された第１のプログラムを実行する第１の演算手段と、
前記第１の演算手段が前記第１のプログラムを実行する場合、前記第１の演算手段によって実行される前記第１のプログラムの一部の区間である小区間の開始位置における前記第１の演算手段の状態に関する初期値情報と、前記小区間に前記第１の演算手段が実行する命令と該命令を実行したことにより参照されるデータとに関する情報と、を前記小区間の実行履歴として記憶する実行履歴採取手段と、
前記実行履歴から、前記第１の記憶手段に展開された前記第１のプログラムのうち、前記第１の演算手段による前記小区間の実行に用いられるデータを再現するメモリイメージを生成するメモリイメージ作成手段と、
前記小区間の開始位置における前記初期値情報を含む小区間情報を生成する小区間情報生成手段と、
前記メモリイメージと、前記小区間情報と、任意のプログラムを実行する第２の演算手段が使用する第２の記憶手段に前記メモリイメージを展開し、前記小区間情報にしたがって前記小区間の開始位置における前記第１の演算手段と同じ状態に前記第２の演算手段を設定し、前記第２の演算手段に前記小区間だけ前記第１のプログラムを実行させるプログラム制御部と、オペレーティング・システムの機能のうち前記小区間における前記第１のプログラムの実行に必要な機能を含むモニタプログラムと、該モニタプログラムを前記第２の記憶手段に展開して前記第２の演算手段による前記第１のプログラム実行時に要求なサービスが前記モニタプログラムから提供されるように設定するモニタプログラム初期化部と、を含む第２のプログラムを生成する第２のプログラム生成手段と、
を備えるプログラム作成装置。
【請求項２】
前記小区間情報生成手段は、前記小区間が複数与えられると、第１の小区間の終了位置における前記第１の記憶手段の内容から、前記第１の小区間の次の第２の小区間の開始位置における前記第１の記憶手段の内容を再現する推測情報を生成し、第２の小区間情報に含める、
ことを特徴とする請求項１に記載のプログラム作成装置。
【請求項３】
前記プログラム制御部は、前記第１の小区間の終了位置における前記第２の記憶手段の内容と、前記第２の小区間情報に含まれる前記推測情報と、から前記第２の小区間の開始位置における前記第１の記憶手段が保持する内容と同じ内容を前記第２の記憶手段に再現し、前記第２の小区間情報に含まれる前記初期値情報にしたがって前記第２の小区間の開始位置における前記第１の演算手段と同じ状態に前記第２の演算手段を設定し、前記第２の演算手段に前記第２の小区間だけ前記第１のプログラムを実行させる
ことを特徴とする請求項２に記載のプログラム作成装置。
【請求項４】
前記第１の演算手段は、命令を１命令ずつ実行する機能を有する演算装置であって、命令を１命令実行する毎に、前記実行履歴採取手段を実行する、
ことを特徴とする請求項１に記載のプログラム作成装置。
【請求項５】
前記実行履歴採取手段は、ユーザモードで実行された命令と、該命令を実行したことにより参照されるデータと、に関する情報を実行履歴に記憶する、
ことを特徴とする請求項４に記載のプログラム作成装置。
【請求項６】
前記プログラム制御部は、前記第１の演算手段に対して、前記小区間に相当する命令数を実行すると割り込みを発生させて前記第１のプログラムの実行を終了させる、
ことを特徴とする請求項１に記載のプログラム作成装置。
【請求項７】
データを記憶する第１の記憶手段に展開された第１のプログラムを実行する第１の演算手段が前記第１のプログラムを実行する場合、前記第１の演算手段によって実行される前記第１のプログラムの一部の区間である小区間の開始位置における前記第１の演算手段の状態に関する初期値情報と、前記小区間に前記第１の演算手段が実行する命令と該命令を実行したことにより参照されるデータとに関する情報と、を前記小区間の実行履歴として記憶し、
前記実行履歴から、前記第１の記憶手段に展開された前記第１のプログラムのうち、前記第１の演算手段による前記小区間の実行に用いられるデータを再現するメモリイメージを生成し、
前記小区間の開始位置における前記初期値情報を含む小区間情報を生成し、
前記メモリイメージと、前記小区間情報と、任意のプログラムを実行する第２の演算手段が使用する第２の記憶手段に前記メモリイメージを展開し、前記小区間情報にしたがって前記小区間の開始位置における前記第１の演算手段と同じ状態に前記第２の演算手段を設定し、前記第２の演算手段に前記小区間だけ前記第１のプログラムを実行させるプログラム制御部と、オペレーティング・システムの機能のうち前記小区間における前記第１のプログラムの実行に必要な機能を含むモニタプログラムと、該モニタプログラムを前記第２の記憶手段に展開して前記第２の演算手段による前記第１のプログラム実行時に要求なサービスが前記モニタプログラムから提供されるように設定するモニタプログラム初期化部と、を含む第２のプログラムを生成する、プログラム作成方法。
【請求項８】
データを記憶する第１の記憶手段に展開された第１のプログラムを実行する第１の演算手段が前記第１のプログラムを実行する場合、前記第１の演算手段によって実行される前記第１のプログラムの一部の区間である小区間の開始位置における前記第１の演算手段の状態に関する初期値情報と、前記小区間に前記第１の演算手段が実行する命令と該命令を実行したことにより参照されるデータとに関する情報と、を前記小区間の実行履歴として記憶するステップと、
前記実行履歴から、前記第１の記憶手段に展開された前記第１のプログラムのうち、前記第１の演算手段による前記小区間の実行に用いられるデータを再現するメモリイメージを生成するステップと、
前記小区間の開始位置における前記初期値情報を含む小区間情報を生成するステップと、
前記メモリイメージと、前記小区間情報と、任意のプログラムを実行する第２の演算手段が使用する第２の記憶手段に前記メモリイメージを展開し、前記小区間情報にしたがって前記小区間の開始位置における前記第１の演算手段と同じ状態に前記第２の演算手段を設定し、前記第２の演算手段に前記小区間だけ前記第１のプログラムを実行させるプログラム制御部と、オペレーティング・システムの機能のうち前記小区間における前記第１のプログラムの実行に必要な機能を含むモニタプログラムと、該モニタプログラムを前記第２の記憶手段に展開して前記第２の演算手段による前記第１のプログラム実行時に要求なサービスが前記モニタプログラムから提供されるように設定するモニタプログラム初期化部と、を含む第２のプログラムを生成するステップと、
を情報処理装置に実行させるプログラム。
【国際調査報告】
2011018828.tif 000031
2011018828.tif 000032