(57)【要約】【課題】メモリのデータを不正に更新したプログラムモジュールの特定を支援すること。【解決手段】エラー検出システム１０は、メモリ１１およびプロセッサ１２を有する。プロセッサ１２は、プロセッサリソース１２ａ，１２ｂを含む。プロセッサリソース１２ａは、プロセッサリソース１２ａにより実行されるプロセスＰ１がメモリ１１のアドレスＡに格納された情報を処理しようとして発生したエラーを検出すると、プロセスＰ１によりアクセスされたメモリ１１のアドレスＡである監視対象アドレスを取得する。プロセッサリソース１２ａは、監視対象アドレスＡがプロセスＰ２によりアクセスされたことを検出すると、プロセスＰ２を実行していたモジュールの情報を取得する。【選択図】図１
2016076152.tif 000002
【特許請求の範囲】
【請求項１】
メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有し、
第１のプロセッサリソースが、
前記第１のプロセッサリソースにより実行される第１のプロセスが前記メモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、前記第１のプロセスによりアクセスされた前記アドレスである監視対象アドレスを取得し、
第２のプロセスにより前記監視対象アドレスがアクセスされたことを検出すると、前記第２のプロセスを実行していたモジュールの情報を取得する、
エラー検出システム。
【請求項２】
前記第１のプロセッサリソースは、前記エラーの発生後、第２のプロセッサリソースによる前記第２のプロセスの実行が停止されても再開させる、請求項１記載のエラー検出システム。
【請求項３】
前記第１のプロセッサリソースは、前記エラーの発生後、メモリダンプを取得する際に、前記第２のプロセッサリソースによる前記第２のプロセスの実行を停止させ、前記メモリダンプの取得が終了すると、前記第２のプロセッサリソースによる前記第２のプロセスの実行を再開させる、請求項２記載のエラー検出システム。
【請求項４】
前記エラーは、前記第１のプロセスによるアクセスが許可されていない禁止アドレスへのアクセスが検出されたことで発生するメモリアクセス違反であり、
前記監視対象アドレスは、前記第１のプロセスに前記禁止アドレスへアクセスする情報が格納された記憶領域を示すアドレスである、
請求項１乃至３の何れか１項に記載のエラー検出システム。
【請求項５】
前記第１のプロセッサリソースは、前記監視対象アドレスを含む所定のアドレス範囲内の何れかのアドレスが前記第２のプロセスによりアクセスされたことを検出すると、前記モジュールの情報を取得する、請求項１乃至４の何れか１項に記載のエラー検出システム。
【請求項６】
メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有し、
第１のプロセッサリソースが、前記第１のプロセッサリソースにより実行される第１のプロセスが前記メモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、第２のプロセッサリソースによる第２のプロセスの実行を停止させ、前記第１のプロセスによりアクセスされた前記アドレスである監視対象アドレスを取得し、
第３のプロセッサリソースが、前記メモリに格納された情報および前記第２のプロセッサリソースの状態を示す情報に基づいて第４のプロセッサリソースにより前記第２のプロセスの実行を再開させ、前記第２のプロセスにより前記監視対象アドレスがアクセスされたことを検出すると、前記第２のプロセスを実行していたモジュールの情報を取得する、
エラー検出システム。
【請求項７】
メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有するシステムのエラー検出方法であって、
第１のプロセッサリソースが、
前記第１のプロセッサリソースにより実行される第１のプロセスが前記メモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、前記第１のプロセスによりアクセスされた前記アドレスである監視対象アドレスを取得し、
第２のプロセスにより前記監視対象アドレスがアクセスされたことを検出すると、前記第２のプロセスを実行していたモジュールの情報を取得する、
エラー検出方法。
【請求項８】
メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有するシステムのエラー検出方法であって、
第１のプロセッサリソースが、前記第１のプロセッサリソースにより実行される第１のプロセスが前記メモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、第２のプロセッサリソースによる第２のプロセスの実行を停止させ、前記第１のプロセスによりアクセスされた前記アドレスである監視対象アドレスを取得し、
第３のプロセッサリソースが、前記メモリに格納された情報および前記第２のプロセッサリソースの状態を示す情報に基づいて第４のプロセッサリソースにより前記第２のプロセスの実行を再開させ、前記第２のプロセスにより前記監視対象アドレスがアクセスされたことを検出すると、前記第２のプロセスを実行していたモジュールの情報を取得する、
エラー検出方法。
【請求項９】
メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有する第１コンピュータに、
第１のプロセッサリソースにより実行される第１のプロセスが前記メモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、第２のプロセッサリソースによる第２のプロセスの実行を停止させ、前記第１のプロセスによりアクセスされた前記アドレスである監視対象アドレスを取得し、
前記メモリに格納された第１の情報および前記第２のプロセッサリソースの状態を示す第２の情報に基づいて前記第２のプロセスの実行を再開し前記第２のプロセスによるメモリアクセスを監視する第２コンピュータに、前記第１の情報と前記第２の情報と前記監視対象アドレスとを送信する、
処理を実行させるエラー検出プログラム。
【請求項１０】
メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有する、第１コンピュータと通信する第２コンピュータに、
第１のプロセッサリソースにより実行される第１のプロセスが前記メモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーが検出されたときに前記第１のプロセスがアクセスした前記アドレスである監視対象アドレスと、前記エラー時の前記メモリに格納された第１の情報と、前記エラー時に実行が停止された第２のプロセスを実行していた第２のプロセッサリソースの状態を示す第２の情報と、を前記第１コンピュータから取得し、
前記第１の情報および前記第２の情報に基づいて前記第２のプロセスの実行を再開し、
前記第２のプロセスにより前記監視対象アドレスがアクセスされたことを検出すると、前記第２のプロセスを実行していたモジュールの情報を取得する、
処理を実行させるエラー検出プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はエラー検出システム、エラー検出方法およびエラー検出プログラムに関する。
【背景技術】
【０００２】
情報処理システムでは、ソフトウェアの不具合によってメモリアクセス違反などの予期しないエラーが発生することがある。エラーが発生すると、情報処理システムの管理者または開発者は、ソフトウェアの中からエラー原因のプログラムモジュールを探し、エラーの再発防止のためにソフトウェアを修正することになる。
【０００３】
エラー原因を分析する方法の１つとして、エラーが検出された時点におけるレジスタやメモリに格納されたデータを抽出し、抽出したデータ（メモリダンプやダンプなどと呼ばれることもある）を解析することが考えられる。
【０００４】
例えば、オペレーティングシステムには、あるプログラムモジュールにより深刻なエラーが引き起こされると、メモリダンプを取得するものがある。具体的には、オペレーティングシステムは、あるプロセッサ（物理的なプロセッサのリソースを論理的に分割した仮想的なプロセッサでもよい。以下同様）で実行されるプログラムモジュールによる深刻なエラーを検出する。すると、オペレーティングシステムは、該当のプロセッサによりメモリダンプを取得する。この場合、該当のプロセッサでエラー直前に実行されていた処理は強制的に終了されることになるので、当該処理を続行することは難しくなる。
【０００５】
また、オペレーティングシステムのダンプ取得を支援する方法が提案されている。この提案では、オペレーティングシステムが障害により停止したとき、障害発生以前にオペレーティングシステムに割り当てられていた領域とは異なる物理メモリ領域を割り当ててオペレーティングシステムを再起動する。そして、再起動処理とは非同期に、オペレーティングシステムが障害時に使用した物理メモリ領域のダンプを取得する。
【０００６】
なお、アプリケーションソフトがライブラリ上で動作する過程でメモリ上の禁止されたアドレスにアクセスを行うと、アプリケーションソフトのライブラリ上での動作を終了させることで、メモリのデータ破壊や意図しない動作を未然に回避する提案もある。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００１−２９０６７８号公報
【特許文献２】特開２００３−９９２９３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
あるプログラムモジュールにより、メモリ上のある記憶領域に格納されたデータが不正に更新され、その後、他のプログラムモジュールにより更新結果が参照された結果、エラーが検出されることがある。この場合、エラー検出時に抽出されたデータからエラー原因を特定することが難しいという問題がある。
【０００９】
例えば、エラー検出時のメモリダンプなどのデータを参照しても、データが既に破壊されていると、エラー原因の特定が難しい。また、不正なデータ更新が行われてからエラー検出までにタイムラグがあると、エラー検出時のデータから過去に遡ってエラー原因を特定することが難しい。
【００１０】
１つの側面では、本発明は、メモリのデータを不正に更新したプログラムモジュールの特定を支援できるエラー検出システム、エラー検出方法およびエラー検出プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１１】
１つの態様では、エラー検出システムが提供される。このエラー検出システムは、メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有する。このエラー検出システムでは、第１のプロセッサリソースが、第１のプロセッサリソースにより実行される第１のプロセスがメモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、第１のプロセスによりアクセスされたアドレスである監視対象アドレスを取得し、第２のプロセスにより監視対象アドレスがアクセスされたことを検出すると、第２のプロセスを実行していたモジュールの情報を取得する。
【００１２】
また、１つの態様では、エラー検出システムが提供される。このエラー検出システムは、メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有する。このエラー検出システムでは、第１のプロセッサリソースが、第１のプロセッサリソースにより実行される第１のプロセスがメモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、第２のプロセッサリソースによる第２のプロセスの実行を停止させ、第１のプロセスによりアクセスされたアドレスである監視対象アドレスを取得し、第３のプロセッサリソースが、メモリに格納された情報および第２のプロセッサリソースの状態を示す情報に基づいて第４のプロセッサリソースにより第２のプロセスの実行を再開させ、第２のプロセスにより監視対象アドレスがアクセスされたことを検出すると、第２のプロセスを実行していたモジュールの情報を取得する。
【００１３】
また、１つの態様では、メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有するシステムのエラー検出方法が提供される。このエラー検出方法では、第１のプロセッサリソースが、第１のプロセッサリソースにより実行される第１のプロセスがメモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、第１のプロセスによりアクセスされたアドレスである監視対象アドレスを取得し、第２のプロセスにより監視対象アドレスがアクセスされたことを検出すると、第２のプロセスを実行していたモジュールの情報を取得する。
【００１４】
また、１つの態様では、メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有するシステムのエラー検出方法が提供される。このエラー検出方法では、第１のプロセッサリソースが、第１のプロセッサリソースにより実行される第１のプロセスがメモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、第２のプロセッサリソースによる第２のプロセスの実行を停止させ、第１のプロセスによりアクセスされたアドレスである監視対象アドレスを取得し、第３のプロセッサリソースが、メモリに格納された情報および第２のプロセッサリソースの状態を示す情報に基づいて第４のプロセッサリソースにより第２のプロセスの実行を再開させ、第２のプロセスにより監視対象アドレスがアクセスされたことを検出すると、第２のプロセスを実行していたモジュールの情報を取得する。
【００１５】
また、１つの態様では、エラー検出プログラムが提供される。このエラー検出プログラムは、メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有する第１コンピュータに、第１のプロセッサリソースにより実行される第１のプロセスがメモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、第２のプロセッサリソースによる第２のプロセスの実行を停止させ、第１のプロセスによりアクセスされたアドレスである監視対象アドレスを取得し、メモリに格納された第１の情報および第２のプロセッサリソースの状態を示す第２の情報に基づいて第２のプロセスの実行を再開し第２のプロセスによるメモリアクセスを監視する第２コンピュータに、第１の情報と第２の情報と監視対象アドレスとを送信する、処理を実行させる。
【００１６】
また、１つの態様では、エラー検出プログラムが提供される。このエラー検出プログラムは、メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有する、第１コンピュータと通信する第２コンピュータに、第１のプロセッサリソースにより実行される第１のプロセスがメモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーが検出されたときに第１のプロセスがアクセスしたアドレスである監視対象アドレスと、エラー時のメモリに格納された第１の情報と、エラー時に実行が停止された第２のプロセスを実行していた第２のプロセッサリソースの状態を示す第２の情報と、を第１コンピュータから取得し、第１の情報および第２の情報に基づいて第２のプロセスの実行を再開し、第２のプロセスにより監視対象アドレスがアクセスされたことを検出すると、第２のプロセスを実行していたモジュールの情報を取得する、処理を実行させる。
【発明の効果】
【００１７】
１つの側面では、メモリのデータを不正に更新したプログラムモジュールの特定を支援できる。
【図面の簡単な説明】
【００１８】
【図１】第１の実施の形態のエラー検出システムを示す図である。
【図２】第２の実施の形態のエラー検出システムを示す図である。
【図３】第３の実施の形態の情報処理システムを示す図である。
【図４】第３の実施の形態の業務サーバのハードウェア例を示す図である。
【図５】第３の実施の形態の仮想マシンの例を示す図である。
【図６】第３の実施の形態の業務サーバの機能例を示す図である。
【図７】第３の実施の形態の仮想マシン構成情報の例を示す図である。
【図８】第３の実施の形態の処理例を示すシーケンス図である。
【図９】第３の実施の形態の本番用ＶＭの処理例を示すフローチャートである。
【図１０】第３の実施の形態の調査用ＶＭの処理例を示すフローチャートである。
【図１１】第３の実施の形態の業務サーバの他のハードウェア例を示す図である。
【図１２】第４の実施の形態の情報処理システムの例を示す図である。
【図１３】第４の実施の形態の仮想マシンの例を示す図である。
【発明を実施するための形態】
【００１９】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態のエラー検出システムを示す図である。第１の実施の形態のエラー検出システム１０は、エラーを検出したときにエラー原因の分析に用いられる情報を出力する。エラー検出システム１０では、種々のソフトウェアが利用される。ソフトウェアは、複数のプログラムモジュールを含む。エラー検出システム１０は、ソフトウェアに含まれるプログラムモジュールの実行を、プロセスと呼ばれる単位で管理する。プロセスは、プログラムの実行を管理するための単位であり、プログラムに含まれる命令や命令の実行に用いられる情報などを含む。
【００２０】
エラー検出システム１０では、第１のプログラムモジュールが、第２のプログラムモジュールによって破壊されたメモリ上のデータを参照したときにエラーが検出されることがある。メモリ上のデータの破壊が要因となって検出されるエラーとして、メモリアクセス違反（メモリアクセス例外ということもある）が挙げられる。具体的には、第２のプログラムモジュールが、第１のプログラムモジュールによるアクセスが禁止されている禁止アドレスを示すポインタをメモリ上のある記憶領域に書き込む。その後、第１のプログラムモジュールが、記憶領域を参照すると禁止アドレスへアクセスする。エラー検出システム１０は、禁止アドレスへのアクセスをメモリアクセス違反として検出する。
【００２１】
エラー検出システム１０は、メモリ１１およびプロセッサ１２を有する。メモリ１１は、プロセッサ１２により実行されるプログラムやプログラムの実行に用いられる各種の情報を記憶する。プロセッサ１２は、ＣＰＵ（Central Processing Unit）やＤＳＰ（Digital Signal Processor）であってもよく、ＡＳＩＣ（Application Specific Integrated Circuit）やＦＰＧＡ（Field Programmable Gate Array）などの特定用途の集積回路を含んでもよい。エラー検出システム１０は、複数のプロセッサを有してもよい。
【００２２】
プロセッサ１２は、プロセッサリソース１２ａ，１２ｂを含む。プロセッサリソース１２ａ，１２ｂは、エラー検出システム１０における演算用のリソースである。演算用のリソースとは、演算処理を行うために用いられるプロセッサ１２の資源である。プロセッサリソース１２ａを第１のプロセッサリソース、プロセッサリソース１２ｂを第２のプロセッサリソースと呼べる。エラー検出システム１０が（物理的な）プロセッサを複数有する場合、１つのプロセッサリソースは１つの（物理的な）プロセッサでもよい。
【００２３】
また、エラー検出システム１０で仮想マシンが動作する場合、ハイパーバイザと呼ばれるソフトウェアが、演算用のリソースを、プロセッサ１２から仮想マシンに割り当てることもある。ハイパーバイザは、例えば、１つのプロセッサの利用可能時間を時分割することで、複数の仮想的なプロセッサを仮想マシンに割り当てる。あるいは、ハイパーバイザは、２以上のプロセッサを１つの仮想的なプロセッサとし、仮想マシンに割り当てることもある。１つのプロセッサリソースは、ハイパーバイザにより仮想マシンに割り当てられた１つの仮想的なプロセッサでもよい。ここで、プロセッサリソース１２ａは、プロセスＰ１（第１のプロセス）を実行している。プロセッサリソース１２ｂは、プロセスＰ２（第２のプロセス）を実行している。
【００２４】
プロセッサリソース１２ａは、プロセスＰ１がメモリ１１の何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出する。プロセスＰ１は、システムの続行に重大な影響を及ぼすエラーを引き起こすと、オペレーティングシステムのメモリ保護機能などによって強制的に停止される（メモリ１１のデータが破壊されているためプロセスＰ１の続行は不能となる）。プロセッサリソース１２ａは、エラーを検出すると、監視プロセスＰＭの実行を開始し、以下の機能を発揮する。なお、プロセスＰ１がエラー時に処理した情報を格納したアドレスを、アドレスＡとする。
【００２５】
プロセッサリソース１２ａは、プロセスＰ１によりアクセスされたメモリ１１のアドレスＡを取得する。例えば、プロセッサリソース１２ａは、エラー検出時にメモリダンプなどのデータをメモリ１１から抽出し、プロセスＰ１によりアクセスされたアドレスＡを、抽出したデータから取得する。
【００２６】
アドレスＡは、エラーを引き起こした情報が格納されたメモリ１１の記憶領域を示している。メモリアクセス違反のエラーが発生する場合、アドレスＡで示される記憶領域には、プロセスＰ１からのアクセスが禁止されている禁止アドレスＢへの参照を示す情報（例えば、禁止アドレスＢを示すポインタ）が格納されている。
【００２７】
プロセッサリソース１２ａは、プロセッサリソース１２ｂにより実行されるプロセスＰ２の実行を継続させて、プロセスＰ２のメモリアクセスを監視する。具体的には、プロセッサリソース１２ａは、エラー検出後、メモリダンプを取得するために、プロセッサリソース１２ｂによるプロセスＰ２を停止させることがある。その場合、プロセッサリソース１２ａは、メモリダンプの取得後に、停止されたプロセスＰ２のプロセッサリソース１２ｂによる実行を再開させる。すると、プロセッサリソース１２ａは、メモリダンプの取得後に、プロセスＰ２によるメモリアクセスを監視できる。
【００２８】
プロセッサリソース１２ａは、アドレスＡに応じた監視対象のアドレス（監視対象アドレス）がプロセスＰ２によりアクセスされたことを検出すると、プロセスＰ２を実行していたモジュールの情報（モジュール情報）をハイパーバイザから取得する。監視対象アドレスは、例えばアドレスＡである。あるプログラムモジュールがあるアドレスで示される記憶領域のデータを更新した場合、同じプログラムモジュールが、比較的短時間後に再度同じアドレスへアクセスするという特性（例えば、書き込み確認のためなど）があるからである。すなわち、アドレスＡのデータを破壊したプログラムモジュールは、エラー発生から比較的短時間後にアドレスＡに再度アクセスする可能性が高い。
【００２９】
監視対象アドレスは、アドレスＡ以外のアドレスでもよい。例えば、アドレスＡから所定サイズ分だけずらしたアドレス（複数でもよい）としてもよい。また、監視対象アドレスは、アドレスＡから所定サイズ分だけずらしたアドレス（複数でもよい）を含んだ範囲としてもよい。アドレスＡ以外の他のアドレス（例えば、アドレスＡ近傍のアドレス）でデータが破壊されたために、アドレスＡに格納された参照先アドレスが変更されて、メモリアクセス違反が引き起こされた可能性もあるからである。
【００３０】
モジュール情報は、プロセスＰ２に読み込まれて実行されるプログラムモジュールの情報である。モジュール情報は、例えば、プロセスＰ２が監視対象アドレスにアクセスしたときに、プロセスＰ２に読み込まれていたプログラムモジュールの名称や、実行されていた命令のアドレスなどの情報を含む。プロセッサリソース１２ａは、エラー検出システム１０に接続された不揮発性の記憶装置（図示を省略）にモジュール情報を格納する。プロセッサリソース１２ａは、モジュール情報をメモリダンプに追加し、記憶装置に格納してもよい。
【００３１】
第１の実施の形態のエラー検出システム１０によれば、プロセッサリソース１２ａにより実行されるプロセスＰ１がメモリ１１のアドレスＡに格納された情報を処理しようとして発生したエラーが検出される。すると、プロセスＰ１がアクセスしたアドレスＡ（監視対象アドレス）がプロセッサリソース１２ａにより取得される。プロセスＰ２がアドレスＡにアクセスしたことが検出されると、プロセスＰ２を実行していたモジュールの情報が、プロセッサリソース１２ａにより取得される。これにより、メモリ１１のデータを不正に更新したプログラムモジュールの特定を支援できる。
【００３２】
前述のように、第２のプログラムモジュールがアドレスＡのデータを破壊した場合、エラー発生後に同じ第２のプログラムモジュールがアドレスＡに再度アクセスする可能性が高い。そこで、エラー発生後、プロセスＰ２がアドレスＡにアクセスしたタイミングで、プロセスＰ２に読み込まれていた第２のプログラムモジュールのモジュール情報を取得する。システムの管理者または開発者は、取得されたモジュール情報を確認することで、メモリ上のデータを破壊したプログラムモジュールの見当をつけ、デバッグ作業に役立てることができる。
【００３３】
なお、プロセッサリソース１２ｂが、プロセスＰ２の代わりに監視プロセスＰＭを実行することも考えられる。しかし、この場合、プロセッサリソース１２ｂのエラー時の状態が維持されないことになり、プロセッサリソース１２ｂでエラー時に実行されていたプロセスＰ２の監視を行えない。そこで、プロセスＰ１を実行していたプロセッサリソース１２ａを用いて、監視プロセスＰＭを実行することで、エラー検出時に存在していたプロセスＰ２を維持して適切に監視を行える。
【００３４】
また、エラー検出時に、プロセッサリソース１２ａ，１２ｂ以外の他のプロセッサリソースにより実行される他のプロセスが存在していてもよい。その場合、プロセッサリソース１２ａは、プロセスＰ２に加えて、他のプロセッサリソースによる他のプロセスの実行を継続させて、他のプロセスのメモリアクセスも監視する。
【００３５】
更に、メモリ上のデータが破壊されることで発生し得るエラーとしてメモリアクセス違反を例示したが他のエラーも考えられる。例えば、データ破壊により、ある命令が命令として認識できない内容に書き換えられてしまうこともある。この場合、プロセスＰ１がアクセスした際に命令が存在するはずであったにも関わらず、命令を認識できないことを原因に、プロセスＰ１でエラーが発生する可能性がある。エラー検出システム１０は、このようなエラーの場合にも同様にして、原因となったプログラムモジュールの特定を支援できる。
【００３６】
［第２の実施の形態］
図２は、第２の実施の形態のエラー検出システムを示す図である。第２の実施の形態のエラー検出システム２０は、エラーを検出したときにエラー原因の分析に用いられる情報を出力する。エラー検出システム２０では、種々のソフトウェアが利用される。ソフトウェアは、複数のプログラムモジュールを含む。エラー検出システム２０は、ソフトウェアに含まれるプログラムモジュールの実行をプロセス単位に管理する。
【００３７】
エラー検出システム２０は、メモリ２１，２２およびプロセッサ２３を有する。メモリ２１，２２は、プロセッサ２３により実行されるプログラムやプログラムの実行に用いられる各種の情報を記憶する。プロセッサ２３は、ＣＰＵやＤＳＰであってもよく、ＡＳＩＣやＦＰＧＡなどの特定用途の集積回路を含んでもよい。エラー検出システム２０は、複数のプロセッサを有してもよい。
【００３８】
プロセッサ２３は、プロセッサリソース２３ａ，２３ｂ，２３ｃ，２３ｄを含む。プロセッサリソース２３ａ，２３ｂ，２３ｃ，２３ｄは、エラー検出システム２０における演算用のリソースである。プロセッサリソース２３ａを第１のプロセッサリソース、プロセッサリソース２３ｂを第２のプロセッサリソース、プロセッサリソース２３ｃを第３のプロセッサリソース、プロセッサリソース２３ｄを第４のプロセッサリソースと呼べる。
【００３９】
エラー検出システム２０が（物理的な）プロセッサを複数有する場合、１つのプロセッサリソースは１つの（物理的な）プロセッサでもよい。また、１つのプロセッサリソースは、ハイパーバイザによりエラー検出システム２０上で動作する仮想マシンに割り当てられた１つの仮想的なプロセッサでもよい。
【００４０】
エラー検出システム２０では、例えば、メモリ２１，２２およびプロセッサリソース２３ａ，２３ｂ，２３ｃ，２３ｄを用いて、仮想マシンやオペレーティングシステムなどの複数の実行単位を形成できる。一例として、メモリ２１およびプロセッサリソース２３ａ，２３ｂを実行単位Ｅ１とする。メモリ２２およびプロセッサリソース２３ｃ，２３ｄを実行単位Ｅ２とする。ここで、プロセッサリソース２３ａは、プロセスＰ３（第１のプロセス）を実行している。プロセッサリソース２３ｂは、プロセスＰ４（第２のプロセス）を実行している。
【００４１】
プロセッサリソース２３ａは、プロセスＰ３がメモリ２１の何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出する。ここで、プロセスＰ３がエラー時に処理した情報を格納したアドレスを、アドレスＡとする。プロセッサリソース２３ａは、プロセスＰ３のエラーを検出すると、プロセッサリソース２３ｂにより実行されるプロセスＰ４の実行を停止させる。プロセッサリソース２３ａは、プロセスＰ３によりアクセスされたメモリ２１のアドレスＡを取得する。例えば、プロセッサリソース２３ａは、エラー検出時にメモリダンプなどのデータをメモリ２１から抽出し、プロセスＰ３によりアクセスされたアドレスＡを、抽出したデータから取得する。
【００４２】
プロセッサリソース２３ｃは、メモリ２１に格納された情報およびプロセッサリソース２３ｂの状態を示す情報に基づいて、プロセッサリソース２３ｄによりプロセスＰ４の実行を再開させる。プロセッサリソース２３ｃは、プロセスＰ４のメモリアクセスを監視する。プロセッサリソース２３ｃは、アドレスＡに応じた監視対象アドレスがプロセスＰ４によりアクセスされたことを検出すると、プロセスＰ４を実行していたモジュールの情報を取得する。
【００４３】
プロセッサ２３に含まれる他のプロセッサリソースが、実行単位Ｅ１の状態を実行単位Ｅ２に複製してもよい。例えば、他のプロセッサリソースが、メモリ２１に格納された情報をメモリ２２に複製し、プロセッサリソース２３ａの状態をプロセッサリソース２３ｃに複製し、プロセッサリソース２３ｂの状態をプロセッサリソース２３ｄに複製する。実行単位Ｅ１で仮想マシンが実行される場合、複製にはハイパーバイザ（他のプロセッサリソースによって実現される）による仮想マシンの複製機能を用いてもよい。その場合、実行単位Ｅ１により第１の仮想マシンを動作させるハイパーバイザが、当該ハイパーバイザ上で、実行単位Ｅ２により第２の仮想マシン（第１の仮想マシンの複製）を動作させてもよい。あるいは、実行単位Ｅ１により第１の仮想マシンを動作させるハイパーバイザが、他のハイパーバイザ上で、実行単位Ｅ２により第２の仮想マシン（第１の仮想マシンの複製）を動作させてもよい。その場合、他のプロセッサリソースが、プロセッサリソース２３ｃによる監視プロセスＰＭの実行を開始させることで、プロセッサリソース２３ｃの上記機能が発揮される。
【００４４】
監視対象アドレスは、アドレスＡでもよいし、アドレスＡ以外のアドレスでもよい。例えば、第１の実施の形態と同様に、監視対象アドレスは、アドレスＡから所定サイズ分だけずらしたアドレスでもよい。また、監視対象アドレスは１つでもよいし複数でもよい。また、監視対象アドレスは、アドレスＡから所定サイズ分だけずらしたアドレス（複数でもよい）を含んだ範囲としてもよい。
【００４５】
第２の実施の形態のエラー検出システム２０によれば、プロセッサリソース２３ａで実行されるプロセスＰ３がメモリ２１のアドレスＡに格納された情報を処理しようとして発生したエラーが検出される。すると、プロセッサリソース２３ａにより、プロセッサリソース２３ｂで実行されるプロセスＰ４の実行が停止される。また、プロセッサリソース２３ａによりプロセスＰ４がアクセスしたメモリ２１のアドレスＡ（監視対象アドレス）が取得される。プロセッサリソース２３ｃにより、メモリ２１に格納された情報およびプロセッサリソース２３ｂの状態を示す情報に基づいて、プロセッサリソース２３ｄでのプロセスＰ４の実行を再開させる。プロセッサリソース２３ｃにより、プロセスＰ４によりアドレスＡがアクセスされたことが検出されると、プロセスＰ４を実行していたモジュールの情報が取得される。
【００４６】
このように、当初エラーが検出されたプロセッサリソース２３ａ，２３ｂとは異なるプロセッサリソース２３ｃ，２３ｄを用いて、プロセスＰ４の実行の継続およびプロセスＰ４によるメモリアクセスの監視を行ってもよい。これにより、第１の実施の形態と同様に、メモリ２１のデータを不正に更新したプログラムモジュールの特定を支援できる。
【００４７】
また、実行単位Ｅ１ではプロセスＰ４の実行を継続させずに、実行単位Ｅ２を用いてプロセスＰ４の実行を継続させることで、実行単位Ｅ１で不正に処理が進行することを防げる。例えば、実行単位Ｅ１がユーザの業務処理に用いられている場合もある。この場合、実行単位Ｅ１でプロセスＰ４の実行を継続すると、メモリ２１上の不正なデータで業務処理が進行するおそれがある。すると、トランザクションの不整合やデータ破壊などの被害が拡大するおそれがあり好ましくない。そこで、実行単位Ｅ１ではプロセスＰ４の実行を継続させずに、実行単位Ｅ２によりプロセスＰ４の実行を継続する。このようにすれば、本番環境（実行単位Ｅ１）とは別個の調査用環境として実行単位Ｅ２を利用できるので、本番環境側で不正な処理が進行するのを抑え、ユーザのデータを保護できる。
【００４８】
［第３の実施の形態］
図３は、第３の実施の形態の情報処理システムを示す図である。第３の実施の形態の情報処理システムは、業務サーバ１００および端末装置２００を有する。業務サーバ１００および端末装置２００は、ネットワーク３０に接続されている。ネットワーク３０は、ＬＡＮ（Local Area Network）でもよいし、インターネットなどの広域ネットワークでもよい。
【００４９】
業務サーバ１００は、業務処理を実行するサーバコンピュータである。業務サーバ１００上では、複数の仮想的なコンピュータ（仮想マシン）を動作させることが可能である。業務サーバ１００で動作する複数の仮想マシンには、ユーザの業務処理に用いられる本番用の仮想マシンが含まれる。業務サーバ１００で動作する複数の仮想マシンには、本番用の仮想マシンでエラーが発生した際にエラー原因を調査するために用いられる調査用の仮想マシンが含まれる。業務サーバ１００は、本番用の仮想マシンでエラーが発生すると、本番用の仮想マシンと同じ状態の調査用の仮想マシンを動作させ、エラー原因を分析する。業務サーバ１００は、第１の実施の形態のエラー検出システム１０、および、第２の実施の形態のエラー検出システム２０の一例である。
【００５０】
端末装置２００は、ユーザが操作するクライアントコンピュータである。例えば、ユーザは、端末装置２００を操作することで、業務サーバ１００で動作する本番用の仮想マシンに、所定の業務処理の実行を指示できる。
【００５１】
図４は、第３の実施の形態の業務サーバのハードウェア例を示す図である。業務サーバ１００は、ＣＰＵ１０１、ＲＡＭ（Random Access Memory）１０２、ＨＤＤ（Hard Disk Drive）１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を有する。各ユニットは業務サーバ１００のバスに接続されている。上記のユニットは、業務サーバ１００内のバスに接続されている。
【００５２】
ＣＰＵ１０１は、プログラムの命令を実行する演算回路を含むプロセッサである。ＣＰＵ１０１は、ＨＤＤ１０３に記憶されているプログラムやデータの少なくとも一部をＲＡＭ１０２にロードし、プログラムを実行する。業務サーバ１００は、複数個のＣＰＵを備えてもよい。ＣＰＵ１０１は、第１の実施の形態のプロセッサ１２、および、第２の実施の形態のプロセッサ２３の一例である。
【００５３】
ＲＡＭ１０２は、業務サーバ１００の主記憶装置である。ＲＡＭ１０２は、ＣＰＵ１０１によるプログラムの実行に用いられるデータを一時的に記憶する。例えば、ＲＡＭ１０２は、オペレーティングシステム（ＯＳ：Operating System）やハイパーバイザのプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。業務サーバ１００は、複数個のＲＡＭを備えてもよい。ＲＡＭ１０２は、第１の実施の形態のメモリ１１、および、第２の実施の形態のメモリ２１，２２の一例である。
【００５４】
ＨＤＤ１０３は、業務サーバ１００の補助記憶装置である。ＨＤＤ１０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、ＯＳやハイパーバイザのプログラム、アプリケーションプログラム、および各種データを記憶する。業務サーバ１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００５５】
画像信号処理部１０４は、ＣＰＵ１０１からの命令に従って、業務サーバ１００に接続されたディスプレイ３１に画像を出力する。ディスプレイ３１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００５６】
入力信号処理部１０５は、業務サーバ１００に接続された入力デバイス３２から入力信号を取得し、ＣＰＵ１０１に出力する。入力デバイス３２としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００５７】
媒体リーダ１０６は、記録媒体３３に記録されたプログラムやデータを読み取る装置である。記録媒体３３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。また、記録媒体３３として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。媒体リーダ１０６は、例えば、ＣＰＵ１０１からの命令に従って、記録媒体３３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００５８】
通信インタフェース１０７は、ネットワーク３０に接続され、ネットワーク３０を介して端末装置２００などの他のコンピュータと通信を行うインタフェースである。通信インタフェース１０７は、ケーブルで通信装置と接続される有線通信インタフェースでもよいし、基地局と無線リンクで接続される無線通信インタフェースでもよい。
【００５９】
図５は、第３の実施の形態の仮想マシンの例を示す図である。業務サーバ１００は、ハードウェア層１１０、ハイパーバイザ１２０および仮想マシン１３０，１４０，１５０を含む。
【００６０】
ハードウェア層１１０は、ＣＰＵ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を含む物理的なリソースの集合である。
【００６１】
ハイパーバイザ１２０は、ハードウェア層１１０のリソースを用いて、仮想マシンを動作させる。ハイパーバイザ１２０は、ＣＰＵ１０１の処理能力やＲＡＭ１０２の記憶領域を、演算のリソースとして、仮想マシン１３０，１４０，１５０に割り当てる。ハイパーバイザ１２０は、仮想マシン１３０，１４０，１５０によるハードウェア層１１０へのアクセスを調停する。ハイパーバイザ１２０は、仮想マシンモニタ（ＶＭＭ：Virtual Machine Monitor）と呼ばれることもある。ハイパーバイザ１２０は、仮想マシン１３０，１４０，１５０に割り当てられるリソースとは別個に確保されたＣＰＵ１０１およびＲＡＭ１０２のリソースを用いて実行される。あるいは、業務サーバ１００は、ハイパーバイザ１２０を動作させるためにＣＰＵ１０１およびＲＡＭ１０２以外のＣＰＵおよびＲＡＭを有してもよい。
【００６２】
ハイパーバイザ１２０が仮想マシン１３０，１４０，１５０に割り当てるＣＰＵ１０１の処理能力の単位を仮想ＣＰＵと呼ぶことがある。例えば、ＣＰＵ１０１がマルチコアである場合は、１コアを１つの仮想ＣＰＵと考えることもできる。また、例えばＣＰＵ１０１の利用可能時間の１周期を時分割した場合の１つのタイムスライスを１つの仮想ＣＰＵと考えることもできる。ハイパーバイザ１２０は、仮想マシン１３０，１４０，１５０に複数の仮想ＣＰＵを割り当てることができる。例えば、ハイパーバイザ１２０は、仮想ＣＰＵ１１１，１１２，１１３を仮想マシン１４０に割り当てている。仮想ＣＰＵは、第１の実施の形態のプロセッサリソースの一例である。
【００６３】
また、ハイパーバイザ１２０が各仮想マシンに割り当てるＲＡＭ１０２の記憶領域を単にメモリと呼ぶこととする。メモリの割当量はＧＢ（Giga Bytes）など記憶領域のサイズで表せる。例えば、ハイパーバイザ１２０は、メモリ１１４を仮想マシン１４０に割り当てている。
【００６４】
仮想マシン１３０，１４０，１５０は、業務サーバ１００上で動作する仮想マシンである。仮想マシン１４０は、ユーザの業務処理に用いられる本番用の仮想マシンである。仮想マシン１５０は、仮想マシン１４０で発生したエラーの調査に用いられる調査用の仮想マシンである。なお、仮想マシンをＶＭ（Virtual Machine）と略記することがある。
【００６５】
仮想マシン１３０，１４０，１５０は、それぞれが独立にＯＳを実行する。ＯＳは、ソフトウェアによるメモリアクセス違反などのエラーを検出し、メモリダンプを取得する機能を有する。仮想マシン１３０，１４０，１５０は、ハイパーバイザ１２０が提供する論理的なバスによって互いに通信可能である。また、仮想マシン１４０上のソフトウェアがアクセス可能なデータに対して、仮想マシン１５０上のソフトウェアがアクセスできないよう、各ソフトウェアが利用するネットワークを分離できる。
【００６６】
仮想マシン１３０のＯＳが他の仮想マシンに対するリソースの割当量や他の仮想マシンによるデバイスアクセスを管理することもある。その場合、仮想マシン１３０のＯＳを、管理ＯＳと呼ぶことがある。これに対し、仮想マシン１４０，１５０のＯＳを、ゲストＯＳと呼ぶことがある。
【００６７】
ハイパーバイザ１２０は、仮想マシン１４０の複製を、業務サーバ１００上で動作させることができる。例えば、仮想マシン１５０が未だ作成されていない場合を考える。仮想マシン１４０は、管理ＯＳとして機能する仮想マシン１３０に、仮想マシン１４０の複製を動作させるよう通知する。すると、仮想マシン１３０は、仮想マシン１４０を複製する旨をハイパーバイザ１２０に通知する。
【００６８】
ハイパーバイザ１２０は、仮想マシン１４０と同じスペックの、３つの仮想ＣＰＵ１１１ａ，１１２ａ，１１３ａおよびメモリ１１４ａを仮想マシン１５０に割り当てる。そして、ハイパーバイザ１２０は、現在の仮想マシン１４０の複製である仮想マシン１５０を、業務サーバ１００上で動作させる。
【００６９】
このとき、ハイパーバイザ１２０は、仮想ＣＰＵ１１１，１１２，１１３がもつレジスタの情報やメモリ１１４の情報を、仮想ＣＰＵ１１１ａ，１１２ａ，１１３ａがもつレジスタ（ＲＡＭ１０２上の所定の記憶領域でもよい）やメモリ１１４ａに複製する。すなわち、ハイパーバイザ１２０は、仮想ＣＰＵ１１１，１１２，１１３のレジスタ状態やメモリ１１４の状態も、仮想ＣＰＵ１１１ａ，１１２ａ，１１３ａおよびメモリ１１４ａに反映させる。こうして、ハイパーバイザ１２０は、本番用の仮想マシン１４０の動作環境（ＯＳやアプリケーションなどのソフトウェアを実行するためのプロセスの状態を含む）を、調査用の仮想マシン１５０を用いて再現する。
【００７０】
図６は、第３の実施の形態の業務サーバの機能例を示す図である。前述のように、業務サーバ１００は、ハイパーバイザ１２０および仮想マシン１３０，１４０，１５０を有する（ただし、図６では仮想マシン１３０の図示を省略している）。更に、業務サーバ１００は、記憶部１６０，１７０を有する。
【００７１】
記憶部１６０は、仮想マシン１４０に対して割り当てられる記憶領域であり、ＲＡＭ１０２またはＨＤＤ１０３に確保された記憶領域として実装される。記憶部１７０は、仮想マシン１５０に対して割り当てられる記憶領域であり、ＲＡＭ１０２またはＨＤＤ１０３に確保された記憶領域として実装される。例えば、ハイパーバイザ１２０は、仮想マシン１４０に記憶部１６０を割り当て、仮想マシン１５０に記憶部１７０を割り当てる。仮想マシン１４０は、記憶部１７０に対するアクセスを制限される。仮想マシン１５０は、記憶部１６０に対するアクセスを制限される。
【００７２】
ハイパーバイザ１２０は、図５で例示したように、仮想マシン１４０の動作状態に関する情報を取得し、仮想マシン１４０の複製である仮想マシン１５０を業務サーバ１００上で動作させる。このとき、ハイパーバイザ１２０は、記憶部１６０に記憶された業務処理用のデータや、後述するメモリダンプおよび監視対象アドレスのデータも、記憶部１７０に複製する。
【００７３】
仮想マシン１４０は、アドレス決定部１４１および制御部１４２を有する。アドレス決定部１４１および制御部１４２は、例えば、ＣＰＵ１０１（仮想ＣＰＵ１１１，１１２，１１３の何れか）が実行するプログラムとして実装される。
【００７４】
アドレス決定部１４１は、仮想マシン１４０でメモリアクセス違反などのエラーが検出され、メモリダンプが取得されると、メモリダンプに基づいて、監視対象アドレスを決定する。監視対象アドレスは、仮想マシン１５０でのエラー調査に用いられるメモリアドレスである。仮想マシン１４０のＯＳは、エラーによりあるプロセスが異常終了すると、仮想マシン１４０に存在する他のプロセスを停止させて（他のプロセスを実行する仮想ＣＰＵを停止状態とした上で）メモリダンプを取得し、記憶部１６０に格納する。メモリダンプは、異常終了したプロセスがエラー時にアクセスしたメモリ１１４上のアドレスの情報を含む。
【００７５】
アドレス決定部１４１は、メモリダンプを参照して、異常終了したプロセスによりアクセスされたアドレスを取得し、取得したアドレスに応じて監視対象アドレスを決定する。アドレス決定部１４１は、記憶部１６０に監視対象アドレスを格納する。監視対象アドレスは、メモリダンプから取得したアドレスと同一のアドレスでもよいし、取得したアドレスとは異なるアドレスでもよい。例えば、取得したアドレスから所定サイズ分だけずらしたアドレスとしてもよい。アドレス決定部１４１は監視対象アドレスを複数決定してもよい。
【００７６】
制御部１４２は、仮想マシン１５０の実行開始をハイパーバイザ１２０に通知する。仮想マシン１３０を管理ＯＳとして利用する場合、制御部１４２は、管理ＯＳに、仮想マシン１５０の実行を通知してもよい。その場合は、管理ＯＳが、制御部１４２からの通知に応じて、仮想マシン１５０の実行開始をハイパーバイザ１２０に通知する。
【００７７】
なお、アドレス決定部１４１および制御部１４２は、エラーにより異常終了したプロセスを実行していた仮想ＣＰＵによって実現される。
仮想マシン１５０は、監視部１５１および入出力制御部１５２を有する。監視部１５１および入出力制御部１５２は、例えば、ＣＰＵ１０１（仮想ＣＰＵ１１１ａ，１１２ａ，１１３ａの何れか）が実行するプログラムとして実装される。
【００７８】
例えば、ハイパーバイザ１２０または制御部１４２は、仮想マシン１５０を作成後、仮想マシン１５０のＯＳに、監視部１５１および入出力制御部１５２のプログラムをメモリ１１４ａにロードして実行するよう指示する。すると、仮想マシン１５０上で監視部１５１および入出力制御部１５２のプログラムが実行され、監視部１５１および入出力制御部１５２の機能が発揮される。監視部１５１のプログラムの実行もプロセスとして管理されるので、監視部１５１を監視プロセスと呼ぶこともできる。
【００７９】
なお、仮想マシン１５０にもアドレス決定部１４１および制御部１４２のプログラムがインストールされた状態である。ただし、仮想マシン１５０での調査段階においては、アドレス決定部１４１および制御部１４２の機能は停止されていてもよい。
【００８０】
監視部１５１は、停止状態にあるプロセスの実行を仮想マシン１５０上で再開させる。仮想マシン１４０では、メモリダンプの取得時に、アドレス決定部１４１および制御部１４２を実行する仮想ＣＰＵ以外の仮想ＣＰＵが停止状態（ストール状態ということもある）になっている。仮想ＣＰＵの停止状態は、仮想マシン１５０にも反映される。このため、仮想マシン１４０の複製直後、仮想マシン１５０では、監視部１５１を実行中の仮想ＣＰＵ以外の仮想ＣＰＵも停止状態にある。監視部１５１は、停止状態にある仮想ＣＰＵの停止状態を解除することで、停止されていたプロセスの実行を再開させる。
【００８１】
監視部１５１は、記憶部１７０に記憶された監視対象アドレスに基づいて、仮想マシン１５０で実行されるプロセスの監視を行う。監視部１５１は、監視対象アドレスにアクセスしたプロセスを検出すると、プロセスに読み込まれていたプログラムモジュールの情報を取得する。監視部１５１は、例えば、ＯＳが提供する所定のＡＰＩ（Application Programming Interface）を用いて、該当のプロセスに読み込まれていたプログラムモジュールの情報を取得する。監視部１５１は、プログラムモジュールの情報を記憶部１７０に記憶されたメモリダンプに追加する。なお、監視対象のプロセスは、カーネルモードのプロセス（例えば、デバイスドライバ）でもよいし、ユーザモードのプロセス（例えば、業務アプリケーションのプロセス）でもよい。
【００８２】
入出力制御部１５２は、監視中に発生する入出力デバイスの処理をエミュレートする。例えば、実行を再開させたプロセスが入出力デバイスに関する処理を行う際に、該当の入出力デバイスが認識されていないと、ＩＯ（Input/Output）タイムアウトによるエラーが発生してしまうこともある。このため、入出力制御部１５２は、仮想マシン１４０で認識されていた入出力デバイスのデバイスドライバを用いて、当該入出力デバイスの処理をエミュレートし、調査中にＩＯタイムアウトによるエラーが発生しないよう制御する。ただし、調査におけるプロセスの監視期間が、調査開始からＩＯタイムアウトが発生するまでの時間よりも短い場合には、入出力制御部１５２の機能を用いなくてもよい。
【００８３】
監視部１５１および入出力制御部１５２のプログラムは、例えば、仮想マシン１４０に予めインストールされる。仮想マシン１４０の複製として仮想マシン１５０を動作させることで、監視部１５１および入出力制御部１５２のプログラムが、仮想マシン１５０にインストールされた状態となる。ただし、ハイパーバイザ１２０、仮想マシン１３０またはネットワーク３０に接続された所定のサーバコンピュータなどが、監視部１５１および入出力制御部１５２のプログラムを、仮想マシン１５０が作成された後に、仮想マシン１５０にインストールしてもよい。
【００８４】
図７は、第３の実施の形態の仮想マシン構成情報の例を示す図である。仮想マシン構成情報１６１は、仮想マシン１４０の状態を示す情報である。仮想マシン構成情報１６１は、記憶部１６０に格納される。仮想マシン構成情報１６１は、ハイパーバイザ１２０により複製されて、記憶部１７０にも格納される。
【００８５】
仮想マシン構成情報１６１は、例えば、メモリ１１４のメモリ状態および仮想ＣＰＵ１１１，１１２，１１３それぞれのレジスタ状態を示す情報を含む。また、仮想マシン構成情報１６１は、仮想ＨＤＤデータおよびハードウェア構成情報を含む。仮想ＨＤＤデータは、仮想マシン１４０が使用するＨＤＤ１０３の記憶領域のイメージデータである。ハードウェア構成情報は、仮想マシン１４０で利用されているネットワークアダプタなどの各種デバイスの設定内容を示す情報である。
【００８６】
ハイパーバイザ１２０は、仮想マシン構成情報１６１を用いて、仮想マシン１４０の状態を、仮想マシン１５０により再現できる。
次に、第３の実施の形態の処理手順を説明する。一例として、仮想ＣＰＵ１１１により実行されるプロセスで、メモリアクセス違反が発生するケースを例示する。
【００８７】
図８は、第３の実施の形態の処理例を示すシーケンス図である。以下、図８に示す処理をステップ番号に沿って説明する。なお、以下のステップＳ１１が開始される前の段階では、仮想マシン１５０は存在していない。
【００８８】
（Ｓ１１）ハイパーバイザまたはＯＳは、仮想ＣＰＵ１１１で実行中のプロセスでメモリアクセス違反のエラーが発生したことを検出し、該当のプロセスを強制的に停止させる（プロセスの異常終了）。
【００８９】
（Ｓ１２）ハイパーバイザまたはＯＳは、仮想ＣＰＵ１１２，１１３を停止状態に移行させ（ストール状態とする）、実行中のプロセスの状態を保存し、プロセスの実行を停止する。
【００９０】
（Ｓ１３）ハイパーバイザまたはＯＳは、ＯＳのバグチェック機能によりメモリダンプを生成し、記憶部１６０に格納する。メモリダンプは、異常終了したプロセスがアクセスしたメモリ１１４のアドレスの情報を含む。ステップＳ１１で実行中であったプロセスとは別の制御プロセスが実行される仮想ＣＰＵ１１１は、異常終了したプロセスがアクセスしたアドレスの情報をメモリダンプから取得する。仮想ＣＰＵ１１１は、取得したアドレスに基づいて監視対象アドレスを決定する。仮想ＣＰＵ１１１は、決定した監視対象アドレスを記憶部１６０に格納する。
【００９１】
（Ｓ１４）仮想ＣＰＵ１１１は、調査用の仮想マシン１５０の作成をハイパーバイザ１２０に指示する。仮想ＣＰＵ１１１は、管理ＯＳを介して、ハイパーバイザ１２０に調査用の仮想マシン１５０の作成を指示してもよい。なお、ハイパーバイザ１２０は、仮想ＣＰＵ１１１，１１２，１１３とは異なるプロセッサリソースにより実行されている（図示を省略している）。すると、ハイパーバイザ１２０により、仮想ＣＰＵ１１１ａ，１１２ａ，１１３ａおよびメモリ１１４ａが仮想マシン１５０に割り当てられ、仮想マシン構成情報１６１に基づいて仮想マシン１４０の状態が仮想マシン１５０により再現される。具体的には、仮想ＣＰＵ１１１の状態が仮想ＣＰＵ１１１ａにより再現され、仮想ＣＰＵ１１２の状態が仮想ＣＰＵ１１２ａにより再現され、仮想ＣＰＵ１１３の状態が仮想ＣＰＵ１１３ａにより再現される。このとき、ステップＳ１３で取得されたメモリダンプや監視対象アドレスの情報も記憶部１７０に複製されることになる。
【００９２】
（Ｓ１５）仮想ＣＰＵ１１１は、システムリセット処理を実行する。具体的には、仮想ＣＰＵ１１１は、仮想マシン１４０をシャットダウンまたはリブートさせる。
（Ｓ１６）仮想ＣＰＵ１１１ａは、監視部１５１としての動作を開始し、他のプロセスによるメモリアクセスの監視準備を行う。具体的には、仮想ＣＰＵ１１１ａは、仮想ＣＰＵ１１２ａ，１１３ａで実行されるプロセスが監視対象アドレスにアクセスした際に、ハイパーバイザまたはＯＳにより割り込みを発生させ、仮想ＣＰＵ１１１ａに通知するように仮想ＣＰＵ１１２ａ，１１３ａを設定する。例えば、仮想ＣＰＵ１１１ａは、仮想ＣＰＵ１１２ａ，１１３ａのデバッグ用のレジスタ（デバッグレジスタと呼ばれることもある）の情報として監視対象アドレスを、仮想ＣＰＵ１１２ａ，１１３ａに設定する。ここで、仮想ＣＰＵ１１１ａは、例えば、内部バスを通じて、監視部１５１のプログラムの実行開始の指示を仮想ＣＰＵ１１１から受け付けたことを契機に、監視部１５１の監視機能を発揮する。この場合、仮想ＣＰＵ１１１は、ステップＳ１５のシステムリセット処理を実行する前に、監視部１５１のプログラムの実行開始の指示を仮想ＣＰＵ１１１ａに送る。あるいは、仮想ＣＰＵ１１１ａはハイパーバイザ１２０や管理ＯＳなどから、監視部１５１のプログラムの実行開始の指示を受け付けてもよい。
【００９３】
（Ｓ１７）仮想ＣＰＵ１１１ａは、仮想ＣＰＵ１１２ａ，１１３ａの停止状態を解除する。すると、仮想ＣＰＵ１１２ａ，１１３ａは、停止されていたプロセスの実行を再開する。仮想ＣＰＵ１１１ａは、仮想ＣＰＵ１１２ａ，１１３ａの停止状態を解除した時点（監視開始時点）からの経過時間の計測を開始する。
【００９４】
（Ｓ１８）ハイパーバイザまたはＯＳは、仮想ＣＰＵ１１３ａにおいて実行中のプロセスによる監視対象アドレスへのメモリアクセスを検出すると、割り込みを発生させ、仮想ＣＰＵ１１１ａに通知する。
【００９５】
（Ｓ１９）仮想ＣＰＵ１１１ａは、割り込みが通知されると、仮想ＣＰＵ１１３ａにより実行中のプロセスに読み込まれているプログラムモジュールの情報を取得し、記憶部１７０に格納する。プログラムモジュールの情報は、例えば、モジュール名、実行された命令を含むモジュール内の関数および実行された命令が格納されたメモリ１１４ａ上のアドレス（該当の関数のアドレスからのオフセット位置など）を含む。
【００９６】
（Ｓ２０）ハイパーバイザまたはＯＳは、仮想ＣＰＵ１１２ａにおいて実行中のプロセスによる監視対象アドレスへのメモリアクセスを検出すると、割り込みを発生させ、仮想ＣＰＵ１１１ａに通知する。
【００９７】
（Ｓ２１）仮想ＣＰＵ１１１ａは、割り込みが通知されると、仮想ＣＰＵ１１２ａにより実行中のプロセスに読み込まれているプログラムモジュールの情報を取得し、記憶部１７０に格納する。
【００９８】
（Ｓ２２）仮想ＣＰＵ１１１ａは、監視開始からの経過時間が所定時間に達すると監視を終了し、監視期間中に取得されたプログラムモジュールの情報を、記憶部１７０に記憶されたメモリダンプに追加する。そして、仮想マシン１５０による調査が終了する。
【００９９】
監視期間の長さは、例えば、仮想ＣＰＵによる処理の１ステップ当たりの処理時間に応じて予め定められる。具体的には、監視期間の長さは、仮想ＣＰＵのストール解除後、数千ステップ程度が実行される期間とすることが好ましい。データ破壊を行った可能性のより高いプログラムモジュールを捕捉可能だからである。また、数千ステップ程度であれば、ＩＯタイムアウトのエラー（監視開始から数万ステップ程度後に発生し得る）が発生する前に調査を終えることができる（この場合、入出力制御部１５２の機能を用いなくてもよい）。ただし、より長い監視期間での監視を行う場合には、仮想マシン１５０でＩＯタイムアウトのエラーが発生するおそれがあるため、仮想ＣＰＵ１１１ａは、入出力制御部１５２の機能により、ＩＯタイムアウトによるエラー発生を抑制する。これにより、ＩＯタイムアウトのエラーによって調査が中断されるのを防げる。
【０１００】
なお、ステップＳ１４において、ハイパーバイザ１２０は、次のようにして仮想マシン１５０を動作させる。（１）ハイパーバイザ１２０は、仮想マシン１５０を動作させるために、仮想ＣＰＵ１１１ａ，１１２ａ，１１３ａおよびメモリ１１４ａを割り当てる。（２）ハイパーバイザ１２０は、仮想マシン１４０の仮想マシン構成情報１６１を複製して記憶部１７０に格納し、複製した仮想マシン構成情報に基づいて仮想マシン１４０の状態を反映させた仮想マシン１５０の起動を開始する。
【０１０１】
前述のように、仮想マシン構成情報１６１には、仮想マシン１４０が利用する記憶装置のイメージが含まれる。このため、メモリダンプや監視対象アドレスの情報なども、仮想マシン１５０からアクセス可能な記憶領域に複製されることになる。仮想ＣＰＵ１１１ａは、当該記憶領域にアクセスすることで、メモリダンプや監視対象アドレスの情報を読み出せる。
【０１０２】
次に、仮想マシン１４０，１５０の処理手順を説明する。まず、本番用の仮想マシン１４０の処理手順を例示する。
図９は、第３の実施の形態の本番用ＶＭの処理例を示すフローチャートである。以下、図９に示す処理をステップ番号に沿って説明する。図８で例示したように、仮想ＣＰＵ１１１のプロセスがエラーにより異常終了した場合、アドレス決定部１４１および制御部１４２は、仮想ＣＰＵ１１１が所定のプログラムを実行することで実現される。このとき、仮想ＣＰＵ１１１により、仮想ＣＰＵ１１２，１１３は停止状態とされ、メモリダンプが取得される。
【０１０３】
（Ｓ３１）アドレス決定部１４１は、異常終了したプロセスによってアクセスされたアドレスを、メモリダンプから取得し、取得したアドレスに応じた監視対象アドレスを決定する。アドレス決定部１４１は、メモリダンプから取得したアドレスと同一のアドレスを監視対象アドレスとする。アドレス決定部１４１は、前述のように、取得したアドレスとは異なるアドレスを監視対象アドレスとしてもよい。アドレス決定部１４１は、監視対象アドレスを複数決定してもよい。異常終了したプロセスによってアクセスされたアドレスを含む所定のアドレス範囲に含まれるアドレスを監視対象アドレスと決定してもよい。アドレス決定部１４１は、決定した監視対象アドレスを記憶部１６０に格納する。
【０１０４】
（Ｓ３２）制御部１４２は、調査用の仮想マシン１５０の作成をハイパーバイザ１２０に指示する。制御部１４２は、調査用の仮想マシン１５０の作成を管理ＯＳに通知してもよい。その場合、管理ＯＳが、調査用の仮想マシン１５０の作成をハイパーバイザ１２０に指示する。
【０１０５】
（Ｓ３３）制御部１４２は、システムリセット処理を実行する。具体的には、仮想ＣＰＵ１１１は、仮想マシン１４０をシャットダウンまたはリブートさせる。仮想マシン１４０をリブートさせれば、リブート完了後、仮想マシン１４０を再び業務処理に用いることができる。
【０１０６】
図１０は、第３の実施の形態の調査用ＶＭの処理例を示すフローチャートである。以下、図１０に示す処理をステップ番号に沿って説明する。図８で例示したように、仮想ＣＰＵ１１１のプロセスがエラーにより異常終了した場合、監視部１５１は、仮想ＣＰＵ１１１に対応する仮想ＣＰＵ１１１ａが所定のプログラムを実行することで実現される。
【０１０７】
（Ｓ４１）監視部１５１は、監視対象アドレスへのアクセス時に、割り込みが発生するように仮想ＣＰＵ１１２ａ，１１３ａを設定する。
（Ｓ４２）監視部１５１は、仮想ＣＰＵ１１２ａ，１１３ａの停止状態を解除する。仮想ＣＰＵ１１２ａ，１１３ａは、実行を停止していたプロセスの実行を再開する。監視部１５１は、経過時間の計測を開始する。
【０１０８】
（Ｓ４３）監視部１５１は、割り込みの発生により、仮想ＣＰＵ１１２ａ，１１３ａで実行されるプロセスにより監視対象アドレスがアクセスされたことを検出する。すると、監視部１５１は、該当のプロセスのプログラムモジュールの情報を取得し、記憶部１７０に格納する。監視対象アドレスが複数のプロセスによってアクセスされることもある。その場合、監視部１５１は、複数のプロセスそれぞれによるアクセスを検出するたびに、該当のプロセスのプログラムモジュールの情報を取得し、記憶部１７０に格納する。
【０１０９】
（Ｓ４４）監視部１５１は、経過時間が所定時間に達すると、監視期間の終了を検出する。
（Ｓ４５）監視部１５１は、ステップＳ４３で取得したプログラムモジュールの情報を記憶部１７０に記憶されたメモリダンプに追加する。
【０１１０】
このようにして、業務サーバ１００は、データを破壊したプログラムモジュールの特定を支援できる。例えば、監視部１５１は、ステップＳ４３において、監視対象アドレスにアクセスしたプログラムモジュールのモジュール名「Ｆｏｏｄｒｖ．ｓｙｓ」や、モジュール内の関数およびオフセット「ＳｅｔＢａｒＶａｌｕｅ（）＋８ｃ」という情報を記録する。「ＳｅｔＢａｒＶａｌｕｅ（）」は、モジュール内の関数名である。「８ｃ」は、関数「ＳｅｔＢａｒＶａｌｕｅ（）」の先頭アドレスからのオフセットを示す。システムの管理者または開発者は、メモリダンプに追加されたこれらの情報を参照して、修正対象のプログラムモジュールの特定に役立てることができる。
【０１１１】
また、例えば、図８において、メモリダンプの取得後に、仮想ＣＰＵ１１１を用いて、仮想ＣＰＵ１１２，１１３によるプロセスの実行を再開させ、プロセスによるメモリアクセスを監視してもよい。ただし、データが破壊された状態でプロセスを再開させると、トランザクションの不整合が発生したり、ユーザの業務に用いられるデータが更に破壊されたりして、エラーによる障害が拡大する可能性がある。そこで、本番用の仮想マシン１４０の代わりに、本番用の処理に用いられるネットワークにはアクセスできない調査用の仮想マシン１５０を用いてエラー原因の調査を行うことで、本番環境に与える影響を抑えられる。
【０１１２】
図１１は、第３の実施の形態の業務サーバの他のハードウェア例を示す図である。前述のように、業務サーバ１００は、複数のＣＰＵおよびＲＡＭを有してもよい。例えば、業務サーバ１００は、ＣＰＵ群Ｇ１、ＲＡＭ群Ｇ２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を有してもよい。図４で例示したユニットと同一のユニットについては、同一名称・符号を用いて示している。
【０１１３】
ＣＰＵ群Ｇ１は、ＣＰＵ１０１，１０１ａ，１０１ｂ，１０１ｃ，・・・を含む。ＣＰＵ群Ｇ１は、第１の実施の形態で例示した複数のプロセッサ、および、第２の実施の形態で例示した複数のプロセッサの一例である。ＲＡＭ群Ｇ２は、ＲＡＭ１０２，１０２ａ，１０２ｂ，１０２ｃ，・・・を含む。例えば、ハイパーバイザや仮想マシンを動作させるためのリソースとして、ＣＰＵ群Ｇ１およびＲＡＭ群Ｇ２に含まれるＣＰＵおよびＲＡＭを用いることができる。例えば、ハイパーバイザ１２０を動作させるためにＣＰＵ１０１およびＲＡＭ１０２を割り当ててもよい。仮想マシン１４０に３つのＣＰＵ１０１ａ，１０１ｂ，１０１ｃおよびＲＡＭ１０２ａを割り当て、仮想マシン１５０に他の３つの物理的なＣＰＵおよびＲＡＭ１０２ｂを割り当ててもよい。
【０１１４】
すると、前述の仮想ＣＰＵ１１１，１１２，１１３の処理を、仮想マシン１４０に割り当てられたＣＰＵ１０１ａ，１０１ｂ，１０１ｃの処理として置き換えることができる。また、仮想ＣＰＵ１１１ａ，１１２ａ，１１３ａの処理を、仮想マシン１５０に割り当てられた３つの物理的なＣＰＵの処理として置き換えることができる。
【０１１５】
この場合、ＣＰＵ１０１，１０１ａ，１０１ｂ，１０１ｃ，・・・それぞれは、プロセッサリソースの一例である。例えば、ＣＰＵ１０１を１つのプロセッサリソースということができる。また、ＣＰＵ１０１ａを１つのプロセッサリソースということができる。ＣＰＵ１０１ｂ，１０１ｃ，・・・も同様である。
【０１１６】
［第４の実施の形態］
次に、第４の実施の形態を説明する。前述の第３の実施の形態と相違する事項を主に説明し、共通する事項の説明を省略する。
【０１１７】
第３の実施の形態では、調査用の仮想マシン１５０を業務サーバ１００上で動作させるものとした。一方、調査用の仮想マシンを他のサーバコンピュータ上で動作させてもよい。第４の実施の形態では、調査用の仮想マシンを動作させる他のサーバコンピュータを更に設ける点が、第３の実施の形態と異なる。
【０１１８】
図１２は、第４の実施の形態の情報処理システムの例を示す図である。第４の実施の形態の情報処理システムは、業務サーバ１００、端末装置２００および検証サーバ３００を有する。業務サーバ１００および端末装置２００は、ネットワーク３０に接続されている。業務サーバ１００は、管理用ネットワーク４０にも接続されている。検証サーバ３００は、管理用ネットワーク４０に接続されている。管理用ネットワーク４０は、例えば、情報処理システムの管理用に設けられたＬＡＮである。
【０１１９】
業務サーバ１００および端末装置２００は、第３の実施の形態で説明した業務サーバ１００および端末装置２００と同様である。業務サーバ１００は、ユーザの業務処理に用いられる本番用の仮想マシンを実行するが、調査用の仮想マシンを実行しなくてもよい。
【０１２０】
検証サーバ３００は、調査用の仮想マシンを動作させるためのサーバコンピュータである。検証サーバ３００上では、業務サーバ１００と同様に、複数の仮想マシンを動作させることが可能である。検証サーバ３００で動作する複数の仮想マシンには、本番用の仮想マシンで発生したエラーの原因を調査するために用いられる調査用の仮想マシンが含まれる。検証サーバ３００は、図４で例示した業務サーバ１００と同様のハードウェアを用いて実現できる。
【０１２１】
図１３は、第４の実施の形態の仮想マシンの例を示す図である。業務サーバ１００は、ハードウェア層１１０、ハイパーバイザ１２０および仮想マシン１３０，１４０を含む。
検証サーバ３００は、ハードウェア層３１０、ハイパーバイザ３２０および仮想マシン３３０を含む。ハードウェア層３１０は、検証サーバ３００が備えるＣＰＵ、ＲＡＭ、ＨＤＤ、画像信号処理部、入力信号処理部、媒体リーダおよび通信インタフェースを含む物理的なリソースの集合である。
【０１２２】
ハイパーバイザ３２０は、ハードウェア層３１０のリソースを用いて仮想マシン３３０を動作させる。仮想マシン３３０は、検証サーバ３００上で動作する調査用の仮想マシンである。ハイパーバイザ１２０，３２０は、管理用ネットワーク４０を介して通信し、仮想マシン１４０の複製である仮想マシン３３０を、検証サーバ３００上で動作させることができる。
【０１２３】
具体的には、ハイパーバイザ１２０は、仮想マシン構成情報１６１を複製し、ハイパーバイザ３２０に送信する。ハイパーバイザ３２０は、仮想マシン構成情報１６１を受信する。ハイパーバイザ３２０は、仮想マシン構成情報１６１に基づいて、仮想ＣＰＵ１１１，１１２，１１３およびメモリ１１４と同じスペックの仮想ＣＰＵ３１１，３１２，３１３およびメモリ３１４を仮想マシン３３０に割り当てる。ハイパーバイザ３２０は、仮想マシン構成情報１６１に基づいて、仮想マシン１４０の状態を仮想マシン３３０により再現する。
【０１２４】
このように、調査用の仮想マシン１５０を業務サーバ１００上で動作させる代わりに、調査用の仮想マシン３３０を検証サーバ３００上で動作させることもできる。仮想マシン３３０は、仮想マシン１５０と同様に、監視部１５１や入出力制御部１５２の機能を有し、仮想マシン１４０でエラーが発生したときのエラー原因の調査に用いることができる。
【０１２５】
例えば、図８のシーケンスは、仮想ＣＰＵ１１１ａを仮想ＣＰＵ３１１に、仮想ＣＰＵ１１２ａを仮想ＣＰＵ３１２に、仮想ＣＰＵ１１３ａを仮想ＣＰＵ３１３に、それぞれ置き換えて説明することができる。ただし、ステップＳ１４に相当する処理では、ハイパーバイザ１２０は、調査用の仮想マシン３３０の作成指示および仮想マシン構成情報１６１を、ハイパーバイザ３２０に送信することになる。ハイパーバイザ３２０は、これらの情報をハイパーバイザ１２０から受信すると、仮想マシン構成情報１６１に基づいて、仮想マシン３３０を動作させる。また、ハイパーバイザ３２０は、仮想マシン３３０に調査開始の指示を通知し、仮想ＣＰＵ３１１によるプロセスの監視を開始させる（監視部のプログラムの実行を開始させる）。検証サーバ３００上で仮想マシン３３０が作成された後は、図８におけるステップＳ１６以降の流れと同様である。
【０１２６】
このように、業務サーバ１００とは別個に検証サーバ３００を設け、検証サーバ３００上で、調査用の仮想マシン３３０を動作させてもよい。業務サーバ１００で調査を行わなくてもよいため、業務サーバ１００の負荷を抑えられる。また、検証サーバ３００は、本番用の環境（データやネットワークなど）へはアクセスできないので、より安全にエラー原因の調査作業を行える。
【０１２７】
第４の実施の形態では、仮想マシン１４０，３３０に割り当てられるプロセッサリソースとして仮想ＣＰＵを例示したが、物理ＣＰＵでもよい。例えば、仮想ＣＰＵ１１１，１１２，１１３の代わりに３つの物理ＣＰＵを仮想マシン１４０に割り当ててもよい。仮想ＣＰＵ３１１，３１２，３１３の代わりに３つの物理ＣＰＵを仮想マシン３３０に割り当ててもよい。
【０１２８】
なお、第１の実施の形態の情報処理は、プロセッサリソース１２ａにプログラムを実行させることで実現できる。第２の実施の形態の情報処理は、プロセッサリソース２３ａ，２３ｃにプログラムを実行させることで実現できる。第３の実施の形態の情報処理は、ＣＰＵ１０１にプログラムを実行させることで実現できる。第４の実施の形態の情報処理は、業務サーバ１００が有するＣＰＵ１０１および検証サーバ３００が有するＣＰＵにプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体３３に記録できる。
【０１２９】
例えば、プログラムを記録した記録媒体３３を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体３３に記録されたプログラムまたは他のコンピュータから受信したプログラムを、ＲＡＭ１０２やＨＤＤ１０３などの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【０１３０】
以上の第１〜第４の実施の形態を含む実施形態に関し、更に以下の付記を開示する。
（付記１）  メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有し、
第１のプロセッサリソースが、
前記第１のプロセッサリソースにより実行される第１のプロセスが前記メモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、前記第１のプロセスによりアクセスされた前記アドレスである監視対象アドレスを取得し、
第２のプロセスにより前記監視対象アドレスがアクセスされたことを検出すると、前記第２のプロセスを実行していたモジュールの情報を取得する、
エラー検出システム。
【０１３１】
（付記２）  前記第１のプロセッサリソースは、前記エラーの発生後、第２のプロセッサリソースによる前記第２のプロセスの実行が停止されても再開させる、付記１記載のエラー検出システム。
【０１３２】
（付記３）  前記第１のプロセッサリソースは、前記エラーの発生後、メモリダンプを取得する際に、前記第２のプロセッサリソースによる前記第２のプロセスの実行を停止させ、前記メモリダンプの取得が終了すると、前記第２のプロセッサリソースによる前記第２のプロセスの実行を再開させる、付記２記載のエラー検出システム。
【０１３３】
（付記４）  前記第１のプロセッサリソースは、取得した前記モジュール情報を前記メモリダンプに追加する、付記３記載のエラー検出システム。
（付記５）  前記エラーは、前記第１のプロセスによるアクセスが許可されていない禁止アドレスへのアクセスが検出されたことで発生するメモリアクセス違反であり、
前記監視対象アドレスは、前記第１のプロセスに前記禁止アドレスへアクセスする情報が格納された記憶領域を示すアドレスである、
付記１乃至４の何れか１つに記載のエラー検出システム。
【０１３４】
（付記６）  前記第２のプロセスは、前記エラーの検出時に前記第２のプロセッサリソース（１２ｂ）により実行されているプロセスである、付記１乃至５の何れか１つに記載のエラー検出システム。
【０１３５】
（付記７）  前記第１のプロセッサリソースは、前記監視対象アドレスを含む所定のアドレス範囲内の何れかのアドレスが前記第２のプロセスによりアクセスされたことを検出すると、前記モジュールの情報を取得する、付記１乃至６の何れか１つに記載のエラー検出システム。
【０１３６】
（付記８）  メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有し、
第１のプロセッサリソースが、前記第１のプロセッサリソースにより実行される第１のプロセスが前記メモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、第２のプロセッサリソースによる第２のプロセスの実行を停止させ、前記第１のプロセスによりアクセスされた前記アドレスである監視対象アドレスを取得し、
第３のプロセッサリソースが、前記メモリに格納された情報および前記第２のプロセッサリソースの状態を示す情報に基づいて第４のプロセッサリソースにより前記第２のプロセスの実行を再開させ、前記第２のプロセスにより前記監視対象アドレスがアクセスされたことを検出すると、前記第２のプロセスを実行していたモジュールの情報を取得する、
エラー検出システム。
【０１３７】
（付記９）  前記第１および前記第２のプロセッサリソースは、第１のデータにアクセス可能であり、
前記第３および前記第４のプロセッサリソースは、前記第１のデータにアクセス不可であり、前記第１のデータを複製した第２のデータにアクセス可能である、
付記８記載のエラー検出システム。
【０１３８】
（付記１０）  前記第２のデータは、前記第１のプロセッサリソースにより前記エラー後に取得され前記第１のデータに追加されたメモリダンプを含み、
前記第３のプロセッサリソースは、前記第２のデータに含まれる前記メモリダンプに、前記モジュールの情報を追加する、
付記９記載のエラー検出システム。
【０１３９】
（付記１１）  前記エラーは、前記第１のプロセスによるアクセスが許可されていない禁止アドレスへのアクセスが検出されたことで発生するメモリアクセス違反であり、
前記監視対象アドレスは、前記第１のプロセスに前記禁止アドレスをアクセスする情報が格納されたアドレスである、
付記８乃至１０の何れか１つに記載のエラー検出システム。
【０１４０】
（付記１２）  メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有するシステムのエラー検出方法であって、
第１のプロセッサリソースが、
前記第１のプロセッサリソースにより実行される第１のプロセスが前記メモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、前記第１のプロセスによりアクセスされた前記アドレスである監視対象アドレスを取得し、
第２のプロセスにより前記監視対象アドレスがアクセスされたことを検出すると、前記第２のプロセスを実行していたモジュールの情報を取得する、
エラー検出方法。
【０１４１】
（付記１３）  メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有するシステムのエラー検出方法であって、
第１のプロセッサリソースが、前記第１のプロセッサリソースにより実行される第１のプロセスが前記メモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、第２のプロセッサリソースによる第２のプロセスの実行を停止させ、前記第１のプロセスによりアクセスされた前記アドレスである監視対象アドレスを取得し、
第３のプロセッサリソースが、前記メモリに格納された情報および前記第２のプロセッサリソースの状態を示す情報に基づいて、第４のプロセッサリソースにより前記第２のプロセスの実行を再開させ、前記第２のプロセスにより前記監視対象アドレスがアクセスされたことを検出すると、前記第２のプロセスを実行していたモジュールの情報を取得する、
エラー検出方法。
【０１４２】
（付記１４）  メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有する第１コンピュータに、
第１のプロセッサリソースにより実行される第１のプロセスが前記メモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、第２のプロセッサリソースによる第２のプロセスの実行を停止させ、前記第１のプロセスによりアクセスされた前記アドレスである監視対象アドレスを取得し、
前記メモリに格納された第１の情報および前記第２のプロセッサリソースの状態を示す第２の情報に基づいて前記第２のプロセスの実行を再開し前記第２のプロセスによるメモリアクセスを監視する第２コンピュータに、前記第１の情報と前記第２の情報と前記監視対象アドレスとを送信する、
処理を実行させるエラー検出プログラム。
【０１４３】
（付記１５）  メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有する、第１コンピュータと通信する第２コンピュータに、
第１のプロセッサリソースにより実行される第１のプロセスが前記メモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーが検出されたときに前記第１のプロセスがアクセスした前記アドレスである監視対象アドレスと、前記エラー時の前記メモリに格納された第１の情報と、前記エラー時に実行が停止された第２のプロセスを実行していた第２のプロセッサリソースの状態を示す第２の情報と、を前記第１コンピュータから取得し、
前記第１の情報および前記第２の情報に基づいて前記第２のプロセスの実行を再開し、
前記第２のプロセスにより前記監視対象アドレスがアクセスされたことを検出すると、前記第２のプロセスを実行していたモジュールの情報を取得する、
処理を実行させるエラー検出プログラム。
【０１４４】
（付記１６）  メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有するコンピュータに、
第１のプロセッサリソースにより実行される第１のプロセスが前記メモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、前記第１のプロセスによりアクセスされた前記アドレスである監視対象アドレスを取得し、
第２のプロセスにより前記監視対象アドレスがアクセスされたことを検出すると、前記第２のプロセスを実行していたモジュールの情報を取得する、
処理を実行させるエラー検出プログラム。
【０１４５】
（付記１７）  メモリと複数のプロセッサリソースを含む１以上のプロセッサとを有するコンピュータに、
第１のプロセッサリソースにより実行される第１のプロセスが前記メモリの何れかのアドレスに格納された情報を処理しようとして発生したエラーを検出すると、第２のプロセッサリソースによる第２のプロセスの実行を停止させ、前記第１のプロセスによりアクセスされた前記アドレスである監視対象アドレスを取得し、
第３のプロセッサリソースにより、前記メモリに格納された情報および前記第２のプロセッサリソースの状態を示す情報に基づいて前記第２のプロセスの実行を第４のプロセッサリソースを用いて再開させ、
前記第２のプロセスにより前記監視対象アドレスがアクセスされたことを検出すると前記第２のプロセスを実行していたモジュールの情報を取得する、
処理を実行させるエラー検出プログラム。
【符号の説明】
【０１４６】
１０  エラー検出システム
１１  メモリ
１２  プロセッサ
１２ａ，１２ｂ  プロセッサリソース
Ｐ１，Ｐ２  プロセス
ＰＭ  監視プロセス
【図１】
2016076152.tif 000003
【図２】
2016076152.tif 000004
【図３】
2016076152.tif 000005
【図４】
2016076152.tif 000006
【図５】
2016076152.tif 000007
【図６】
2016076152.tif 000008
【図７】
2016076152.tif 000009
【図８】
2016076152.tif 000010
【図９】
2016076152.tif 000011
【図１０】
2016076152.tif 000012
【図１１】
2016076152.tif 000013
【図１２】
2016076152.tif 000014
【図１３】
2016076152.tif 000015