(57)【特許請求の範囲】
【請求項１】
自計算機において命令が実行される毎に、実行された命令が書き込まれ、自計算機に障害が発生したとき、命令の書き込みを禁止する命令列記憶部と、
前記命令列記憶部に格納されている命令に基づいて、前記障害を再現するための障害再現部を含んだ障害再現プログラムを生成するプログラム生成部と、
該プログラム生成部で生成された障害再現プログラムを起動するブートローダとを備えたことを特徴とする計算機。
【請求項２】
請求項１記載の計算機において、
自計算機において命令が実行される毎に、実行された命令に関連する関連データが書き込まれ、自計算機に障害が発生したとき、関連データの書き込みを禁止するデータ列記憶部を備え、且つ、
前記障害再現プログラムが、前記障害再現部に加えて、自計算機のレジスタおよび主記憶装置の状態を障害発生前の状態に戻すための状態復元部を含み、
前記プログラム生成部が、前記データ列記憶部に格納されている関連データに基づいて、前記状態復元部を生成することを特徴とする計算機。
【請求項３】
請求項１または２記載の計算機において、
前記障害再現部は、前記命令列記憶部に格納されている命令を、実行順が古いものから順番に配置することにより構成されることを特徴とする計算機。
【請求項４】
請求項２または３記載の計算機において、
前記データ列記憶部が、自計算機で実行された命令が更新および参照しているレジスタおよび主記憶装置に関するデータであって、更新および参照している値と更新および参照位置とを含んだデータの内の一部のデータを関連データとして記憶し、
前記プログラム生成部が、前記命令列記憶部に格納されている命令と、前記データ列記憶部に格納されている関連データとに基づいて、前記命令列記憶部に格納されている命令によって更新および参照対象にされているレジスタおよび主記憶装置の内、前記データ列記憶部に格納されている関連データによって値が特定できるものについては、その値を書き戻す書き戻し命令を生成し、特定できないものについては、その値を推測して推測したデータを書き戻す書き戻し命令を生成し、該生成した書き戻し命令を、実行順が古い命令に対応するものから順番に前記状態復元部に配置することを特徴とする計算機。
【請求項５】
請求項４記載の計算機において、
レジスタの値が一意に確定しているか否かを表示する、レジスタ毎の一意フラグを備え、
前記プログラム生成部が、推測した値を書き戻す書き戻し命令の書き戻し先が、一意フラグによって値が一意に確定していることが表示されているレジスタである場合は、前記書き戻し命令を前記状態復元部に配置しないことを特徴とする計算機。
【請求項６】
自計算機において命令が実行される毎に、実行された命令を命令列記憶部に書き込む第１のステップと、
自計算機において障害が発生したとき、前記命令列記憶部に対する命令の書き込みを禁止する第２のステップと、
前記命令列記憶部に格納されている命令に基づいて、前記障害を再現するための障害再現部を含んだ障害再現プログラムを生成する第３のステップと、
該第３のステップで生成された障害再現プログラムをブートローダにより起動する第４のステップとを含むことを特徴とする障害再現方法。
【請求項７】
請求項６記載の障害再現方法において、
自計算機において命令が実行される毎に、実行された命令に関する関連データをデータ列記憶部に書き込む第５のステップと、
自計算機において障害が発生したとき、前記データ列記憶部に対する関連データの書き込みを禁止する第６のステップとを含み、且つ、
前記障害再現プログラムが、前記障害再現部に加えて、自計算機のレジスタおよび主記憶装置の状態を障害発生前の状態に戻すための状態復元部を含み、
前記第３のステップが、前記データ列記憶部に格納されている関連データに基づいて、前記状態復元部を生成することを特徴とする障害再現方法。
【請求項８】
請求項６または７記載の障害再現方法において、
前記障害再現部は、前記命令列記憶部に格納されている命令を、実行順が古いものから順番に配置することにより構成されることを特徴とする障害再現方法。
【請求項９】
請求項７または８記載の障害再現方法において、
前記第５のステップでは、自計算機で実行された命令が更新および参照しているレジスタおよび主記憶装置に関するデータであって、更新および参照している値と更新および参照位置とを含んだデータの内の一部のデータを関連データとして記憶し、
前記第３のステップでは、前記命令列記憶部に格納されている命令と、前記データ列記憶部に格納されている関連データとに基づいて、前記命令列記憶部に格納されている命令によって更新および参照対象にされているレジスタおよび主記憶装置の内、前記データ列記憶部に格納されている関連データによって値が特定できるものについては、その値を書き戻す書き戻し命令を生成し、特定できないものについては、その値を推測して推測したデータを書き戻す書き戻し命令を生成し、該生成した書き戻し命令を、実行順が古い命令に対応するものから順番に前記状態復元部に配置することを特徴とする障害再現方法。
【請求項１０】
請求項９記載の障害再現方法において、
前記計算機が、レジスタの値が一意に確定しているか否かを表示する、レジスタ毎の一意フラグを備え、
前記第３のステップでは、推測した値を書き戻す書き戻し命令の書き戻し先が、一意フラグによって値が一意に確定していることが表示されているレジスタである場合は、前記書き戻し命令を前記状態復元部に配置しないことを特徴とする障害再現方法。
【請求項１１】
コンピュータに、自コンピュータにおいて命令が実行される毎に、実行された命令を命令列記憶部に書き込む第１のステップと、
前記コンピュータに、自コンピュータにおいて障害が発生したとき、前記命令列記憶部に対する命令の書き込みを禁止する第２のステップと、
前記コンピュータに、前記命令列記憶部に格納されている命令に基づいて、前記障害を再現するための障害再現部を含んだ障害再現プログラムを生成する第３のステップと、
前記コンピュータに、前記第３のステップで生成された障害再現プログラムをブートローダにより起動する第４のステップとを実行させるためのプログラム。
【請求項１２】
請求項１１記載のプログラムにおいて、
前記コンピュータに、自コンピュータにおいて命令が実行される毎に、実行された命令に関する関連データをデータ列記憶部に書き込む第５のステップと、
前記コンピュータに、自コンピュータにおいて障害が発生したとき、前記データ列記憶部に対する関連データの書き込みを禁止する第６のステップとを実行させ、且つ、
前記障害再現プログラムが、前記障害再現部に加えて、自計算機のレジスタおよび主記憶装置の状態を障害発生前の状態に戻すための状態復元部を含み、
前記第３のステップが、前記データ列記憶部に格納されている関連データに基づいて、前記状態復元部を生成することを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、サーバやパーソナルコンピュータ（ＰＣ）等の計算機において、障害を再現する障害再現技術に関し、特に、障害によりオペレーティングシステム（ＯＳ）が起動できない場合においても、障害を再現することが可能な障害再現技術に関する。
【背景技術】
【０００２】
サーバやＰＣ等の計算機において、障害原因を究明するために、障害を再現するということは従来から行われている（例えば、特許文献１参照）。この特許文献１においては、命令を実行する毎に、その命令によって更新されたレジスタの値を蓄積部に蓄積しておき、予想に反した事象（障害など）を再現する場合には、蓄積部に蓄積されているレジスタの値に基づいて、レジスタ（プログラムカウンタを含む）の状態を障害発生前の状態に戻し、その後、プログラムカウンタによって示される命令からプログラムの実行を再開させるようにしている。
【０００３】
【特許文献１】特開平３−１５８９３７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
特許文献１に記載されている技術によれば、レジスタの状態を障害発生前の状態に戻してからプログラムの実行を再開するようにしているので、障害を高い確率で再現することが可能になる。しかし、特許文献１に記載されている技術は、障害によってＯＳが起動できなくなった場合には、障害を再現することができないという問題がある。
【０００５】
〔発明の目的〕
そこで、本発明の目的は、障害によりＯＳが起動できなくなった場合においても、障害を再現できるようにすることにある。
【課題を解決するための手段】
【０００６】
本発明にかかる第１の計算機は、
自計算機において命令が実行される毎に、実行された命令が書き込まれ、自計算機に障害が発生したとき、命令の書き込みを禁止する命令列記憶部と、
前記命令列記憶部に格納されている命令に基づいて、前記障害を再現するための障害再現部を含んだ障害再現プログラムを生成するプログラム生成部と、
該プログラム生成部で生成された障害再現プログラムを起動するブートローダとを備えたことを特徴とする。
【０００７】
本発明にかかる第１の障害再現方法は、
自計算機において命令が実行される毎に、実行された命令を命令列記憶部に書き込む第１のステップと、
自計算機において障害が発生したとき、前記命令列記憶部に対する命令の書き込みを禁止する第２のステップと、
前記命令列記憶部に格納されている命令に基づいて、前記障害を再現するための障害再現部を含んだ障害再現プログラムを生成する第３のステップと、
該第３のステップで生成された障害再現プログラムをブートローダにより起動する第４のステップとを含むことを特徴とする。
【０００８】
本発明にかかる第１のプログラムは、
コンピュータに、自コンピュータにおいて命令が実行される毎に、実行された命令を命令列記憶部に書き込む第１のステップと、
前記コンピュータに、自コンピュータにおいて障害が発生したとき、前記命令列記憶部に対する命令の書き込みを禁止する第２のステップと、
前記コンピュータに、前記命令列記憶部に格納されている命令に基づいて、前記障害を再現するための障害再現部を含んだ障害再現プログラムを生成する第３のステップと、
前記コンピュータに、前記第３のステップで生成された障害再現プログラムをブートローダにより起動する第４のステップとを実行させる。
【発明の効果】
【０００９】
本発明によれば、障害によりＯＳが起動できなくなった場合においても障害を再現することが可能になるという効果を得ることができる。
【発明を実施するための最良の形態】
【００１０】
次に、本発明を実施するための最良の形態について図面を参照して詳細に説明する。
【００１１】
〔本発明の実施例〕
図１を参照すると、本発明の実施例にかかる計算機１は、プロセッサ２と、主記憶装置３と、不揮発性メモリ４とを備えている。
【００１２】
プロセッサ２は、一般的なプロセッサが備えている命令レジスタ２１、デコーダ２２、汎用レジスタ（単にレジスタという場合もある）Ｒ１〜ＲＮ、演算回路２３および障害検出回路２４に加えて、命令列記憶部２５、データ列記憶部２６およびプログラム生成部２７を備えている。
【００１３】
命令列記憶部２５は、図２に示すように、書き込み手段２５１と、記憶部２５２とを備えている。記憶部２５２は、ＳＲＡＭ（スタティックＲＡＭ）等によって実現されるものであり、Ｎ個の領域＃１〜＃Ｎを備えている。書き込み手段２５１は、命令レジスタ２１からデコーダ２２へ命令が送られる毎に（命令が実行される毎に）、その命令を記憶部２５２の領域＃１から順番に書き込む。領域＃Ｎまで命令を書き込むと、書き込み手段２５１は、再び領域＃１から命令を書き込む。従って、記憶部２５２には、最新の命令がＮ個格納されることになる。また、書き込み手段２５１は、障害検出回路２４によって計算機１の障害が検出されると、命令の書き込みを停止する。なお、図２において、命令＃３は格納順が最も古い命令を、命令＃（Ｎ＋２）は格納順が最も新しい命令を表している。
【００１４】
データ列記憶部２６は、命令列記憶部２５と同様に、書き込み手段とＮ個の領域からなる記憶部とを備えている。書き込み手段は、命令が実行される毎に、デコーダ２２のデコード結果に従って上記命令に関連する関連データを記憶部の領域＃１から順番に格納する。従って、データ列記憶部２６の領域＃Ｊ（１≦Ｊ≦Ｎ）には、命令列記憶部２５の領域＃Ｊに格納されている命令に関する関連データが格納されることになる。また、書き込み手段は、障害検出回路２４によって計算機１の障害が検出されると、関連データの書き込みを停止する。ここで、命令が更新および参照対象にしている全てのレジスタおよび主記憶装置に関するデータ（値と更新および参照位置）を関連データとしてデータ列記憶部２６に書き込むようにしても良いが、本実施例では、データ列記憶部２６の容量削減のため、その内の一部のみを関連データとしてデータ列記憶部２６に書き込むようにしている。本実施例では、メモリストア命令の場合には、参照しているレジスタの値とレジスタ番号とを関連データとし、メモリロード命令の場合には、参照している主記憶装置の値とアドレスとを関連データとし、他の命令の場合には、更新対象にしているレジスタの値とレジスタ番号とを関連データとしている。
【００１５】
プログラム生成部２７は、障害検出回路２４によって自計算機１の障害が検出されると、命令列記憶部２５に格納されている命令およびデータ列記憶部２６に格納されている関連データに基づいて、図３に示すような障害再現プログラム５を生成し、不揮発性メモリ４に格納する機能を有する。障害再現プログラム５は、レジスタＲ１〜ＲＮ及び主記憶装置３の状態を、命令列記憶部２５に格納されている最古の命令の実行時の状態に戻す状態復元部５１と、障害を再現させるための障害再現部５２とを含んでいる。
【００１６】
図４はプログラム生成部２７の構成例を示すブロック図であり、デコーダ２７１と、セレクタ２７２と、一意フラグ記憶部２７３と、推測部２７４と、セレクタ２７５とを備えている。
【００１７】
デコーダ２７１は、命令列記憶部２５に格納されている命令を、格納順が古い命令から順番にデコードし、デコード結果を出力する。
【００１８】
一意フラグ記憶部２７３には、レジスタＲ１〜ＲＮそれぞれに対する一意フラグＦ１〜ＦＮが格納される。一意フラグＦ１〜ＦＮは、対応するレジスタＲ１〜ＲＮの値が現時点において一意に決定されているか否かを表示するものであり、一意に決定されている場合には“１”が、決定されていない場合には“０”が設定される。
【００１９】
一意フラグ記憶部２７３の内容は、デコーダ２７１のデコード結果によって制御されるセレクタ２７２によって書き換えられる。なお、セレクタ２７２はデコーダ２７１のデコード結果に応じて、次のような動作を行うように構成されている。デコーダ２７１のデコード結果が、デコードした命令に対応する関連データの値がレジスタの値であり、且つその値が当該命令の実行以前に一意に決まるものであることを示している場合は、上記レジスタに対応する一意フラグを“１”とする。また、デコーダ２７１のデコード結果が、デコードした命令に対応する関連データの値がレジスタの値であり、且つその値が当該命令により一意に決まることを示している場合には、上記レジスタに対応する一意フラグを“０”とする。
【００２０】
例えば、デコーダ２７１でデコードした命令がメモリストア命令である場合は、当該メモリストア命令に対応する関連データの値は、ストア元のレジスタの値であり、ストア元のレジスタの値は、当該メモリストア命令の実行以前に一意に決まるものであるので、ストア元のレジスタに対応する一意フラグを“１”とする。また、例えば、デコードした命令が足し算命令である場合は、当該足し算命令に対応する関連データの値は、当該足し算命令で更新対象にしているレジスタの値であり、このレジスタの値は当該足し算命令によって決まるので、更新対象にしているレジスタに対応する一意フラグを“０”とする。
【００２１】
推測部２７４は、次のような機能を有する。
【００２２】
・デコーダ２７１でデコードされた命令によって更新或いは参照されているレジスタ或いは主記憶装置の値の内、データ列記憶部２６に関連データとして値が格納されているものについては、その値をレジスタ或いは主記憶装置に書き戻す命令を生成し、生成した命令を不揮発性メモリ４に格納する。
・デコーダ２７１でデコードされた命令によって更新或いは参照されているレジスタ或いは主記憶装置の値の内、データ列記憶部に関連データとして値が格納されていないものについては、その値を推測し、推測した値をレジスタ或いは主記憶装置に書き戻す命令を生成して不揮発性メモリ４に格納する。なお、デコードした命令で更新或いは参照しているレジスタの一意フラグが“１”の場合は、既に値が確定しているため、推測した値を書き戻す命令は生成しない。また、もし、一意フラグが“１”のレジスタの値を不揮発性メモリ４から読み出すことにより、他の更新或いは参照しているレジスタの値も一意に決まる場合は、該当するレジスタの一意フラグを“１”として、一意に決まった値を書き戻す命令を生成する。
【００２３】
より具体的には、推測部２７４には命令の種別に応じた推測回路（図示せず）が設けられており、デコーダ２７１でデコードされた命令の種別に対応する推測回路が、命令の種別に応じた処理を行う。例えば、足し算命令用の推測回路には、データ列記憶部２６から読み出した関連データに基づいて更新対象にしているレジスタに値を書き戻す命令を生成して不揮発性メモリ４に格納する構成と、足し算命令で参照している一方のレジスタに０を書き込む命令を生成して不揮発性メモリ４に格納する構成と、参照している他方のレジスタにデータ列記憶部２６から読み出した関連データによって示される値を書き込む命令を生成して不揮発性メモリ４に格納する構成を持たせれば良い。なお、足し算回路の構成はこれに限られるものではなく、乱数発生器を利用して構成するようにすることもできる。即ち、足し算命令で参照される一方のレジスタの値を乱数発生器を用いて決定し、他方のレジスタの値を乱数発生器を用いて決定した値と関連データによって示される値とから決定するようにしても良い。
【００２４】
なお、本実施例ではプログラム生成部２７をハードウェア（布線論理）により実現したが、コンピュータによって実現することもできる。この場合は、コンピュータをプログラム生成部２７として機能させるためのプログラムを記録したディスク、半導体メモリ、その他の記録媒体を用意し、コンピュータに上記プログラムを読み取らせる。コンピュータは、読み取ったプログラムに従って、自身の動作を制御することにより、自コンピュータ上に、プログラム生成部２７を実現する。
【００２５】
〔実施例の動作の説明〕
次に、本実施例の動作について詳細に説明する。
【００２６】
計算機１が正常に動作している場合は、計算機１において命令が実行される毎に、実行された命令が命令列記憶部２５の記憶部２５２に書き込まれると共に、上記命令に関連する関連データがデータ列記憶部２６の記憶部に書き込まれる。そして、障害検出回路２４によって計算機１の障害が検出されると、命令列記憶部２５は命令の書き込みを停止する。データ列記憶部２６は命令列記憶部２５に最後に書き込まれた命令に対応する関連データを書き込んだ後、書き込みを停止する。
【００２７】
計算機１に障害が発生し、命令列記憶部２５、データ列記憶部２６が命令、関連データの書き込みを停止すると、プログラム生成部２７が図５のフローチャートに示す処理を開始する。
【００２８】
先ず、プログラム生成部２７は、一意フラグ記憶部２７３に格納されている全ての一意フラグＦ１〜ＦＮを全て“０”に初期設定する（図５のＳ５０１）。その後、命令列記憶部２５、データ列記憶部２６からそれぞれ格納順（実行順）が最後の命令、関連データを読み出し（Ｓ５０２）、当該関連データが示す値を当該関連データが示すレジスタ或いはメモリアドレス（主記憶装置３）に書き込む命令を生成して不揮発性メモリ４に格納する（Ｓ５０３）。
【００２９】
その後、データ列記憶部２６から今回読み出した関連データがレジスタの値を示し、且つその値が命令列記憶部２５から今回読み出した命令の実行以前に一意に決まるものであるか否かをチェックする（Ｓ５０４）。そして、今回読み出した命令がメモリストア命令にように一意に決まる命令の場合は、該当するレジスタの一意フラグを“１”とする（Ｓ５０５）。これに対して、足し算命令のように一意に決まらない場合は、該当するレジスタの一意フラグを“０”とする（Ｓ５０６）。
【００３０】
その後、命令列記憶部２５から今回読み出した命令によって更新或いは参照されているレジスタ或いは主記憶装置３の値の内、今回読み出した関連データによって値が示されていないものは、その値を推測する（Ｓ５０７）。
【００３１】
そして、推測対象が主記憶装置３であった場合（Ｓ５０８がＮｏ）は、推測した値を該当するメモリアドレス（命令から分かる）に書き込む命令を生成し、生成した命令を不揮発性メモリ４に格納する（Ｓ５０９）。その後、命令列記憶部２５、データ列記憶部２６からそれぞれ格納順が１つ前の命令、関連データを読み出す（Ｓ５１４）。
【００３２】
これに対して、推測対象がレジスタであった場合（Ｓ５０８がＹｅｓ）は、推測対象にした全てのレジスタの一意フラグをチェックする（Ｓ５１０）。そして、一意フラグが全て“１”である場合（Ｓ５１０がＹｅｓ）には、現時点においては推測対象にしたレジスタの値が全て確定しているため、推測した値を書き込む命令は生成せずに、命令列記憶部２５、データ列記憶部２６からそれぞれ格納順が１つ前の命令、関連データを読み出す（Ｓ５１４）。
【００３３】
これに対して、推測対象にしたレジスタの一意フラグの中に、値が“０”のものが１つでも含まれている場合（Ｓ５１０がＮｏ）は、一意フラグが“０”になっているレジスタの値を、一意フラグが“１”となっているレジスタの値と今回読み出した関連データによって示されるレジスタ或いは主記憶装置の値によって一意に決定することができるか否かを判定する（Ｓ５１１）。
【００３４】
そして、一意に決定できると判定した場合（Ｓ５１１がＹｅｓ）は、値を一意に決定できると判定したレジスタの一意フラグを“１”に書き換え、更に、一意に決定した値を上記レジスタに書き込む命令を生成し、生成した命令を不揮発性メモリ４に格納する（Ｓ５１２）。
【００３５】
これに対して、一意に決定できないと判定した場合（Ｓ５１１がＮｏ）は、ステップＳ５０７で推測した値を該当するレジスタに書き込む命令を生成して不揮発性メモリ４に格納する（ステップＳ５１３）。
【００３６】
ステップＳ５１２或いはステップＳ５１３の処理が終了すると、命令列記憶部２５、データ列記憶部２６からそれぞれ格納順が１つ前の命令、関連データを読み出す（Ｓ５１４）。以後、ステップＳ５０３〜Ｓ５１４の処理を繰り返し行い、障害再現プログラム５の状態復元部５１を生成していく。そして、命令列記憶部２５、データ列記憶部２６に格納されている全ての命令、関連データに対してステップＳ５０３〜Ｓ５１４の処理を行い、格納順が前の命令がなくなると（ステップＳ５１５がＹｅｓ）、障害再現プログラム５の状態復元部５１が完成したことになるので、今度は障害再現部５２を生成するために図６のフローチャートの処理を行う。
【００３７】
図６を参照すると、プログラム生成部２７は、先ず、命令列記憶部２５に格納されている命令の中から実行順が最も前の命令を読み出し（Ｓ６０１）、不揮発性メモリ４に格納する（Ｓ６０２）。その後、プログラム生成部２７は、実行順が次の命令を命令列記憶部２５から取り出し、その命令を不揮発性メモリ４に書き込むという処理（Ｓ６０３、Ｓ６０２）を繰り返し行い、命令列記憶部２５に格納されている実行順が最後の命令を取り出して次の命令がなくなると（Ｓ６０４がＹｅｓ）、障害再現プログラム５の障害再現部５２が完成したことになるので、処理を終了する。
【００３８】
次に、図７及び図８を参照して、不揮発性メモリ４に格納されている障害再現プログラム５を利用して障害を再現させる場合の動作について説明する。
【００３９】
先ず、不揮発性メモリ４に格納されている障害再現プログラム５を、ブートイメージでフレキシブルディスク等の外部記憶装置６に書き込む（図７のＳ７０１、図８のＳ８０１）。なお、図８においてはブートイメージで書き込まれた障害再現プログラムを障害再現プログラム５ａとして表している。それから、障害再現プログラム５ａを読み出すブートローダ７を外部記憶装置６上に作成する（図７のＳ７０２、図８のＳ８０２）。なお、予め外部記憶装置６上にブートローダ７を作成しておき、ブートローダ７が作成済みの外部記憶装置６に障害再現プログラム５をブートイメージで書き込むようにしても良い。
【００４０】
その後、外部記憶装置６を計算機１に接続し（図７のＳ７０３、図８の８０３）、計算機１を再起動する（図７の７０４、図８の８０４）。なお、外部記憶装置６は、ブートに使用できるデバイスの内、最も優先順位が高いデバイスであるとする。
【００４１】
これにより、計算機１は、優先順位が最も高い外部記憶装置６からブートローダ７を読み込んで実行し、更に、このブートローダ７により障害再現プログラム５ａを読み込んで実行する（図７のＳ７０５、図８のＳ８０５、Ｓ８０６）。
【００４２】
障害再現プログラム５ａが実行されると、先ず、状態復元部５１によって計算機１のレジスタＲ１〜ＲＮ及び主記憶装置３の状態が、命令列記憶部２５に格納されている最古の命令の実行時の状態まで戻され、その後、障害再現部５２によって障害が再現される。
【００４３】
なお、上述した説明では、不揮発性メモリ４に格納されている障害再現プログラム５を一旦外部記憶装置６にブートイメージとして書き込み、外部記憶装置６上にブートローダ７を作成するようにしたが、障害再現プログラム５が格納されている不揮発性メモリ４上にブートローダ７を作成し、計算機１の再起動時に、不揮発性メモリ４に格納されているブートローダ７を読み込み、このブートローダ７より不揮発性メモリ４から障害再現プログラム５を読み込み実行する構成としても良い。
【００４４】
〔実施例の具体例〕
次に、具体例を挙げてプログラム生成部２７の動作を説明する。今、例えば、命令列記憶部２５、データ列記憶部２６の内容が図９に示すものであったとする。なお、図９において、Ｒ＊はレジスタを表し、Mem［x］は主記憶装置３のアドレスｘを表している。また、順番１〜６は命令の実行順を示すものであり、実行順を示す数字が小さい命令ほど、実行順が前の命令である。
【００４５】
プログラム生成部２７は、障害再現プログラム５の状態復元部５１を生成するため、命令列記憶部２５、データ列記憶部２６に格納されている命令、関連データを、実行順が後の命令（実行順を示す数字が大きい命令）から順番に読み込み、次のような処理を行う。
【００４６】
・順番６の命令（分岐命令）及び関連データを読み込んだ場合の動作
ステップＳ５０３において、関連データ「Ｒ１＝０」に基づいて、レジスタＲ１に０を書き込む命令を生成し、生成した命令を不揮発性メモリ４に格納する。ステップＳ５０７において分岐条件からＲ５＝１０１と推測し、ステップＳ５１３において、レジスタＲ５に推測した値「１０１」を書き込む命令を生成し、不揮発性メモリ４に格納する。
【００４７】
・順番５の命令（ＯＲ命令）及び関連データを読み込んだ場合の動作
ステップＳ５０３において、関連データ「Ｒ３＝４」に基づいて、レジスタＲ３に４を書き込む命令を生成し、生成した命令を不揮発性メモリ４に格納する。ステップＳ５０７において、ＯＲ命令の右辺に基づいてＲ４＝４、Ｒ６＝０と推測し、ステップＳ５１３において、レジスタＲ４に４を書き込む命令と、レジスタＲ６に０を書き込む命令とを生成し、それらを不揮発性メモリ４に格納する。
【００４８】
・順番４の命令（左２シフト命令）及び関連データを読み込んだ場合の動作
ステップＳ５０３において、関連データ「Ｒ４＝４」に基づいて、レジスタＲ４に４を書き込む命令を生成し、生成した命令を不揮発性メモリ４に格納する。ステップＳ５０７において、シフト命令の右辺からＲ３＝１と推測し、ステップＳ５１３において、レジスタＲ３に１を書き込む命令を生成し、不揮発性メモリ４に格納する。
【００４９】
・順番３の命令（メモリロード命令）及び関連データを読み込んだ場合の動作
ステップＳ５０３において、関連データ「Mem[2000］＝１」に基づいて、主記憶装置３の２０００番地に１を書き込む命令を生成して不揮発性メモリ４に格納する。ステップＳ５０７において、ロード先のレジスタＲ３に書き込む値を１と推測し、ステップＳ５１３においてレジスタＲ３に１を書き込む命令を生成して不揮発性メモリ４に格納する。
【００５０】
・順番２の命令（メモリストア命令）及び関連データを読み込んだ場合の動作
ステップＳ５０３において、関連データ「Ｒ２＝２０」に基づいて、レジスタＲ２に２０を書き込む命令を生成し、生成した命令を不揮発性メモリ４に格納する。ステップＳ５０４において、このメモリストア命令に対応する関連データはレジスタＲ２の値を示し、且つその値は、当該メモリストア命令の実行以前に一意に決まるものであると判定されるので、ステップＳ５０５において、レジスタＲ２に対応する一意フラグＦ２を“１”にする。ステップＳ５０７において、Mem[1000]の値を２０と推測し、ステップＳ５１３において、Mem[1000]に２０を書き込む命令を生成して不揮発性メモリ４に格納する。
【００５１】
・順番１の命令（足し算命令）及び関連データを読み込んだ場合の動作
ステップＳ５０３において、関連データ「Ｒ１＝１００」に基づいて、レジスタＲ１に１００を書き込む命令を生成し、生成した命令を不揮発性メモリ４に格納する。ステップＳ５０７において、レジスタＲ２、Ｒ３の値をそれぞれ例えば０、１００と推測する（この推測値は、後述するように利用されない）。ステップＳ５１１において推測対象のレジスタＲ３の値は、一意フラグが“１”となっているレジスタＲ２の値によって一意に決定できると判定されるので、ステップＳ５１２において、関連データ「Ｒ１＝１００」によって示されるレジスタＲ１の値１００と、一意フラグが“１”となっているレジスタＲ２の値「２０」とからレジスタＲ３の値を「８０」と一意に決定し、レジスタＲ３に８０を書き込む命令を生成して不揮発性メモリ４に格納する。また、ステップＳ５１２においては、レジスタＲ３に対応する一意フラグＦ３を“１”にする処理も行われる。なお、レジスタＲ２の値「２０」は、不揮発性メモリ４に格納されている、レジスタＲ２に対する書き込み命令の内、最も書き込み順が新しい命令から取得することができる。
【００５２】
以上の処理により、障害再現プログラム５の状態復元部５１が生成される。
【００５３】
その後、プログラム生成部２７は、障害再現プログラム５の障害再現部５２を生成するため、命令列記憶部２５に格納されている命令（順番１〜６の命令）を、実行順を示す数字が小さなものから順に、不揮発性メモリ４に格納する（図６参照）。これにより、実行順が古い命令から順次実行する障害再現部５２が完成する。
【００５４】
〔実施例の効果〕
本実施例によれば、障害によりＯＳが起動できなくなった場合においても障害を再現することが可能になるという効果を得ることができる。その理由は、プログラム生成部２７で生成された障害再現プログラム５を起動するブートローダ７を備えているからである。
【００５５】
また、本実施例では、プログラム生成部２７が、自計算機１のレジスタＲ１〜ＲＮ、主記憶装置３の状態を障害発生前の状態に戻すための状態復元部５１を含んだ障害再現プログラム５を生成するようにしているので、障害再現プログラム５を実行することにより、レジスタＲ１〜ＲＮ、主記憶装置３の状態を障害発生前の状態に戻すことができる。この結果、信号線間のクロストークエラーなどのようなパターン変化に依存した障害も高い確率で再現することが可能になる。
【００５６】
更に、本実施例では、不可逆演算を行う計算機１のレジスタおよび主記憶装置の状態を障害発生前の状態に戻すために、自計算機１で実行された命令が更新および参照しているレジスタおよび主記憶装置に関するデータの内の一部のデータを関連データとしてデータ列記憶部２６に書き込み、残りのデータは、関連データ及び対応する命令から推測するようにしているので、データ列記憶部２６の容量を少なくすることができる。
【００５７】
また、本実施例は、推測したデータを書き込む命令の書き込み先が、一意フラグによってその値が一意に確定していることが表示されているレジスタである場合は、上記命令を不揮発性メモリ４に格納しないようにしているので、レジスタＲ１〜ＲＮ、主記憶装置３の状態を正確に復元することができる。
【産業上の利用可能性】
【００５８】
本発明は、サーバ、ＰＣといった様々な計算機の障害原因を究明するために利用できる。
【図面の簡単な説明】
【００５９】
【図１】本発明にかかる計算機１の実施例のブロック図である。
【図２】命令列記憶部２５を説明するための図である。
【図３】障害再現プログラム５の構成例を示す図である。
【図４】プログラム生成部２７の構成例を示すブロック図である。
【図５】プログラム生成部２７が障害再現プログラム５の状態復元部５１を生成する際の処理例を示すフローチャートである。
【図６】プログラム生成部２７が障害再現プログラム５の障害再現部５２を生成する際の処理例を示すフローチャートである。
【図７】障害再現プログラム５を用いて障害を再現させる場合の動作を示したフローチャートである。
【図８】障害再現プログラム５を用いて障害を再現する場合の動作を説明するための図である。
【図９】命令列記憶部２５、データ列記憶部２６の内容例を示す図である。
【符号の説明】
【００６０】
１…計算機
２…プロセッサ
２１…命令レジスタ
２２…デコーダ
２３…演算回路
２４…障害検出回路
２５…命令列記憶部
２５１…書き込み手段
２５２…記憶部
２６…データ列記憶部
２７…プログラム生成部
Ｒ１〜ＲＮ…レジスタ
２７１…デコーダ
２７２…セレクタ
２７３…一意フラグ記憶部
２７４…推測部
２７５…セレクタ
３…主記憶装置
４…不揮発性メモリ
５、５ａ…障害再現プログラム
５１…状態復元部
５２…障害再現部
６…外部記憶装置
７…ブートローダ
【図１】
0004872883.tif 000002
【図２】
0004872883.tif 000003
【図３】
0004872883.tif 000004
【図４】
0004872883.tif 000005
【図５】
0004872883.tif 000006
【図６】
0004872883.tif 000007
【図７】
0004872883.tif 000008
【図８】
0004872883.tif 000009
【図９】
0004872883.tif 000010