(57)【要約】【課題】エラーの発生状況を再現する精度を向上させる。【解決手段】情報処理装置１０は、プロセッサ１１，１２と制御部１３とを有する。プロセッサ１１は、クロック数または命令数を計数するカウンタ１１ａを含む。プロセッサ１２は、クロック数または命令数を計数するカウンタ１２ａを含む。制御部１３は、プロセッサ１１にコードを実行させ、カウンタ１１ａ，１２ａの値に基づいて、プロセッサ１１から所定のクロック数または命令数だけ遅れてプロセッサ１２にコードを実行させる。【選択図】図１
2015146116.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
クロック数または命令数を計数する第１のカウンタを含む第１のプロセッサと、クロック数または命令数を計数する第２のカウンタを含む第２のプロセッサのうち、前記第１のプロセッサにコードを実行させ、
前記第１および第２のカウンタの値に基づいて、前記第１のプロセッサから所定のクロック数または命令数だけ遅れて前記第２のプロセッサに前記コードを実行させる、
処理を実行させる制御プログラム。
【請求項２】
前記第２のプロセッサを前記第１のプロセッサより前記所定のクロック数または命令数だけ遅れて起動することで、前記第１のカウンタの値と前記第２のカウンタの値とを前記所定のクロック数または命令数だけずらす、請求項１記載の制御プログラム。
【請求項３】
前記第１のカウンタの値と前記第２のカウンタの値の差が所定の条件を満たさないときは、前記第１のプロセッサの状態を前記第２のプロセッサにコピーし、前記第１のカウンタが前記所定のクロック数または命令数だけ進むのを待って前記第２のプロセッサを再開する、請求項１または２記載の制御プログラム。
【請求項４】
前記コードに従って前記第１のプロセッサにデータを処理させるとき、前記第１のカウンタの値を前記データに付加してバッファに格納し、
前記第２のプロセッサに前記データを処理させる前に前記第１のプロセッサでエラーが発生した場合、前記バッファに格納された前記データを含むエラー情報を出力する、
請求項１乃至３の何れか一項に記載の制御プログラム。
【請求項５】
コンピュータが実行する制御方法であって、
クロック数または命令数を計数する第１のカウンタを含む第１のプロセッサと、クロック数または命令数を計数する第２のカウンタを含む第２のプロセッサのうち、前記第１のプロセッサにコードを実行させ、
前記第１および第２のカウンタの値に基づいて、前記第１のプロセッサから所定のクロック数または命令数だけ遅れて前記第２のプロセッサに前記コードを実行させる、
制御方法。
【請求項６】
クロック数または命令数を計数する第１のカウンタを含む第１のプロセッサと、
クロック数または命令数を計数する第２のカウンタを含む第２のプロセッサと、
前記第１のプロセッサにコードを実行させ、前記第１および第２のカウンタの値に基づいて、前記第１のプロセッサから所定のクロック数または命令数だけ遅れて前記第２のプロセッサに前記コードを実行させる制御部と、
を有する情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は制御プログラム、制御方法および情報処理装置に関する。
【背景技術】
【０００２】
情報処理システムにおいては、ソフトウェアの不具合によって、メモリアクセス違反などの予期しないエラーが発生することがある。その場合、情報処理システムの開発者または管理者は、ソフトウェアの中からエラーの原因となった命令を探し、再びエラーが発生しないようにソフトウェアを修正するデバッグ作業を行うことになる。業務の運用中にエラーが発生した場合、迅速にデバッグ作業が行われることが好ましい。
【０００３】
エラー原因を分析する１つの方法としては、エラーが検出された時点におけるレジスタやメモリのデータを抽出し、抽出したデータを解析する方法が考えられる。しかし、エラーが検出された時点におけるデータは、不適切な演算や不適切なメモリアクセスによって既に破壊されている可能性がある。また、情報処理システムにおいては、不適切な命令が実行されてから時間が経過した後に、エラーが検出されることも多い。そのため、エラーが検出された時点のデータからエラー原因を探すことは、容易とは言えない。
【０００４】
これに対し、エラー原因を分析する他の方法として、エラーが検出される少し前の時点のデータを、情報処理システムが取得できるようにする方法が考えられる。このデータを用いることで、エラーが検出される前の時点からエラーが検出された時点までの動作を再現できると期待され、その間に実行された命令を分析することが可能となる。
【０００５】
例えば、現用サーバを備える処理モジュール＃１と、現用サーバと同じプログラムを実行する冗長サーバを備える処理モジュール＃２とを有する計算機システムが提案されている。処理モジュール＃１は、クライアントから処理要求を受信し、受信した処理要求をコピーして処理モジュール＃２に送信し、また、受信した処理要求を現用サーバに投入する。処理モジュール＃２は、コピーされた処理要求を一時的にバッファに保存する。
【０００６】
（１）処理モジュール＃２は、定期的にバッファを確認し、確認した時点でバッファに存在する処理要求を冗長サーバに投入する。または、（２）処理モジュール＃２は、各処理要求について受信した時刻に１分加えた予定時刻をその処理要求に付加しておき、定期的にバッファを確認し、確認した時点で予定時刻を経過している処理要求を冗長サーバに投入する。または、（３）処理モジュール＃２は、バッファに格納されている処理要求の数が閾値を超えたとき、バッファ内にある最も古い処理要求を冗長サーバに投入する。または、（４）処理モジュール＃２は、現用サーバから番号Ｎの処理要求の実行完了が通知されたとき、バッファに格納された番号Ｎの処理要求を冗長サーバに投入する。
【０００７】
これにより、現用サーバから遅れて、現用サーバと同じ処理要求が冗長サーバに投入される。この計算機システムは、現用サーバのエラーを検知すると、エラーを検知した時点における冗長サーバの状態を示す状態データを保存する。状態データを用いることで、エラーが検知される前から現用サーバの動作を再現することができると期待される。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００５−１６５５９９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかし、上記の計算機システムでは、現用サーバに処理要求が投入されてから冗長サーバに同じ処理要求が投入されるまでの遅延時間が、一定にはならない。例えば、処理モジュール＃２が定期的にバッファを確認する方法では、バッファに到着した処理要求は次にバッファを確認するタイミングまで冗長サーバに投入されないため、遅延時間は処理要求が到着するタイミングに応じて変わることになる。また、処理モジュール＃２の負荷は、バッファ管理のために処理モジュール＃１よりも高くなる可能性があり、冗長サーバの処理が現用サーバに追従できずに遅延時間が徐々に拡大するおそれもある。
【００１０】
そのため、現用サーバおよび冗長サーバでタイミング依存の処理が実行されると、現用サーバの処理結果と冗長サーバの処理結果とが一致しなくなる可能性がある。例えば、遅延時間が変化すると、１つ前の処理要求が投入されてからある処理要求が投入されるまでの経過時間が、現用サーバと冗長サーバとで異なってしまう。現用サーバおよび冗長サーバが経過時間に応じて異なる処理を行う場合（例えば、経過時間が長いとタイムアウトが発生する場合）、現用サーバと冗長サーバの処理結果が異なるおそれがある。
【００１１】
その結果、現用サーバではエラーが発生するが冗長サーバではエラーが発生しないことがあり、また、現用サーバではエラーが発生しないが冗長サーバではエラーが発生することもある。よって、冗長サーバの状態データを用いても、エラーが検知される前の現用サーバの状態を再現することができない場合があるという問題がある。
【００１２】
１つの側面では、本発明は、エラーの発生状況を再現する精度を向上させた制御プログラム、制御方法および情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【００１３】
１つの態様では、コンピュータに以下の処理を実行させる制御プログラムが提供される。クロック数または命令数を計数する第１のカウンタを含む第１のプロセッサと、クロック数または命令数を計数する第２のカウンタを含む第２のプロセッサのうち、第１のプロセッサにコードを実行させる。第１および第２のカウンタの値に基づいて、第１のプロセッサから所定のクロック数または命令数だけ遅れて第２のプロセッサにコードを実行させる。また、１つの態様では、コンピュータが実行する制御方法が提供される。
【００１４】
また、１つの態様では、第１のプロセッサと第２のプロセッサと制御部とを有する情報処理装置が提供される。第１のプロセッサは、クロック数または命令数を計数する第１のカウンタを含む。第２のプロセッサは、クロック数または命令数を計数する第２のカウンタを含む。制御部は、第１のプロセッサにコードを実行させる。制御部は、第１および第２のカウンタの値に基づいて、第１のプロセッサから所定のクロック数または命令数だけ遅れて第２のプロセッサにコードを実行させる。
【発明の効果】
【００１５】
１つの側面では、エラーの発生状況を再現する精度を向上させることができる。
【図面の簡単な説明】
【００１６】
【図１】第１の実施の形態の情報処理装置を示す図である。
【図２】第２の実施の形態の情報処理システムを示す図である。
【図３】業務サーバのハードウェア例を示すブロック図である。
【図４】業務サーバと検証サーバの機能例を示すブロック図である。
【図５】業務サーバと検証サーバの他の機能例を示すブロック図である。
【図６】要求バッファに格納する要求データの構造例を示す図である。
【図７】システム起動の手順例を示すフローチャートである。
【図８】冗長制御の手順例を示すフローチャートである。
【図９】要求処理のタイミング例を示すシーケンス図である。
【図１０】デバッグ情報収集の手順例を示すフローチャートである。
【図１１】エラー再現の手順例を示すフローチャートである。
【図１２】エラー検出および再現のタイミング例を示す図である。
【発明を実施するための形態】
【００１７】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の情報処理装置を示す図である。
【００１８】
第１の実施の形態の情報処理装置１０は、エラーを検知したときに当該エラーが発生する前の情報処理装置１０の状態を示すエラー情報を出力する。これにより、エラーが発生するまでの動作を再現し、エラー原因を分析することが容易となる。情報処理装置１０で発生するエラーとしては、例えば、メモリアクセス違反、ゼロ除算などの実行不能演算、例外処理ルーチンへのジャンプなどが挙げられる。エラー情報を用いたエラー原因の分析は、情報処理装置１０で行ってもよいし他の情報処理装置で行ってもよい。
【００１９】
情報処理装置１０は、プロセッサ１１，１２および制御部１３を有する。プロセッサ１１，１２それぞれは、ＣＰＵ（Central Processing Unit）やＤＳＰ（Digital Signal Processor）であってもよく、ＡＳＩＣ（Application Specific Integrated Circuit）やＦＰＧＡ（Field Programmable Gate Array）などの特定用途の集積回路を含んでもよい。プロセッサ１１，１２それぞれは、ＲＡＭ（Random Access Memory）やＨＤＤ（Hard Disk Drive）などの記憶装置に記憶されたプログラムを実行することができる。制御部１３は、ＣＰＵなどのプロセッサとＲＡＭなどの記憶装置とを含んでもよい。
【００２０】
プロセッサ１１は、クロック数または命令数を計数するカウンタ１１ａを含む。カウンタ１１ａは、例えば、プロセッサ１１が起動した時点または基準となる時点から、プロセッサ１１内でクロック信号または命令が１つ進む毎にカウントアップする。カウンタ１１ａは、クロック数または命令数を記憶するレジスタを含んでもよい。カウンタ１１ａの値は、プロセッサ１１が認識するハードウェア時刻を表していると言うことができる。
【００２１】
プロセッサ１２は、クロック数または命令数を計数するカウンタ１２ａを含む。カウンタ１２ａは、例えば、プロセッサ１２が起動した時点または基準となる時点から、プロセッサ１２内でクロック信号または命令が１つ進む毎にカウントアップする。カウンタ１２ａの値は、カウンタ１１ａとは独立に進行する。カウンタ１２ａは、クロック数または命令数を記憶するレジスタを含んでもよい。カウンタ１２ａの値は、プロセッサ１２が認識するハードウェア時刻を表していると言うことができる。
【００２２】
制御部１３は、プロセッサ１１にコードを実行させ、プロセッサ１１から遅れてプロセッサ１２に同じコードを実行させる。プロセッサ１１は先行系の実行単位と言うことができ、プロセッサ１２は追随系の実行単位と言うことができる。コードとは、プロセッサに処理させる命令である。プロセッサ１１，１２により２つの仮想マシンが形成される場合、制御部１３は、仮想マシンを制御するハイパーバイザを用いて実装され得る。また、プロセッサ１１，１２により仮想マシン以外の２つのプロセスまたはスレッドが形成される場合、制御部１３は、ＢＩＯＳ（Basic Input and Output System）または他のファームウェアを用いて実装され得る。
【００２３】
ここで、制御部１３は、カウンタ１１ａ，１２ａの値に基づいて、プロセッサ１１があるコードを実行し始めてからプロセッサ１２が同じコードを実行し始めるまでの遅延時間を、所定のクロック数または命令数に維持する。例えば、制御部１３は、プロセッサ１１を起動してから所定のクロック数または命令数だけ遅れてプロセッサ１２を起動することで、カウンタ１１ａの値とカウンタ１２ａの値とを所定数だけずらす。そして、制御部１３は、プロセッサ１１がコードを実行し始めるときのカウンタ１１ａの値を確認し、カウンタ１２ａが同じ値になるときにプロセッサ１２に同じコードを実行させる。
【００２４】
上記のコードが入力データの到着に応じて実行されるものである場合、制御部１３は、入力データの投入タイミングを制御することでプロセッサ１１，１２間の遅延時間を一定に維持する。例えば、制御部１３は、入力データを受け付けると、プロセッサ１１またはプロセッサ１１上で動作する仮想マシン・プロセス・スレッドなどに対して入力データを投入する。また、制御部１３は、受け付けた入力データにカウンタ１１ａの値を付加してバッファに格納しておく。そして、制御部１３は、所定のクロック数または命令数だけ遅れて、プロセッサ１２またはプロセッサ１２上で動作する仮想マシン・プロセス・スレッドなどに対して、バッファに格納された入力データを投入する。
【００２５】
これにより、プロセッサ１１により実行された処理が、プロセッサ１１から所定時間だけ遅れてプロセッサ１２により実行される。プロセッサ１１でエラーが発生した場合、情報処理装置１０は、プロセッサ１２の状態を示す状態データを含むエラー情報を出力する。プロセッサ１１では処理されプロセッサ１２では未処理である入力データがバッファに残っている場合、情報処理装置１０は、エラー情報にバッファの内容を含めて出力する。これにより、エラー発生の少し前からプロセッサ１１の処理を再現することができる。
【００２６】
第１の実施の形態の情報処理装置１０によれば、あるコードをプロセッサ１１が実行すると、プロセッサ１１から所定のクロック数または命令数だけ遅れて、同じコードをプロセッサ１２が実行する。プロセッサ１１，１２間の遅延時間をクロック数または命令数として管理することで、遅延時間を一定に維持することが容易となる。よって、プロセッサ１１，１２それぞれでタイミング依存の処理が実行されても、プロセッサ１１の処理結果とプロセッサ１２の処理結果とを一致させることができる。例えば、１つ前の入力データが投入されてからある入力データが投入されるまでの経過時間を、プロセッサ１１，１２間で揃えることができ、経過時間に応じて処理が変わる場合でもプロセッサ１１，１２の処理結果を一致させることができる。その結果、プロセッサ１１におけるエラー発生状況を、プロセッサ１２の状態データを用いて精度よく再現することができる。
【００２７】
［第２の実施の形態］
図２は、第２の実施の形態の情報処理システムを示す図である。
第２の実施の形態の情報処理システムは、業務サーバ１００および検証サーバ２００を有する。業務サーバ１００と検証サーバ２００は、ネットワーク３０を介して接続されている。ネットワーク３０は、例えば、インターネットなどの広域ネットワークである。
【００２８】
業務サーバ１００は、企業が所有する情報処理システムに属するサーバコンピュータである。業務サーバ１００上では、複数の仮想的なコンピュータ（仮想マシン）を動作させることが可能である。検証サーバ２００は、企業の情報処理システムを開発したベンダが保守サポートに用いるサーバコンピュータである。業務サーバ１００でエラーが発生すると、ベンダは検証サーバ２００を用いてデバッグ作業を行う。デバッグ作業の中で、検証サーバ２００は、エラー発生状況を示すデバッグ情報を業務サーバ１００から取得し、デバッグ情報に基づいて業務サーバ１００の動作を再現してエラー原因を分析する。
【００２９】
図３は、業務サーバのハードウェア例を示すブロック図である。
業務サーバ１００は、ＣＰＵ１０３〜１０５、ＲＡＭ１０６〜１０８、ＲＯＭ（Read Only Memory）１１１、ＨＤＤ１１２、画像信号処理部１１３、入力信号処理部１１４、媒体リーダ１１５および通信インタフェース１１６を有する。上記のユニットは、業務サーバ１００内でバスに接続されている。ＣＰＵ１０３は、第１の実施の形態のプロセッサ１１の一例である。ＣＰＵ１０４は、第１の実施の形態のプロセッサ１２の一例である。ＣＰＵ１０５とＲＡＭ１０８の集合は、第１の実施の形態の制御部１３の一例である。
【００３０】
ＣＰＵ１０３〜１０５は、プログラムの命令を実行する演算回路を含むプロセッサである。ＣＰＵ１０３〜１０５は、ＲＯＭ１１１やＨＤＤ１１２に記憶されているプログラムやデータの少なくとも一部を何れかのＲＡＭにロードし、プログラムを実行する。プログラムやデータのロード先として、ＣＰＵ１０３はＲＡＭ１０６を利用し、ＣＰＵ１０４はＲＡＭ１０７を利用し、ＣＰＵ１０５はＲＡＭ１０８を利用する。
【００３１】
ＣＰＵ１０３は、タイムスタンプカウンタ（ＴＳＣ：Time Stamp Counter）レジスタ１０３ａを有する。ＣＰＵ１０３は、ＣＰＵ１０３が起動してから継続的にクロック信号を計数している。ＴＳＣレジスタ１０３ａには、ＣＰＵ１０３において計数されたクロック数が格納される。同様に、ＣＰＵ１０４は、ＣＰＵ１０４において計数されたクロック数を格納するＴＳＣレジスタ１０４ａを有する。ＴＳＣレジスタ１０３ａ，１０４ａに格納されるクロック数は、例えば、６４ビットの非負整数として表現される。
【００３２】
ＲＡＭ１０６〜１０８は、プログラムやデータを一時的に記憶する揮発性メモリである。ただし、業務サーバ１００は、ＲＡＭ以外の種類のメモリを備えてもよい。
ＣＰＵ１０３とＲＡＭ１０６は、実行単位１０１に属している。ＣＰＵ１０４とＲＡＭ１０７は、実行単位１０２に属している。実行単位１０１と実行単位１０２には、互いに異なる一纏まりの処理単位（仮想マシン・プロセス・スレッドなど）を配置することができる。実行単位１０１上の処理単位と実行単位１０２上の処理単位とは、並列に実行することができる。また、実行単位１０１と実行単位１０２には、同じプログラムを実行させることもできる。ＣＰＵ１０５とＲＡＭ１０８は、制御用のモジュールであり、実行単位１０１，１０２に配置された仮想マシン・プロセス・スレッドなどを制御する。
【００３３】
なお、実行単位１０１，１０２で行われる処理の制御を容易にするため、クロック周波数や各命令の消費クロック数などの仕様を実行単位１０１，１０２間で同じにしておく。実行単位１０１，１０２は、同じプログラムを同じ時間で実行できると期待される。
【００３４】
ＲＯＭ１１１は、ＢＩＯＳプログラムを記憶する不揮発性の半導体メモリである。ただし、ＲＯＭ１１１に代えて、フラッシュメモリなどの書換可能な半導体メモリを用いてもよい。ＢＩＯＳには、業務サーバ１００が起動するときにオペレーティングシステム（ＯＳ：Operating System）やハイパーバイザなどの基本ソフトウェアを呼び出す機能が実装されている。業務サーバ１００が起動すると、ＣＰＵ１０５は、ＢＩＯＳプログラムをＲＯＭ１１１からＲＡＭ１０８にロードし、ＨＤＤ１１２を含むデバイスをアクセス可能にする。ＣＰＵ１０５は、ＢＩＯＳプログラムに従って、ＯＳプログラムやハイパーバイザプログラムなどをＨＤＤ１１２からＲＡＭ１０８にロードする。
【００３５】
ＨＤＤ１１２は、ＯＳ・ハイパーバイザ・ファームウェア・アプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、業務サーバ１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
【００３６】
画像信号処理部１１３は、ＣＰＵ１０５からの命令に従って、業務サーバ１００に接続されたディスプレイ１１７に画像を出力する。ディスプレイ１１７としては、ＣＲＴ（Cathode Ray Tube）ディスプレイ、液晶ディスプレイ（ＬＣＤ：Liquid Crystal Display）、プラズマディスプレイ（ＰＤＰ：Plasma Display Panel）、有機ＥＬ（ＯＥＬ：Organic Electro-Luminescence）ディスプレイなどを用いることができる。
【００３７】
入力信号処理部１１４は、業務サーバ１００に接続された入力デバイス１１８から入力信号を取得し、ＣＰＵ１０５に出力する。入力デバイス１１８としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、業務サーバ１００に、複数の種類の入力デバイスが接続されていてもよい。
【００３８】
媒体リーダ１１５は、記録媒体１１９に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体１１９として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）、半導体メモリなどを使用できる。媒体リーダ１１５は、例えば、記録媒体１１９から読み取ったプログラムやデータをＲＡＭ１０６〜１０８またはＨＤＤ１１２に格納する。
【００３９】
通信インタフェース１１６は、ネットワーク３０に接続され、ネットワーク３０を介して検証サーバ２００などの他のコンピュータと通信を行うインタフェースである。通信インタフェース１１６は、ケーブルで通信装置と接続される有線通信インタフェースでもよいし、基地局と無線リンクで接続される無線通信インタフェースでもよい。
【００４０】
なお、業務サーバ１００は、媒体リーダ１１５を備えていなくてもよく、ユーザが操作する端末装置から制御可能である場合には画像信号処理部１１３や入力信号処理部１１４を備えていなくてもよい。また、ディスプレイ１１７や入力デバイス１１８が、業務サーバ１００の筐体と一体に形成されていてもよい。検証サーバ２００も、業務サーバ１００と同様のハードウェアを用いて実現することができる。ただし、検証サーバ２００では、ＣＰＵとＲＡＭを含む実行単位の数が１つのみであってもよい。
【００４１】
図４は、業務サーバと検証サーバの機能例を示すブロック図である。
業務サーバ１００は、仮想マシン１２１，１２２とハイパーバイザ１３０を有する。
仮想マシン１２１，１２２は、それぞれＯＳやデバイスドライバなどのソフトウェアを実行する仮想的なコンピュータである。仮想マシン１２１は実行単位１０１に配置され、仮想マシン１２２は実行単位１０２に配置される。仮想マシン１２１，１２２は、同じＯＳプログラムやドライバプログラムを含む同じプログラムに基づいて起動され、並列に動作する。ただし、仮想マシン１２２は、仮想マシン１２１よりも遅れて仮想マシン１２１と同じ処理を実行する。そこで、仮想マシン１２１および実行単位１０１は先行系と言うことができ、仮想マシン１２２および実行単位１０２は追随系と言うことができる。
【００４２】
ハイパーバイザ１３０は、仮想マシン１２１，１２２を制御する。ハイパーバイザ１３０は、業務サーバ１００が備えるハードウェアリソースを管理し、仮想マシン１２１，１２２にハードウェアリソースを割り当てる。ハイパーバイザ１３０は、初期化部１３１、要求バッファ１３２、要求転送部１３３、応答転送部１３４、エラー検出部１３５およびデバッグ情報記憶部１３６を有する。要求バッファ１３２およびデバッグ情報記憶部１３６は、例えば、ＲＡＭ１０８またはＨＤＤ１１２に確保した記憶領域として実装される。他のモジュールは、例えば、ＣＰＵ１０５が実行するプログラムとして実装される。
【００４３】
初期化部１３１は、業務サーバ１００に対する起動要求（例えば、電源ボタンの押下や電源ＯＮのコマンドなど）を検出する。すると、初期化部１３１は、実行単位１０１のＣＰＵ１０３を先に起動する（例えば、ＣＰＵ１０３にクロック信号を供給し、ＣＰＵ１０３のレジスタを初期化する）。これにより、ＴＳＣレジスタ１０３ａのカウントアップが開始される。その後、初期化部１３１は、ＣＰＵ１０３から所定クロック数だけ遅れて、実行単位１０２のＣＰＵ１０４を起動する。例えば、初期化部１３１は、ＴＳＣレジスタ１０３ａが所定クロック数を示すタイミングで、ＣＰＵ１０４を起動する。これにより、ＴＳＣレジスタ１０３ａ，１０４ａの値が所定数だけずれる。
【００４４】
また、初期化部１３１は、起動後も継続的にＴＳＣレジスタ１０３ａ，１０４ａの値を確認する。ＴＳＣレジスタ１０３ａ，１０４ａの差は、ハードウェアエラーによってＣＰＵ１０３，１０４の少なくとも一方が一時的に停止した場合や、省電力制御によってＣＰＵ１０３，１０４の少なくとも一方のクロック周波数が変化した場合に変わり得る。そこで、ＴＳＣレジスタ１０３ａ，１０４ａの差が所定数から大きく離れた場合、初期化部１３１は、差が所定数になるように再調整する。例えば、初期化部１３１は、実行単位１０１，１０２を停止し、実行単位１０１の状態データを実行単位１０２にコピーする。ＣＰＵ１０３のレジスタのデータはＣＰＵ１０４のレジスタにコピーされ、ＲＡＭ１０６のデータはＲＡＭ１０７にコピーされる。そして、初期化部１３１は、実行単位１０１を再開させ、実行単位１０１から所定クロック数だけ遅れて実行単位１０２を再開させる。
【００４５】
要求バッファ１３２は、デバイスから受け付けた入力データを含む要求データを一時的に格納するキュー形式の記憶領域である。デバイスとしては、ＨＤＤ１１２・媒体リーダ１１５・通信インタフェース１１６・ディスプレイ１１７・入力デバイス１１８など、ＣＰＵとＲＡＭ以外の周辺機器が挙げられる。要求バッファ１３２には、仮想マシン１２１に投入され（実行単位１０１で処理され）、仮想マシン１２２に未投入の（実行単位１０２で未処理の）入力データを含む要求データが格納される。
【００４６】
要求転送部１３３は、デバイスから入力データを受け付ける。すると、先行系の仮想マシン１２１に入力データを投入する。これにより、実行単位１０１は、入力データに応じた処理が定義されたプログラム（例えば、ＯＳプログラムやドライバプログラムなど）を実行し始める。また、要求転送部１３３は、仮想マシン１２１に入力データを投入するときのＴＳＣレジスタ１０３ａの値や入力データなどを含む要求データを生成し、要求データを要求バッファ１３２に格納する。要求データは、キューの末尾に追加される。
【００４７】
また、要求転送部１３３は、要求バッファ１３２から要求データを読み出す。要求データは、キューの先頭から取り出される。読み出した要求データは、要求バッファ１３２から削除される。要求転送部１３３は、要求データに含まれる入力データを、仮想マシン１２１から所定クロック数だけ遅れて仮想マシン１２２に投入する。入力データを投入するタイミングは、ＴＳＣレジスタ１０４ａの値や要求データに含まれるクロック数に基づいて判断される。これにより、実行単位１０２は、入力データに応じた処理が定義されたプログラムであって、実行単位１０１と同じプログラムを実行し始める。
【００４８】
応答転送部１３４は、仮想マシン１２１から、投入された入力データに対する処理結果を示す出力データを取得する。すると、応答転送部１３４は、出力データをデバイスに転送する。転送先のデバイスは、入力データの発行元によって指定されてもよいし、入力データの種類に応じて決まってもよいし、実行単位１０１が実行するプログラムにおいて定義されてもよい。その後、応答転送部１３４は、仮想マシン１２２から、投入された入力データに対する処理結果を示す出力データを取得する。すると、応答転送部１３４は、取得した出力データをデバイスに転送せずに破棄する。出力データの破棄は、ダミーの転送先デバイスを指定することによって実現することもできる。
【００４９】
エラー検出部１３５は、先行系である仮想マシン１２１を監視し、エラーを検出する。検出されるエラーは、プログラムに従った処理を実行単位１０１が正常に継続できなくなったことや、実行単位１０１の状態が予め定義された状態になったことである。エラーの例として、メモリアクセス違反、ゼロ除算などの実行不能演算、例外処理ルーチンへのジャンプなどが挙げられる。仮想マシン１２１におけるエラーを検出すると、エラー検出部１３５は、実行単位１０１，１０２を停止し、要求バッファ１３２への要求データの追加および要求バッファ１３２からの要求データの読み出しを停止する。
【００５０】
そして、エラー検出部１３５は、エラー原因の分析に有用なデバッグ情報を生成し、デバッグ情報記憶部１３６に格納する。デバッグ情報には、実行単位１０１，１０２の状態データ（ＣＰＵ１０３，１０４のレジスタおよびＲＡＭ１０６，１０７のデータ）と、要求バッファ１３２に記憶された要求データが含まれる。また、デバッグ情報には、業務サーバ１００のハードウェア情報（例えば、チップセットの規格の情報など）が含まれる。
【００５１】
デバッグ情報記憶部１３６は、エラー検出部１３５によって生成されたデバッグ情報を記憶する。デバッグ情報は、業務サーバ１００のユーザからの要求に応じて、または、検証サーバ２００からのアクセスに応じて、ネットワーク３０を介して検証サーバ２００に送信される。デバッグ情報を用いて、検証サーバ２００でデバッグ作業が行われる。ただし、デバッグ作業を業務サーバ１００で行うことも可能である。
【００５２】
検証サーバ２００は、デバッグ情報取得部２２１、環境再現部２２２、要求バッファ２２３および要求転送部２２４を有する。要求バッファ２２３は、例えば、検証サーバ２００のＲＡＭまたはＨＤＤに確保した記憶領域として実装される。他のモジュールは、例えば、検証サーバ２００のＣＰＵが実行するプログラムとして実装される。
【００５３】
デバッグ情報取得部２２１は、業務サーバ１００でエラーが検出されると、ネットワーク３０を介して業務サーバ１００からデバッグ情報を取得する。例えば、業務サーバ１００を所有する企業と検証サーバ２００を所有するベンダとがサポート契約を締結しており、企業からベンダに保守依頼があったときに、デバッグ情報が取得される。デバッグ情報は、業務サーバ１００が能動的に検証サーバ２００に送信してもよいし、検証サーバ２００から業務サーバ１００へのアクセスに応じて送信されてもよい。
【００５４】
環境再現部２２２は、デバッグ情報取得部２２１が取得したデバッグ情報を用いて、エラーが検出された時点の仮想マシン１２２の状態、すなわち、エラーが検出される前の仮想マシン１２１の状態を検証サーバ２００上に再現する。このとき、環境再現部２２２は、デバッグ情報に含まれるＣＰＵ１０４のレジスタのデータを、検証サーバ２００が備えるＣＰＵのレジスタに書き込む。また、環境再現部２２２は、デバッグ情報に含まれるＲＡＭ１０７のデータを、検証サーバ２００が備えるＲＡＭに書き込む。また、環境再現部２２２は、デバッグ情報に含まれる要求データを要求バッファ２２３に格納する。
【００５５】
要求バッファ２２３は、要求データを格納するキュー形式の記憶領域である。要求バッファ２２３は、業務サーバ１００の要求バッファ１３２と同様のデータ構造をもつ。
上記の環境再現部２２２の処理により、検証サーバ２００上にはエラー検出時の仮想マシン１２２の状態、すなわち、理想的にはエラーが検出される所定クロック数前の時点の仮想マシン１２１の状態が再現される。検証サーバ２００は、再現された状態より後の処理を再実行することで、エラー検出までの仮想マシン１２１の動作を検証し、エラー原因を分析することができる。エラー原因の分析には、１命令ずつの逐次実行、レジスタやＲＡＭの監視、ブレークポイントの設定などの様々なデバッグ手法を用いることができる。例えば、検証サーバ２００は、デバッグ情報に含まれる実行単位１０１の状態データから、実行単位１０１においてメモリアクセス違反が発生したことを検出する。すると、検証サーバ２００は、ストア命令などのＲＡＭにアクセスする命令を監視し、その命令の前後でプログラムを一時停止させながら、再現した仮想マシンの処理を進めていく。
【００５６】
要求転送部２２４は、再現した仮想マシンの処理を進めるにあたり、要求バッファ２２３から要求データを読み出す。要求データは、キューの先頭から取り出される。読み出した要求データは、要求バッファ２２３から削除してもよい。要求転送部２２４は、要求データに含まれる入力データを、要求データに含まれるクロック数に応じたタイミングで、再現した仮想マシンに投入する。これにより、検証サーバ２００のＣＰＵは、入力データに応じた処理が定義されたプログラムを実行し始める。例えば、要求転送部２２４は、検証サーバ２００のＣＰＵに含まれるＴＳＣレジスタの値を監視し、ＴＳＣレジスタの値が要求データに含まれるクロック数と一致したタイミングで、入力データを投入する。
【００５７】
図５は、業務サーバと検証サーバの他の機能例を示すブロック図である。
上記では、仮想マシンを実行単位１０１，１０２にそれぞれ割り当て、ハイパーバイザ１３０が２つの仮想マシンの動作タイミングを制御する例を説明した。これに対し、共通のＯＳ上で実行される仮想化されていないプロセスまたはスレッドを実行単位１０１，１０２それぞれに割り当て、ＢＩＯＳまたはＢＩＯＳのようにＣＰＵの状態を監視できるファームウェアが２つのプロセスの動作タイミングを制御するようにしてもよい。
【００５８】
一例として、上記の業務サーバ１００に代えて、業務サーバ１００ａが用いられる。業務サーバ１００ａは、プロセス１４１，１４２およびＢＩＯＳ１５０を有する。
プロセス１４１，１４２は、同じプログラムに基づいて起動され、並列に動作する処理単位である。プロセス１４１は実行単位１０１に配置され、プロセス１４２は実行単位１０２に配置される。ただし、プロセス１４２では、プロセス１４１よりも遅れてプロセス１４１と同じ処理が実行される。プロセス１４１および実行単位１０１は先行系と言うことができ、プロセス１４２および実行単位１０２は追随系と言うことができる。
【００５９】
ＢＩＯＳ１５０は、プロセス１４１，１４２を制御する。ＢＩＯＳ１５０は、初期化部１５１、要求バッファ１５２、要求転送部１５３、応答転送部１５４、エラー検出部１５５およびデバッグ情報記憶部１５６を有する。これらのモジュールは、図４に示したハイパーバイザ１３０に含まれる同名のモジュール（初期化部１３１など）に対応する。
【００６０】
ただし、以下では図４の構成を前提にして業務サーバ１００について説明する。
図６は、要求バッファに格納する要求データの構造例を示す図である。
要求バッファ１３２に格納される各要求データは、次へのポインタ、前へのポインタ、受付時刻、入力デバイスＩＤ、出力デバイスＩＤ、データ長および入力データを含む。
【００６１】
次へのポインタは、１つ後の要求データ（新しい要求データ）を指し示すポインタであり、キューの先頭から末尾の方向へリンクを張る。末尾の要求データに含まれる次へのポインタは空（ｎｕｌｌ）である。前へのポインタは、１つ前の要求データ（古い要求データ）を指し示すポインタであり、キューの末尾から先頭の方向へリンクを張る。先頭の要求データに含まれる前へのポインタは空（ｎｕｌｌ）である。
【００６２】
受付時刻は、ハイパーバイザ１３０がデバイスから入力データを受け付け、先行系の仮想マシン１２１に入力データを投入するときの時刻である。受付時刻は、クロック数によって表現されており、ＣＰＵ１０３のＴＳＣレジスタ１０３ａの値が用いられる。
【００６３】
入力デバイスＩＤは、入力データを発行したデバイスを識別する識別子である。出力デバイスＩＤは、入力データに応じて仮想マシン１２１が生成する出力データの宛先となるデバイスを識別する識別子である。入力データの発行元および出力データの宛先は、入力データを受け付けるときに指定されてもよいし、入力データの種類に応じてハイパーバイザ１３０が判定してもよいし、実行単位１０１が実行するプログラムで定義されていてもよい。入力データは、デバイスから受け付けたデータである。例えば、デバイスがキーボードである場合、入力データには押下されたキーを示すキー情報が含まれる。
【００６４】
次に、業務サーバ１００および検証サーバ２００の動作について説明する。
図７は、システム起動の手順例を示すフローチャートである。
（Ｓ１０）初期化部１３１は、業務サーバ１００に対する起動要求を検出する。起動要求は、例えば、電源ボタンの押下または起動コマンドの入力を通じて発行される。
【００６５】
（Ｓ１１）初期化部１３１は、先行系の実行単位１０１を起動する。実行単位１０１のＣＰＵ１０３は、ＴＳＣレジスタ１０３ａの初期値をゼロに設定し、クロック信号の進行に合わせてＴＳＣレジスタ１０３ａをカウントアップすることを開始する。初期化部１３１は、仮想マシン１２１のプログラム（ＯＳプログラムやドライバプログラムなど）をＣＰＵ１０３に読み込ませ、実行単位１０１上に仮想マシン１２１を形成する。
【００６６】
（Ｓ１２）初期化部１３１は、業務サーバ１００のユーザが指定した遅延時間Δｔ１を確認する。Δｔ１は、クロック数として表現されている。Δｔ１を示す情報は、予め業務サーバ１００に記憶されていてもよいし、起動要求に含まれてもよい。
【００６７】
（Ｓ１３）初期化部１３１は、実行単位１０１を起動してからΔｔ１経過後に、追随系の実行単位１０２を起動する。例えば、初期化部１３１は、ＴＳＣレジスタ１０３ａの値を確認し、その値がΔｔ１になったときに実行単位１０２を起動する。実行単位１０２のＣＰＵ１０４は、ＴＳＣレジスタ１０４ａの初期値をゼロに設定し、クロック信号の進行に合わせてＴＳＣレジスタ１０４ａをカウントアップすることを開始する。これにより、ＴＳＣレジスタ１０４ａの値は、ＴＳＣレジスタ１０３ａよりΔｔ１だけ遅れる。初期化部１３１は、仮想マシン１２２のプログラム（仮想マシン１２１と同じもの）をＣＰＵ１０４に読み込ませ、実行単位１０２上に仮想マシン１２２を形成する。
【００６８】
図８は、冗長制御の手順例を示すフローチャートである。
（Ｓ２０）要求転送部１３３は、業務サーバ１００の周辺機器であるデバイスから入力データを受け付ける。例えば、要求転送部１３３は、入力デバイス１１８からキー入力についての入力データを受け付ける。また、例えば、要求転送部１３３は、通信インタフェース１１６から、受信パケットを含む入力データを受け付ける。
【００６９】
（Ｓ２１）要求転送部１３３は、先行系のＴＳＣレジスタ１０３ａの値（Ｔａ）を確認する。なお、ＴＳＣレジスタ１０３ａの値は、継続的にＣＰＵ１０３からハイパーバイザ１３０に通知されてもよい（プッシュ型の通知）。その場合、要求転送部１３３は、最後にＣＰＵ１０３から通知されたＴＳＣレジスタ１０３ａの値を確認する。
【００７０】
（Ｓ２２）要求転送部１３３は、先行系の仮想マシン１２１に入力データを投入する。入力データの投入は、ＣＰＵ１０３または仮想マシン１２１のＯＳに対する割り込みとして実現してもよい。実行単位１０１は、入力データに応じたプログラムを実行し始める。
【００７１】
（Ｓ２３）要求転送部１３３は、ステップＳ２１で確認したＴａ、すなわち、入力データが受け付けられ投入されるときのＣＰＵ１０３から見たハードウェア時刻を、入力データに付加する。また、要求転送部１３３は、入力データの発行元・出力データの宛先・入力データの長さを確認し、入力デバイスＩＤ・出力デバイスＩＤ・データ長の情報を入力データに付加する。そして、要求転送部１３３は、これらの情報を含む要求データを、要求バッファ１３２に形成されたキューの末尾に追加する。
【００７２】
（Ｓ２４）要求転送部１３３は、追随系のＴＳＣレジスタ１０４ａの値（Ｔｂ）を確認する。なお、ＴＳＣレジスタ１０４ａの値は、継続的にＣＰＵ１０４からハイパーバイザ１３０に通知されてもよい（プッシュ型の通知）。その場合、要求転送部１３３は、最後にＣＰＵ１０４から通知されたＴＳＣレジスタ１０４ａの値を確認する。
【００７３】
（Ｓ２５）要求転送部１３３は、ステップＳ２１で確認したＴａとステップＳ２４で確認したＴｂの差Δｔ４＝Ｔａ−Ｔｂを算出し、Δｔ４がゼロ以上であるか判断する。ＴＳＣレジスタ１０３ａ，１０４ａの差が起動時と同じΔｔ１であれば、Δｔ４はゼロ以上になる。ただし、ここでは、ＣＰＵ１０３，１０４が軽微なエラーのため一時停止することや、省電力制御によってクロック周波数が変化することなどにより、ＴＳＣレジスタ１０３ａ，１０４ａの差がΔｔ１からずれる可能性を考慮している。Δｔ４がゼロ以上の場合はステップＳ２６に処理が進み、ゼロ未満の場合はステップＳ２７に処理が進む。
【００７４】
（Ｓ２６）要求転送部１３３は、要求バッファ１３２に形成されたキューの先頭からステップＳ２３の要求データを読み出すと、ステップＳ２４からΔｔ４だけ経過したタイミングで、要求データに含まれる入力データを追随系の仮想マシン１２２に投入する。このタイミングとして、要求転送部１３３は、ＴＳＣレジスタ１０４ａの値がステップＳ２４からΔｔ４進んだことを検出してもよいし、Ｔａになったことを検出してもよい。要求バッファ１３２から読み出された要求データは、要求バッファ１３２から削除される。入力データの投入は、ＣＰＵ１０４または仮想マシン１２２のＯＳに対する割り込みとして実現してもよい。実行単位１０２は、入力データに応じたプログラム（実行単位１０１と同じもの）を実行し始める。そして、冗長制御が終了する。
【００７５】
（Ｓ２７）初期化部１３１は、先行系の実行単位１０１を一時停止する。また、要求転送部１３３は、追随系の実行単位１０２を停止してリセットする。これにより、ＣＰＵ１０４のレジスタやＲＡＭ１０７のデータが破棄される。
【００７６】
（Ｓ２８）初期化部１３１は、先行系の実行単位１０１の状態データを追随系の実行単位１０２にコピーする。このとき、ＣＰＵ１０３のレジスタのデータがＣＰＵ１０４のレジスタにコピーされ、ＲＡＭ１０６のデータがＲＡＭ１０７にコピーされる。コピーされるレジスタのデータには、ＴＳＣレジスタ１０３ａの値も含まれる。
【００７７】
（Ｓ２９）初期化部１３１は、先行系の実行単位１０１を再開させる。そして、初期化部１３１は、ＴＳＣレジスタ１０３ａの値がＴＳＣレジスタ１０４ａよりもΔｔ１だけ進んだタイミングで、追随系の実行単位１０２を再開させる。実行単位１０１上の仮想マシン１２１にはステップＳ２２で入力データを投入済みであるため、実行単位１０１の状態を引き継いだ実行単位１０２上の仮想マシン１２１には入力データを投入しなくてよい。要求転送部１３３は、要求バッファ１３２に格納された要求データを破棄する。
【００７８】
なお、初期化部１３１は、定期的にＴＳＣレジスタ１０３ａ，１０４ａの値を確認し、その差がΔｔ１から大きくずれている場合に実行単位１０２をリセットするようにしてもよい。例えば、初期化部１３１は、ｄｉｆｆ＝ＴＳＣレジスタ１０３ａの値−ＴＳＣレジスタ１０４ａの値−Δｔ１が所定の範囲−Ｔｈ≦ｄｉｆｆ≦Ｔｈ（Ｔｈは所定の閾値）に収まっているか判断し、収まっていない場合に実行単位１０２をリセットする。また、上記のステップＳ２５で用いた判定式は一例であり、ＴＳＣレジスタ１０３ａ，１０４ａの差がΔｔ１から大きくずれているか否か判定できる式であればよい。
【００７９】
図９は、要求処理のタイミング例を示すシーケンス図である。
ハイパーバイザ１３０は、何れかのデバイスから入力データを受け付ける（Ｓ３０）。すると、ハイパーバイザ１３０は、実行単位１０１のＴＳＣレジスタ１０３ａの値Ｔａを確認する（Ｓ３１）。ハイパーバイザ１３０は、実行単位１０１で入力データが処理されるように、仮想マシン１２１に入力データを投入する。入力データの投入が開始されてから完了するまで、Δｔ２クロック要するとする（Ｓ３２）。次に、ハイパーバイザ１３０は、受け付けた入力データを含む要求データを要求バッファ１３２に保存する。要求データの保存が開始されてから完了するまで、Δｔ３クロック要するとする（Ｓ３３）。
【００８０】
ハイパーバイザ１３０は、要求バッファ１３２に要求データを保存し終えると、実行単位１０２のＴＳＣレジスタ１０４ａの値Ｔｂを確認する（Ｓ３４）。ハイパーバイザ１３０は、ＴＳＣレジスタ１０４ａの値が、実行単位１０１に入力データを投入し始めた時点のＴＳＣレジスタ１０３ａの値Ｔａと一致するのを待つ（Ｓ３５）。ハイパーバイザ１３０は、ＴＳＣレジスタ１０４ａの値がＴａになると、実行単位１０２で入力データが処理されるように、要求バッファ１３２に保存した入力データを仮想マシン１２２に投入する。入力データの投入が開始されてから完了するまで、Δｔ２クロック要する（Ｓ３６）。
【００８１】
ここで、ＴＳＣレジスタ１０３ａ，１０４ａの差がΔｔ１に維持されているとすると、ステップＳ３２が開始されてからステップＳ３６が開始されるまでの遅延時間は、Δｔ１＝Δｔ２＋Δｔ３＋Δｔ４である。また、Ｔｂはその時点のＴＳＣレジスタ１０３ａの値よりΔｔ１だけ小さいから、Ｔｂ＝Ｔａ＋Δｔ２＋Δｔ３−Δｔ１である。よって、Ｔａ−Ｔｂ＝Δｔ１−Δｔ２−Δｔ３＝Δｔ４となる。すなわち、ステップＳ３５におけるハイパーバイザ１３０の待機時間はΔｔ４＝Ｔａ−Ｔｂになる。
【００８２】
ハイパーバイザ１３０は、実行単位１０１上の仮想マシン１２１から入力データに対する出力データを取得する。すると、ハイパーバイザ１３０は、宛先のデバイスに出力データを転送する（Ｓ３７）。一方、ハイパーバイザ１３０は、実行単位１０２上の仮想マシン１２２から入力データに対する出力データを取得する。すると、ハイパーバイザ１３０は、出力データを破棄して何れのデバイスにも転送しない（Ｓ３８）。追随系の実行単位１０２は、専らエラー発生時に状態データを得るためにプログラムを実行する。なお、仮想マシン１２１からの出力データの取得は、仮想マシン１２２に入力データを投入する前になることもあるし、仮想マシン１２２に入力データを投入した後になることもある。
【００８３】
図１０は、デバッグ情報収集の手順例を示すフローチャートである。
（Ｓ４０）エラー検出部１３５は、先行系の実行単位１０１においてメモリアクセス違反などのソフトウェア上のエラーが発生したことを検出する。
【００８４】
（Ｓ４１）エラー検出部１３５は、先行系の実行単位１０１および追随系の実行単位１０２を停止する。また、エラー検出部１３５は、新たな要求データを要求バッファ１３２に格納することと、要求バッファ１３２から要求データを読み出すことを禁止する。
【００８５】
（Ｓ４２）エラー検出部１３５は、先行系の実行単位１０１の状態データであるＣＰＵ１０３のレジスタおよびＲＡＭ１０６のデータを、デバッグ情報の一部としてデバッグ情報記憶部１３６に保存する。データには、ＴＳＣレジスタ１０３ａの値も含まれる。
【００８６】
（Ｓ４３）エラー検出部１３５は、追随系の実行単位１０２の状態データであるＣＰＵ１０４のレジスタおよびＲＡＭ１０７のデータを、デバッグ情報の一部としてデバッグ情報記憶部１３６に保存する。データには、ＴＳＣレジスタ１０４ａの値も含まれる。
【００８７】
（Ｓ４４）エラー検出部１３５は、要求バッファ１３２に格納されている要求データを、デバッグ情報の一部としてデバッグ情報記憶部１３６に保存する。
（Ｓ４５）エラー検出部１３５は、実行単位１０１，１０２に使用しているチップセットの規格など、実行単位１０１，１０２のハードウェア仕様を示すハードウェア構成情報を生成し、デバッグ情報の一部としてデバッグ情報記憶部１３６に保存する。
【００８８】
図１１は、エラー再現の手順例を示すフローチャートである。
（Ｓ５０）デバッグ情報取得部２２１は、業務サーバ１００においてプログラムを続行できないエラーが発生すると、業務サーバ１００からデバッグ情報を取得する。
【００８９】
（Ｓ５１）環境再現部２２２は、デバッグ情報の中から実行単位１０１，１０２のハードウェア仕様を示すハードウェア構成情報を抽出する。環境再現部２２２は、ハードウェア構成情報に基づいて、実行単位１０１，１０２のハードウェア仕様が検証サーバ２００によってサポートされているものか判断する。サポートの有無を判断するため、例えば、環境再現部２２２は、サポートしているチップセット規格のリストなどのサポート情報を有している。実行単位１０１，１０２がサポート対象である場合はステップＳ５２に処理が進み、サポート対象でない場合はステップＳ５５に処理が進む。
【００９０】
（Ｓ５２）環境再現部２２２は、デバッグ情報に含まれる追随系の実行単位１０２の状態データを、検証サーバ２００が有する検証用の実行単位に書き込む。すなわち、環境再現部２２２は、ＣＰＵ１０４のレジスタのデータを検証サーバ２００のＣＰＵのレジスタに書き込み、ＲＡＭ１０７のデータを検証サーバ２００のＲＡＭに書き込む。レジスタのデータには、ＴＳＣレジスタ１０４ａの値も含まれる。また、環境再現部２２２は、デバッグ情報に含まれる要求データ（追随系の仮想マシン１２２にまだ投入されずに要求バッファ１３２に残っていた要求データ）を要求バッファ２２３に書き込む。
【００９１】
（Ｓ５３）要求転送部２２４は、検証サーバ２００が有する実行単位を用いて仮想マシン１２１が再現されると、要求バッファ２２３のキューの先頭から順に要求データを読み出す。要求転送部２２４は、要求データに含まれる受付時刻に応じたタイミングで、要求データに含まれる入力データを仮想マシンに投入する。例えば、要求転送部２２４は、検証サーバ２００が有する実行単位のＴＳＣレジスタの値が、要求データの受付時刻（クロック数）に一致したとき、仮想マシンに入力データを投入する。これにより、検証サーバ２００の実行単位は、実行単位１０１と同じタイミングで実行単位１０１と同じプログラムを実行することになり、エラー発生前の実行単位１０１の動作を再現できる。
【００９２】
（Ｓ５４）検証サーバ２００は、検証サーバ２００の実行単位の状態（業務サーバ１００の実行単位１０１の状態を再現したもの）を監視し、デバッグ作業を支援する。例えば、検証サーバ２００は、実行単位が実行するメモリアクセス命令を監視し、不適切なメモリアクセスを検出する。そして、エラー再現を終了する。
【００９３】
（Ｓ５５）環境再現部２２２は、取得したデバッグ情報からエラー発生前の仮想マシン１２１を再現することに失敗した旨を、検証サーバ２００のユーザに通知する。例えば、環境再現部２２２は、再現失敗を示すメッセージをディスプレイに表示する。
【００９４】
図１２は、エラー検出および再現のタイミング例を示す図である。
実行単位１０１のＴＳＣレジスタ１０３ａの値がＴ１０のとき、入力データ１が仮想マシン１２１に投入されたとする。すると、受付時刻Ｔ１０の付加された入力データ１が要求バッファ１３２に格納される。次に、ＴＳＣレジスタ１０３ａの値がＴ２０のとき、入力データ２が仮想マシン１２１に投入されたとする。すると、受付時刻Ｔ２０の付加された入力データ２が要求バッファ１３２に格納される。次に、ＴＳＣレジスタ１０３ａの値がＴ３０のとき、入力データ３が仮想マシン１２１に投入されたとする。すると、受付時刻Ｔ３０の付加された入力データ３が要求バッファ１３２に格納される。
【００９５】
一方、実行単位１０２のＴＳＣレジスタ１０４ａの値がＴ１０のとき、要求バッファ１３２から入力データ１が読み出されて仮想マシン１２２に投入される。実行単位１０１，１０２が入力データ１を処理し始めるタイミングの差は、Δｔ１になるよう制御される。また、ＴＳＣレジスタ１０４ａの値がＴ２０のとき、要求バッファ１３２から入力データ２が読み出されて仮想マシン１２２に投入される。実行単位１０１，１０２が入力データ２を処理し始めるタイミングの差は、入力データ１と同様にΔｔ１に統一される。
【００９６】
ここで、実行単位１０１において入力データ３の処理中にエラーが発生したとし、エラー発生時のＴＳＣレジスタ１０４ａの値がＴ２５であるとする。すると、ＴＳＣレジスタ１０４ａの値がＴ２５の時点における実行単位１０２の状態データが保存され、また、要求バッファ１３２に残っている入力データ３が保存される。保存した実行単位１０２の状態データは、ＴＳＣレジスタ１０３ａの値がＴ２５であった過去の（エラー発生前の）実行単位１０１の状態データと等価であると期待できる。検証サーバ２００において仮想マシンの動作を検証する場合、ＴＳＣレジスタの値がＴ２５の時点からプログラムが再開され、保存した入力データ３がＴＳＣレジスタの値がＴ３０のときに投入される。
【００９７】
第２の実施の形態の情報処理システムによれば、デバイスから受け付けた入力データがプログラムに従って実行単位１０１で処理されると、実行単位１０１から所定のクロック数だけ遅れて、同じ入力データが同じプログラムに従って実行単位１０２で処理される。実行単位１０１，１０２間の遅延時間は、ＣＰＵ１０３が有するＴＳＣレジスタ１０３ａおよびＣＰＵ１０４が有するＴＳＣレジスタ１０４ａに保持されるクロック数を用いて管理される。よって、遅延時間を一定に維持することが容易となる。実行単位１０１，１０２でタイミング依存の処理が実行されても、２つの実行単位の処理結果を一致させることができる。その結果、実行単位１０１のエラー発生前の状態を、エラー発生時に取得される実行単位１０２の状態データを用いて精度よく再現することができる。また、ＴＳＣレジスタ１０３ａ，１０４ａの差を一定に維持することで、遅延時間の管理が容易となる。
【００９８】
なお、前述のように、第２の実施の形態の情報処理は、情報処理装置１０にプログラムを実行させることで実現することができる。第２の実施の形態の情報処理は、業務サーバ１００および検証サーバ２００にプログラムを実行させることで実現することができる。
【００９９】
プログラムは、コンピュータ読み取り可能な記録媒体（例えば、記録媒体１１９）に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、ＦＤおよびＨＤＤが含まれる。光ディスクには、ＣＤ、ＣＤ−Ｒ（Recordable）／ＲＷ（Rewritable）、ＤＶＤおよびＤＶＤ−Ｒ／ＲＷが含まれる。プログラムは、可搬型の記録媒体に記録されて配布されることがある。その場合、可搬型の記録媒体からＨＤＤなどの他の記録媒体（例えば、ＨＤＤ１１２）にプログラムを複製して（インストールして）実行してもよい。
【符号の説明】
【０１００】
１０  情報処理装置
１１，１２  プロセッサ
１１ａ，１２ａ  カウンタ
１３  制御部
【図１】
2015146116.tif 000003
【図２】
2015146116.tif 000004
【図３】
2015146116.tif 000005
【図４】
2015146116.tif 000006
【図５】
2015146116.tif 000007
【図６】
2015146116.tif 000008
【図７】
2015146116.tif 000009
【図８】
2015146116.tif 000010
【図９】
2015146116.tif 000011
【図１０】
2015146116.tif 000012
【図１１】
2015146116.tif 000013
【図１２】
2015146116.tif 000014