(57)【要約】【課題】プログラムの実行状況を示す情報から、レジスタ値の変遷を再現する。【解決手段】変更履歴エントリ追加部１０２が、プログラム実行環境２００でのプログラムの実行中にプロセッサが実行した命令と命令実行によるメモリアクセスの内容が示される命令実行トレースデータ３００を特定の時点から遡りながらひとつずつ取出し、取出したトレースデータの命令がレジスタを参照する命令の場合、レジスタ変更履歴データ１０７に履歴エントリを追加する。演算実行部１０５が、履歴エントリを見渡して、レジスタ間演算命令に示される演算を実行し、代入先レジスタの値を演算結果の値で確定し、レジスタ値確定部１０４が、履歴エントリに示されるレジスタ、命令の種類、メモリアクセスの内容、演算実行部１０５の演算実行結果をもとに、命令実行時の各レジスタの値を確定し、プログラム実行環境２００でのプログラム実行中のレジスタ値の変遷を再現する。【選択図】図１
2009020610.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサとメモリと前記プロセッサに含まれる一つ以上のレジスタを用いてプログラムを実行するプログラム実行装置におけるプログラムの実行に対する解析を行う解析装置であって、
前記プロセッサがプログラムの実行中に実行した命令の内容と命令実行によるメモリアクセスの内容が時系列で示される複数エントリの命令実行トレースデータの時系列を遡ってエントリごとに命令の内容を解析し、命令にレジスタ識別子が示されているエントリをレジスタ命令エントリとして順次抽出するエントリ抽出部と、
前記エントリ抽出部により抽出されたレジスタ命令エントリに演算命令が示されている場合に、当該演算命令を実行する演算実行部と、
各レジスタ命令エントリの命令に示されているレジスタ識別子、各レジスタ命令エントリに示されているメモリアクセスの内容、及び前記演算実行部による演算命令実行結果を用いて、各レジスタ命令エントリに示されている命令が実行された際の各レジスタのレジスタ値を確定するレジスタ値確定部とを有することを特徴とする解析装置。
【請求項２】
前記レジスタ値確定部は、
いずれかのレジスタ命令エントリに示されている命令が前記プログラム実行装置において実行された際のいずれかのレジスタ値を確定した場合に、当該確定したレジスタ値を用いて、他のレジスタ命令エントリに示されている命令が前記プログラム実行装置において実行された際のいずれかのレジスタ値を確定し、前記プロセッサによるプログラムの実行中のレジスタ値の変遷を再現することを特徴とする請求項１に記載の解析装置。
【請求項３】
前記演算実行部は、
前記エントリ抽出部により抽出されたレジスタ命令エントリにレジスタ識別子が含まれる演算命令が示されている場合に、当該レジスタ識別子に対応するレジスタの当該演算命令の実行直前のレジスタ値が前記レジスタ値確定部により確定したときに、当該レジスタ値を用いて前記演算命令を実行することを特徴とする請求項１又は２に記載の解析装置。
【請求項４】
前記レジスタ値確定部は、
前記エントリ抽出部により抽出されたレジスタ命令エントリにレジスタ識別子が含まれる演算命令が示されている場合に、当該演算命令よりも以前に前記プログラム実行装置において実行された命令に対応するレジスタ命令エントリを解析して、当該演算命令に含まれているレジスタ識別子に対応するレジスタの当該演算命令の実行直前のレジスタ値を確定することを特徴とする請求項１〜３のいずれかに記載の解析装置。
【請求項５】
前記エントリ抽出部は、
メモリアクセスの内容として、前記プロセッサによりメモリアクセスの行われたメモリアドレス及びメモリアクセスの対象となったデータが示されている命令実行トレースデータを解析し、演算命令以外の命令が示されているレジスタ命令エントリに対して、各レジスタ命令エントリの命令に示されているレジスタ識別子、及び各レジスタ命令エントリに示されているメモリアドレス及びデータの少なくともいずれかを用いて、命令の実行の際のレジスタ値を確定することを特徴とする請求項１〜４のいずれかに記載の解析装置。
【請求項６】
前記エントリ抽出部は、
レジスタ命令エントリを抽出する度に、抽出したレジスタ命令エントリに対応づけて、各レジスタのレジスタ識別子が示されるとともにレジスタ値が確定済であるか否かを表す確定フラグがレジスタ識別子ごとに示される履歴エントリを生成し、各確定フラグを無効とし、
前記レジスタ値確定部は、
履歴エントリの確定フラグを参照し、確定フラグが無効であるレジスタ識別子に対応するレジスタのレジスタ値を確定し、レジスタ値が確定する度に、履歴エントリの対応するレジスタ識別子に対してレジスタ値を記述するとともに確定フラグを有効にすることを特徴とする請求項１〜５のいずれかに記載の解析装置。
【請求項７】
前記エントリ抽出部は、
値が代入されるレジスタであるか否かを表す代入フラグ、値が参照されるレジスタであるか否かを表す参照フラグがレジスタ識別子ごとに示される履歴エントリを生成し、抽出したレジスタ命令エントリに示される命令を解析して命令の実行における各レジスタの役割を解析し、値が代入される役割のレジスタのレジスタ識別子に対しては代入フラグを有効にし、値が参照される役割のレジスタのレジスタ識別子に対しては参照フラグを有効にし、
前記演算実行部は、
履歴エントリの代入フラグ及び参照フラグを参照し、履歴エントリの代入フラグ及び参照フラグが有効になっている場合に、参照フラグが有効になっているレジスタ識別子に対して記述されているレジスタ値を用いて、当該履歴エントリに対応するレジスタ命令エントリに示されている演算命令を実行し、
前記レジスタ値確定部は、
前記演算実行部の演算命令の実行の結果得られた値を当該履歴エントリの代入フラグが有効になっているレジスタ識別子に対して記述するとともに確定フラグを有効にすることを特徴とする請求項６に記載の解析装置。
【請求項８】
前記解析装置は、
前記プログラム実行装置によるプログラムの実行中に障害が発生した際に前記プログラム実行装置におけるプログラムの実行に対する解析を行う場合があり、更に、障害発生時の各レジスタのレジスタ値が示される障害発生時レジスタ値情報を入力する場合があり、
前記レジスタ値確定部は、
前記障害発生時レジスタ値情報に示される障害発生時の各レジスタのレジスタ値を用いて、各レジスタ命令エントリに示されている命令が実行された際の各レジスタのレジスタ値を確定することを特徴とする請求項１〜７のいずれかに記載の解析装置。
【請求項９】
前記エントリ抽出部は、
前記プロセッサがプログラムの実行においてフェッチした命令のプログラムカウンタ値が各エントリに示されている命令実行トレースデータを時系列を遡って解析し、特定のプログラムカウンタ値が示されているエントリに到達した際に、命令実行トレースデータの解析及びレジスタ命令エントリの抽出を終了することを特徴とする請求項１〜８のいずれかに記載の解析装置。
【請求項１０】
プロセッサとメモリと前記プロセッサに含まれる一つ以上のレジスタを用いてプログラムを実行するプログラム実行装置におけるプログラムの実行に対する解析をコンピュータが行う解析方法であって、
前記コンピュータが、前記プロセッサがプログラムの実行中に実行した命令の内容と命令実行によるメモリアクセスの内容が時系列で示される複数エントリの命令実行トレースデータの時系列を遡ってエントリごとに命令の内容を解析し、命令にレジスタ識別子が示されているエントリをレジスタ命令エントリとして順次抽出するエントリ抽出ステップと、
前記エントリ抽出ステップにより抽出されたレジスタ命令エントリに演算命令が示されている場合に、前記コンピュータが、当該演算命令を実行する演算実行ステップと、
前記コンピュータが、各レジスタ命令エントリの命令に示されているレジスタ識別子、各レジスタ命令エントリに示されているメモリアクセスの内容、及び前記演算実行ステップによる演算命令実行結果を用いて、各レジスタ命令エントリに示されている命令が実行された際の各レジスタのレジスタ値を確定するレジスタ値確定ステップとを有することを特徴とする解析方法。
【請求項１１】
プロセッサとメモリと前記プロセッサに含まれる一つ以上のレジスタを用いてプログラムを実行するプログラム実行装置におけるプログラムの実行に対する解析をコンピュータに実行させるプログラムであって、
前記プロセッサがプログラムの実行中に実行した命令の内容と命令実行によるメモリアクセスの内容が時系列で示される複数エントリの命令実行トレースデータの時系列を遡ってエントリごとに命令の内容を解析し、命令にレジスタ識別子が示されているエントリをレジスタ命令エントリとして順次抽出するエントリ抽出処理と、
前記エントリ抽出処理により抽出されたレジスタ命令エントリに演算命令が示されている場合に、当該演算命令を実行する演算実行処理と、
各レジスタ命令エントリの命令に示されているレジスタ識別子、各レジスタ命令エントリに示されているメモリアクセスの内容、及び前記演算実行処理による演算命令実行結果を用いて、各レジスタ命令エントリに示されている命令が実行された際の各レジスタのレジスタ値を確定するレジスタ値確定処理とをコンピュータに実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例えば、コンピュータプログラムの実行時に利用されたレジスタの内容を再現する技術に関する。
【背景技術】
【０００２】
従来のＣＰＵレジスタ再現方式は、デバッグ対象となるプログラムや機器にＣＰＵレジスタ再現に必要な情報を取得するための手段を追加することによって、過去の任意時点のＣＰＵレジスタ状態の再現を行っていた（例えば、特許文献１）。
また、別の従来技術においては、メモリやレジスタに対する書込みの度に書込み直前の値をトレースメモリに退避する命令をデバッグ用プログラムに挿入し、このデバッグ用プログラムを実行すると、バグが存在するときはその影響により実行が停止し、トレースメモリには、実行が停止した位置のアドレス及びその時のレジスタ及びメモリの内容が格納される。そして、トレースメモリの情報を用いて、実行が停止した位置から逆方向にトレースする（例えば、特許文献２）。
【０００３】
図４は、特許文献１に記載の技術を説明する図である。
図４でのデバッグ手段は、命令実行シミュレータやデバッガが想定されており、被デバッグプログラムの機械語命令を１命令ずつ解釈、実行していく。
バッファ書込み手段は各命令の解釈時に変更されるレジスタ、メモリの内容を実行履歴バッファに格納していく。
逆ステップ実行手段では、上記実行履歴バッファに格納された更新前のレジスタ、メモリの情報を順次書き戻すことで、過去のメモリ内容の再現を実現している。
【０００４】
図５は、特許文献２に記載の技術を説明する図である。
図５において、コンパイラは、メモリやレジスタに対する書込みの度に書込み直前の値をトレースメモリに退避する命令が挿入されたデバッグ用プログラムをコンパイルしてトレース用プログラムとし、このトレース用プログラムが実行部で実行されてデバッグが進められる。
デバッグ用プログラムを実行すると、バグが存在するときはその影響により実行が停止し、トレースメモリ３ａ、３ｂには、実行が停止した位置のアドレス及びその時のレジスタ及びメモリの内容が格納されている。そして、逆実行部が、実行履歴バッファのデータをもとに、トレース用プログラムを命令ごとに逆実行命令に変換して逆順に実行することで逆方向にトレースする。
【特許文献１】特開平５−１０８４０４号公報
【特許文献２】特開平９−６６４７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
特許文献１に記載のＣＰＵレジスタ再現方式は、デバッグ対象に何らかの変更を行うため、本来のプログラムの動作と、少なからず相違が生じるという課題があった。
また、特許文献２に記載の逆実行デバッグシステムにおいても、トレース用プログラムを命令ごとに逆実行命令に変換するため、本来のプログラムの動作と少なからず相違が生じるという課題があった。
その結果、ソフトウェア障害で最も解析困難なものの１つとされているタイミング障害（互いに副作用を及ぼす複数のプログラムの特異な実行順序の結果生じる障害）の再現を困難し、場合によっては不再現なものとしてしまうという課題があった。
【０００６】
この発明は、上記のような課題を解決することを主な目的の一つとしており、デバッグ対象のプログラム、機器の通常の動作で得られる情報から、過去の任意時点でのレジスタ状態を再現し、デバッグの効率を向上させることを主な目的とする。
【課題を解決するための手段】
【０００７】
本発明に係る解析装置は、
プロセッサとメモリと前記プロセッサに含まれる一つ以上のレジスタを用いてプログラムを実行するプログラム実行装置におけるプログラムの実行に対する解析を行う解析装置であって、
前記プロセッサがプログラムの実行中に実行した命令の内容と命令実行によるメモリアクセスの内容が時系列で示される複数エントリの命令実行トレースデータの時系列を遡ってエントリごとに命令の内容を解析し、命令にレジスタ識別子が示されているエントリをレジスタ命令エントリとして順次抽出するエントリ抽出部と、
前記エントリ抽出部により抽出されたレジスタ命令エントリに演算命令が示されている場合に、当該演算命令を実行する演算実行部と、
各レジスタ命令エントリの命令に示されているレジスタ識別子、各レジスタ命令エントリに示されているメモリアクセスの内容、及び前記演算実行部による演算命令実行結果を用いて、各レジスタ命令エントリに示されている命令が実行された際の各レジスタのレジスタ値を確定するレジスタ値確定部とを有することを特徴とする。
【発明の効果】
【０００８】
本発明によれば、プログラム実行装置におけるプログラムの実行状況を示す命令実行トレースデータから、所定時点のプログラム実行装置の各レジスタの値を再現することができる。
命令実行トレースデータは、プロセッサの本来の動作に影響を与えずに取得することが可能なため、プログラム動作時のレジスタの値を正確に再現することが可能となり、プログラムの誤動作の解析や原因の追究を効率化することができる。また、プロセッサの動作に影響を与えないため、タイミング障害の再現が可能となり、デバッグ効率を向上させることができる。
【発明を実施するための最良の形態】
【０００９】
実施の形態１．
図１は、本実施の形態に係るＣＰＵレジスタ再現装置１００の構成例を示す図である。
ＣＰＵレジスタ再現装置１００は、プログラム実行環境２００におけるプログラム２０１の実行状況を示す命令実行トレースデータ３００を取得し、命令実行トレースデータ３００を用いて、プログラム実行環境２００におけるプログラムの実行に対する解析を行う。ＣＰＵレジスタ再現装置１００は、解析装置の例である。
プログラム実行環境２００は、レジスタを内蔵するプロセッサとメモリを備え、プロセッサとメモリとプロセッサに含まれる一つ以上のレジスタを用いてプログラムを実行するコンピュータであり、プログラム実行装置の例である。
【００１０】
ＣＰＵレジスタ再現装置１００の内部構成において、初期化部１０１は、後述するレジスタ変更履歴データを初期化する。
変更履歴エントリ追加部１０２（エントリ抽出部）は、命令実行トレースデータ３００から、トレースエントリをひとつずつ取出し、レジスタ変更履歴データの先頭に履歴エントリを追加する。
トレース解析部１０３は、変更履歴エントリ追加部１０２により設定されたフラグ値を参照して、レジスタ値が確定しているか否かを判断する。
レジスタ値確定部１０４は、新たに確定したレジスタ値があれば、そのレジスタを変更する命令が出現しない範囲の同じレジスタのレジスタ値を確定する。
演算実行部１０５は、未実行の演算があれば、実行を試みる。参照元レジスタの値がすべて確定していれば、演算は実行できる。
終了判定部１０６は、解析の終了条件を判定し、条件を満足していれば、解析を終了する。
レジスタ変更履歴データ１０７は、命令実行トレースデータの各エントリの一部を時系列の逆順に格納する複数エントリからなるテーブルである。
【００１１】
次に、ＣＰＵレジスタ再現装置１００の内部構成を詳述する前に、命令実行トレースデータ３００及びレジスタ変更履歴データ１０７について説明する。
【００１２】
図２は、命令実行トレースデータ３００の例を示す。
命令実行トレースデータ３００は、プログラム実行環境２００のプロセッサとメモリ間のバス上に流れるデータを時間順に整列させた情報である。つまり、命令実行トレースデータ３００は、プログラム実行環境２００のプロセッサがプログラムの実行中に実行した命令の内容と命令実行によるメモリアクセスの内容が時系列で示される複数エントリの情報である。
命令実行トレースデータ３００は、複数のトレースエントリからなり、各トレースエントリは、（１）トレース番号、（２）プログラムカウンタ、（３）命令、（４）メモリアクセスのアドレス、（５）メモリアクセスのデータの５要素からなる。
（１）トレース番号は、トレースエントリの識別番号である。
（２）プログラムカウンタ値（ＰＣ値）は、プログラム実行のためにフェッチされた命令のアドレスを示す。
（３）命令は、そのＰＣ値でフェッチされた命令を示す。命令において、ＬＤＲはロード命令を示し、ＡＤＤは加算命令を示し、ＳＴＲはストア命令を示す。また、Ｒ１、Ｒ２等は、レジスタの識別子である。また、本実施の形態では、説明の簡明のため、演算命令の例としてＡＤＤ命令を用いて説明するが、他の種類の演算命令（算術演算命令、論理演算命令）が含まれていてもよい。
（４）メモリアクセスアドレスは、命令の実行によってアクセスされたメモリのアドレスを示す。
（５）メモリアクセスデータは、メモリアクセスの結果メモリバス上に流れたデータ（ＬＤＲの場合はメモリからレジスタに読込んだ値、ＳＴＲの場合はレジスタからメモリに書き込んだ値）を示す。
【００１３】
図３は、レジスタ変更履歴データ１０７の例を示す。
レジスタ変更履歴データ１０７は、命令実行トレースデータ３００の各トレースエントリをレジスタごとに管理するためのテーブルである。
レジスタ変更履歴データ１０７は、複数の履歴エントリからなり、各履歴エントリは、（１）トレース番号、（２）未処理フラグ、（３）命令、（４）レジスタ情報の４要素からなる。
また、（４）レジスタ情報は、複数のレジスタ情報エントリからなり、各レジスタ情報エントリは、（４−１）代入フラグ、（４−２）参照フラグ、（４−３）確定フラグ、（４−４）値の４要素からなる。
トレース番号（１）には、命令実行トレースデータ３００の各トレースエントリのトレース番号が挿入される。
（２）未処理フラグは、演算命令が完了しているか否かを示すフラグであり、演算命令が未完了の場合はフラグ値がＴｒｕｅとなり、演算命令が完了している場合又は演算命令以外の命令の場合はフラグ値がＦａｌｓｅとなる。
（３）命令は、命令実行トレースデータ３００のトレースエントリに示される命令の内容が記述される。
（４）レジスタ情報は、命令実行トレースデータ３００の命令に示されるレジスタごとに区分されている。
（４）レジスタ情報において、
（４−１）代入フラグは、命令の実行の際に値が代入されるレジスタであるか否かを表すフラグであり、値が代入されるレジスタの場合はフラグ値がＴｒｕｅになる。
（４−２）参照フラグは、命令の実行の際に値が参照されるレジスタであるか否かを表すフラグである。値が参照されるレジスタの場合はフラグ値がＴｒｕｅになる。
（４−３）確定フラグは、レジスタ値が確定済であるか否かを表すフラグである。レジスタ値が確定済である場合はフラグ値がＴｒｕｅになる。
（４−４）値は、各履歴エントリ（又は各履歴エントリに対応するトレースエントリ）に示される命令の実行直前のレジスタ値を示す。但し、確定フラグがＦａｌｓｅのときは、レジスタ値は確定しておらず、当該レジスタ値は更新される可能性がある。
図１１〜図１４は、運用されているレジスタ変更履歴データ１０７の例を示している。
本実施の形態では、レジスタ変更履歴データ１０７は、例えば、図１２に示すように、時間的に新しいトレースエントリに対応する履歴エントリ（トレース番号２０３）の上に順次時間的に古いトレースエントリに対応する履歴エントリ（トレース番号２０２、２０１）を積み重ねることにより生成される。なお、レジスタ変更履歴データ１０７における履歴エントリの構成、配列の順序は、図１１〜図１４に示す例に限るものではない。
また、図１１〜図１４では、説明のために、図３には含まれていないメモリアクセスの情報を含ませており、また、記述形式の一部を変更している。
図１１〜図１４の各々の詳細は、後述する。
【００１４】
以上を前提に、図１に示すＣＰＵレジスタ再現装置１００における主要構成要素の詳細を説明する。
変更履歴エントリ追加部１０２は、命令実行トレースデータの時系列を遡ってエントリごとに命令の内容を解析し、命令にレジスタ識別子が示されているエントリをレジスタ命令エントリとして順次抽出する。そして、レジスタ命令エントリを抽出する度に、図３に示す履歴エントリを生成する。つまり、レジスタ命令エントリとは、図３の各履歴エントリのことである。
履歴エントリの生成に際して、変更履歴エントリ追加部１０２は、レジスタ識別子ごとの確定フラグをＦａｌｓｅ（無効）にする。また、変更履歴エントリ追加部１０２は、抽出したレジスタ命令エントリに示される命令を解析して命令の実行における各レジスタの役割を解析し、値が代入される役割のレジスタのレジスタ識別子に対しては代入フラグをＴｒｕｅ（有効）とし、値が参照される役割のレジスタのレジスタ識別子に対しては参照フラグをＴｒｕｅ（有効）とする。
【００１５】
レジスタ値確定部１０４は、各レジスタ命令エントリの命令に示されているレジスタ識別子、各レジスタ命令エントリに示されているメモリアクセスの内容、及び演算実行部１０５による演算命令行結果を用いて、各レジスタ命令エントリに示されている命令が実行された際（命令実行直前）の各レジスタのレジスタ値を確定する。
また、レジスタ値確定部１０４は、いずれかのレジスタ命令エントリに示されている命令が実行された際のいずれかのレジスタのレジスタ値を確定した場合に、当該確定したレジスタ値を用いて、他のレジスタ命令エントリに示されている命令が実行された際のいずれかのレジスタのレジスタ値を確定し、プログラム実行環境２００のプロセッサによるプログラムの実行中のレジスタ値の変遷を再現する。
具体的には、レジスタ値確定部１０４は、レジスタ命令エントリにレジスタ識別子が含まれる演算命令が示されている場合に、当該演算命令よりも以前に実行された命令に対応するレジスタ命令エントリを解析して、当該演算命令に含まれているレジスタ識別子に対応するレジスタの当該演算命令の実行の際のレジスタ値を確定する。
また、レジスタ値確定部１０４は、演算命令以外の命令が示されているレジスタ命令エントリに対して、各レジスタ命令エントリの命令に示されているレジスタ識別子、及び各レジスタ命令エントリに示されているメモリアドレス及びデータの少なくともいずれかを用いて、命令の実行の際のレジスタ値を確定する。
更に、レジスタ値確定部１０４は、履歴エントリの確定フラグを参照し、確定フラグがＦａｌｓｅ（無効）であるレジスタ識別子に対応するレジスタのレジスタ値を確定し、レジスタ値が確定する度に、履歴エントリの対応するレジスタ識別子に対してレジスタ値を記述するとともに確定フラグをＴｒｕｅ（有効）にする。
また、レジスタ値確定部１０４は、演算実行部１０５の演算命令の実行の結果得られた値を当該履歴エントリの代入フラグがＴｒｕｅ（有効）になっているレジスタ識別子に対して記述するとともに確定フラグをＴｒｕｅ（有効）にする。
【００１６】
演算実行部１０５は、レジスタ命令エントリに演算命令が示されている場合に、当該演算命令を実行する。
また、演算実行部１０５は、レジスタ命令エントリにレジスタ識別子が含まれる演算命令が示されている場合に、当該レジスタ識別子に対応するレジスタの当該演算命令の実行の際のレジスタ値がレジスタ値確定部１０４により確定したときに、当該レジスタ値を用いて演算命令を実行する。
更に、演算実行部１０５は、履歴エントリの代入フラグ及び参照フラグを参照し、履歴エントリの代入フラグ及び参照フラグがＴｒｕｅ（有効）になっている場合に、参照フラグがＴｒｕｅ（有効）になっているレジスタ識別子に対して記述されているレジスタ値を用いて、当該履歴エントリに対応するレジスタ命令エントリに示されている演算命令を実行する。
【００１７】
次に、図６〜図９を参照して、本実施の形態に係るＣＰＵレジスタ再現装置１００の動作例を説明する。
先ず、ステップＳ１００にて、初期化部１０１が、初期化処理を行う。
具体的には、初期化部１０１は、レジスタ変更履歴データ１０７をクリアして新たな履歴エントリを挿入し、新たな履歴エントリに対して以下の処理を行う。
（１）未処理フラグにＦａｌｓｅを記録する。
（２）各レジスタ情報エントリの代入フラグ、参照フラグ、確定フラグのそれぞれにＦａｌｓｅを記録する。
【００１８】
次に、ＣＰＵレジスタ再現装置１００では、命令実行トレースデータのトレースエントリを時系列とは逆順に処理して、終了条件に合致するまで、ステップＳ２００〜Ｓ８００を繰り返し実行する。
【００１９】
先ず、ステップＳ２００では、変更履歴エントリ追加部１０２が、履歴エントリ追加処理を行う（エントリ抽出ステップ）。
履歴エントリ追加処理の詳細は、図７のフローチャートを参照して後述するが、履歴エントリ追加処理の概略を説明すると、変更履歴エントリ追加部１０２が命令実行トレースデータから、トレースエントリを逆順に（トレース番号の大きいほうから小さいほうに向けて）ひとつずつ取出す。もし、トレースエントリの命令がレジスタにアクセスする命令であれば（命令にレジスタ識別子が含まれていれば）、レジスタ変更履歴データの先頭の履歴エントリの全体をコピーした新たな履歴エントリを先頭に挿入し、新たな履歴エントリに対して所定の方法でデータを記録する。
【００２０】
次に、ステップＳ３００において、トレース解析部１０３が、変更履歴エントリ追加部１０２により付与された確定フラグの値を確認し、ステップＳ４００においてレジスタ値が確定しているか否かを判断する。
レジスタ値が確定している場合は、ステップＳ５００に進み、レジスタ値確定処理が行われる。他方、レジスタ値が確定していない場合は、ステップＳ７００に進み、終了判定処理が行われる。
【００２１】
次に、ステップＳ５００において、レジスタ値確定部１０４が、レジスタ値確定処理を行う（レジスタ値確定ステップ）。
レジスタ値確定処理の詳細は、図８のフローチャートを参照して後述するが、レジスタ値確定処理の概略を説明すると、レジスタ値確定部１０４が、レジスタ変更履歴データの指定されたトレース番号の後の履歴エントリを探索し、指定されたレジスタの代入フラグがＦａｌｓｅとなっている連続する範囲の各エントリに対して、指定されたレジスタの値を記録して確定フラグにＴｒｕｅを記録する。
【００２２】
次に、ステップＳ６００において、演算実行部１０５が、演算実行処理を行う（演算実行ステップ）。
演算実行処理の詳細は、図９のフローチャートを参照して後述するが、演算実行部１０５が、レジスタ変更履歴データを探索し、未処理フラグがＴｒｕｅの履歴エントリのうち、参照フラグがＴｒｕｅのすべてのレジスタ情報エントリの確定フラグがＴｒｕｅとなっている履歴エントリがある限り、そのようなすべての履歴エントリに対して以下の処理を行う。
（１）未処理フラグにＦａｌｓｅを記録する。
（２）参照フラグがＴｒｕｅとなっているレジスタ情報エントリの値を使って命令の演算結果を計算し、代入フラグがＴｒｕｅとなっているレジスタ情報エントリの値に対してレジスタのレジスタ値確定処理を行う。
【００２３】
次に、ステップＳ７００において、終了判定部１０６が、終了判定処理を行う。
終了判定処理では、レジスタ変更履歴データの、所定のトレース番号の履歴エントリの、所定のレジスタに対応するレジスタ情報エントリの確定フラグがＴｒｕｅの場合に解析を終了する（Ｓ８００でＹＥＳ）。
解析を終了しない場合は、履歴エントリ追加処理に戻り、一連の処理（履歴エントリ追加処理、レジスタ値確定処理、演算実行処理、終了判定処理）を繰り返す（Ｓ８００でＮＯ）。
【００２４】
次に、図７を用いて、変更履歴エントリ追加部１０２による履歴エントリ追加処理の詳細を説明する。
先ず、変更履歴エントリ追加部１０２は、命令実行トレースデータ３００のトレースエントリを一つずつ逆順に取出す（Ｓ２００１）。逆順とは、時間的に新しいトレースエントリから古いトレースエントリに遡る順序である。
そして、変更履歴エントリ追加部１０２は、取出したトレースエントリに示されている命令の種類がレジスタにアクセスする命令であるか否か、すなわち、命令にレジスタ識別子が示されているか否かを判断する（Ｓ２００２）。
レジスタにアクセスする命令でない場合、変更履歴エントリ追加部１０２は履歴エントリ追加処理を終了する。
他方、レジスタにアクセスする命令の場合、変更履歴エントリ追加部１０２は、当該トレースエントリをレジスタ命令エントリとして抽出し、レジスタ変更履歴データの先頭に新たな履歴エントリを追加し（Ｓ２００３）、新しい履歴エントリのトレース番号にレジスタ命令エントリのトレース番号を記録する（Ｓ２００４）。また、一つ前の履歴エントリ（一つ前に処理した履歴エントリ）から、全レジスタ情報エントリの確定フラグと値をコピーし（Ｓ２００５）、全レジスタ情報エントリの代入フラグと参照フラグにＦａｌｓｅを記録する（Ｓ２００６）。
【００２５】
次に、変更履歴エントリ追加部１０２は、現在対象としているレジスタ命令エントリに示されている命令が演算命令であるか否かを判断し（Ｓ２００７）、演算命令でない場合（Ｓ２００７でＮＯ）は、当該履歴エントリの未処理フラグにＦａｌｓｅを記録する（Ｓ２００８）。
次に、変更履歴エントリ追加部１０２は、現在対象としているレジスタ命令エントリに示されている命令がレジスタに代入しない命令（ＳＴＲ命令）か、レジスタに代入する命令（ＬＤＲ命令）かを判断する（Ｓ２００９）。
レジスタに代入しない命令（ＳＴＲ命令）である場合は、参照元レジスタ値を計算してレジスタ情報エントリの値の欄に計算結果を記録し、更に、確定フラグにＴｒｕｅを記録する（Ｓ２０１４）。
レジスタに代入する命令（ＬＤＲ命令）である場合は、代入先レジスタ値を計算して、代入先レジスタのレジスタ情報エントリ（履歴エントリにおける下の行のレジスタ情報エントリ）の値の欄に計算結果を記録し、確定フラグにＴｒｕｅを記録する（Ｓ２０１５）。また、代入先レジスタのレジスタ情報エントリの代入フラグにＴｒｕｅを記録し、確定フラグにＦａｌｓｅを記録する（Ｓ２０１３）。
また、アドレス間接参照の命令の場合は、オフセット用の参照元レジスタ値を計算してレジスタ情報エントリの値の欄に計算結果を記録し、確定フラグにＴｒｕｅを記録する（Ｓ２０１６）。
【００２６】
アドレス間接参照命令とは、例えば、図１１のトレース番号１０２のＳＴＲ命令やトレース番号１０１のＬＤＲ命令に示されるように、レジスタにメモリアドレスの値が格納されており、レジスタに格納されている値に対応するメモリアドレス（又はレジスタに格納されているメモリアドレスの値を用いた演算により得られる値に対応するメモリアドレス）にデータを格納し、若しくはレジスタに格納されている値に対応するメモリアドレス（又はレジスタに格納されているメモリアドレスの値を用いた演算により得られる値に対応するメモリアドレス）からデータを読み出す命令である。
なお、トレース番号１０２のＳＴＲ命令における｛Ｒ２＋８｝は、レジスタＲ２に格納されているメモリアドレスに８を加算したメモリアドレスを意味し、ＬＲＤ  Ｒ１→｛Ｒ２＋８｝とは、レジスタＲ１に格納されているデータをレジスタＲ２に格納されているメモリアドレスに８を加算したメモリアドレスに格納するという命令である。
トレース番号１０１のＬＤＲにおける｛Ｒ２｝は、レジスタＲ２に格納されているメモリアドレスを意味し、ＳＴＲ  Ｒ１←｛Ｒ２｝とは、レジスタＲ２に格納されているメモリアドレスからデータをレジスタＲ１に読み出すという命令である。
【００２７】
例えば、図１１のトレース番号１０２のエントリでは、ＳＴＲ命令なので、未処理フラグがＦａｌｓｅになっている。また、トレース番号１０２のＳＴＲ命令における参照元レジスタはレジスタＲ１であり、この参照元レジスタＲ１のレジスタ値とは、メモリアクセスデータである０ｘ００００００１１である。このため、レジスタＲ１のレジスタ情報エントリの値の欄に当該値が記録される。
そして、レジスタＲ１の確定フラグはＴｒｕｅとなる。
また、トレース番号１０２の命令は、アドレス間接参照命令であり、オフセット用の参照元レジスタＲ２の値は、メモリアクセスのアドレスである０ｘ４０００００１０から８を引いた値０ｘ４００００００８がレジスタＲ２のレジスタ値となり、レジスタＲ２のレジスタ情報エントリの値の欄に当該値が記録される。そして、レジスタＲ２の確定フラグはＴｒｕｅとなる。
【００２８】
また、図１１のトレース番号１０１のエントリでは、ＬＤＲ命令なので、未処理フラグがＦａｌｓｅになっている。
また、トレース番号１０１のＬＤＲ命令における代入先レジスタはレジスタＲ１であり、この代入先レジスタＲ１のレジスタ値とは、メモリアクセスデータである０ｘ００００００１１である。
このため、一段下の行であるトレース番号１０２のレジスタＲ１のレジスタ情報エントリの値の欄に当該値が記録される。
そして、トレース番号１０２のエントリのレジスタＲ１の確定フラグはＴｒｕｅとなる。
更に、トレース番号１０１のエントリのレジスタＲ１の代入フラグにＴｒｕｅが記録され、確定フラグにはＦａｌｓｅが記録される。なお、トレース番号１０１の時点では、ＬＤＲ命令の実行前のレジスタＲ１のレジスタ値は確定させることができないので、レジスタＲ１の値は空欄である。
また、トレース番号１０２の命令は、アドレス間接参照命令であり、オフセット用の参照元レジスタＲ２の値は、メモリアクセスのアドレスである０ｘ４００００００８となり、レジスタＲ２のレジスタ情報エントリの値の欄に当該値が記録される。そして、レジスタＲ２の確定フラグはＴｒｕｅとなる。
【００２９】
なお、図１１〜図１４では、ＳＴＲ命令、ＬＤＲ命令の場合も命令の内容が、履歴エントリの命令欄に記述されることになっているが、ＳＴＲ命令、ＬＤＲ命令の場合は命令内容を記述しなくてもよい。図７のフローチャートでは、ＳＴＲ命令、ＬＤＲ命令の場合は命令内容を記述しないこととしている。
【００３０】
図７において、ステップＳ２００７の判断で、現在対象としているレジスタ命令エントリに示されている命令が演算命令である場合（Ｓ２００７でＹＥＳ）、変更履歴エントリ追加部１０２は、当該履歴エントリの未処理フラグにＴｒｕｅを記録する（Ｓ２０１０）。
また、変更履歴エントリ追加部１０２は、当該履歴エントリの命令欄に、トレースデータの命令（現在対象としているレジスタ命令エントリに示されている命令）を記録する（Ｓ２０１１）。
次に、変更履歴エントリ追加部１０２は、当該履歴エントリにおいて、参照元となるレジスタのレジスタ情報エントリの参照フラグにＴｒｕｅを記録する（Ｓ２０１２）。
そして、変更履歴エントリ追加部１０２は、代入先のレジスタ情報エントリの代入フラグにＴｒｕｅを記録し、確定フラグにＦａｌｓｅを記録する（Ｓ２０１３）。
更に、アドレス間接参照の命令の場合は、オフセット用の参照元レジスタ値を計算してレジスタ情報エントリの値の欄に計算結果を記録し、確定フラグにＴｒｕｅを記録する（Ｓ２０１６）。
【００３１】
例えば、図１２（ａ）のトレース番号２０２のエントリでは、ＡＤＤ命令が示されており、未処理フラグがＴｒｕｅになっている。
また、このＡＤＤ命令では、レジスタＲ１が参照元レジスタであり、レジスタＲ３が代入先レジスタである。このため、レジスタＲ１の参照フラグがＴｒｕｅになっており、また、レジスタＲ３の代入フラグがＴｒｕｅになっている。
【００３２】
次に、図８を参照して、レジスタ値確定部１０４によるレジスタ値確定処理の詳細を説明する。
図８のレジスタ値確定処理は、図６のステップＳ４００においてトレース解析部１０３による確定フラグの確認により処理の対象となっている履歴エントリのいずれかのレジスタ値が確定していると判断された後に行われる。
レジスタ値確定部１０４は、ステップＳ５００１とＳ５００２から構成されるループ２を実行する。
ループ２では、現在処理の対象となっている履歴エントリから順方向に履歴エントリを処理する。順方向とは、時間的に古い命令実行についての履歴エントリから新しい命令実行についての履歴エントリに向かう方向であり、トレース番号の小さい履歴エントリから大きい履歴エントリに向かう方向（例えば、図１２のトレース番号２０１から２０３に向かう方向）である。
図７のＳ２００１に示すように、変更履歴エントリ追加部１０２は、命令実行トレースデータを逆順（時間的に新しいトレースエントリから古いトレースエントリに遡る順序）に処理し、履歴エントリも命令実行トレースデータの逆順で生成されるため、現在処理の対象としている履歴エントリよりも時間的に新しい（トレース番号が大きい）履歴エントリは存在しており、履歴エントリを順方向に探索することができる。
レジスタ値確定部１０４は、代入フラグがＴｒｕｅとなっているエントリに到達するまで、現在処理の対象となっている履歴エントリの確定レジスタ値を順方向に存在しているエントリに順次記録し、各エントリの対応するレジスタ情報エントリの確定フラグにＴｒｕｅを記録する（Ｓ５００１、Ｓ５００２）。
【００３３】
次に、図９を参照して、演算実行部１０５による演算実行処理の詳細を説明する。
演算実行部１０５は、ステップＳ６００１〜Ｓ６００８で構成されるループ３を実行する。
ループ３では、演算実行部１０５は、すべての履歴エントリを対象とする。
例えば、レジスタ変更履歴データの最上位の履歴エントリから順に未処理フラグの値を確認し、未処理フラグがＴｒｕｅとなっている履歴エントリが存在した場合（Ｓ６００１でＹＥＳ）、当該履歴エントリのレジスタ情報エントリを探索し、代入フラグがＴｒｕｅとなっているレジスタ情報エントリを探す（Ｓ６００２）。
そして、演算実行部１０５は、代入フラグがＴｒｕｅとなっているレジスタ情報エントリの確定フラグがＴｒｕｅとなっているか否かを判断する（Ｓ６００３）。
確定フラグがＴｒｕｅとなっていれば（Ｓ６００３でＴｒｕｅ）、当該レジスタのレジスタ値は確定しているので、演算実行部１０５はＳ６００１に処理を戻し、次の未処理フラグがＴｒｕｅとなっている履歴エントリを探す。
他方、確定フラグがＦａｌｓｅの場合（Ｓ６００３でＦａｌｓｅ）は、次に、演算実行部１０５は、参照フラグがＴｒｕｅとなっている全レジスタ情報エントリの確定フラグのＡＮＤを計算する（Ｓ６００４）。
例えば、図１４（ｄ）のトレース番号３０３のエントリでは、未処理フラグがＴｒｕｅであり、レジスタＲ３のレジスタ情報エントリの代入フラグがＴｒｕｅであり、確定フラグがＦａｌｓｅである。このエントリにおいて参照フラグがＴｒｕｅであるのはレジスタＲ１とレジスタＲ２である。ステップＳ６００４では、このレジスタＲ１とレジスタＲ２の確定フラグの値でＡＮＤを計算する（図１４（ｄ）のトレース番号３０３のエントリでは、レジスタＲ２の確定フラグがＦａｌｓｅなので、ＡＮＤ計算の結果はＦａｌｓｅになる）。
ＡＮＤ計算の結果がＦａｌｓｅであれば（Ｓ６００５でＦａｌｓｅ）、少なくとも一つの参照元レジスタのレジスタ値が未確定であるので、演算命令が実行できず、演算実行部１０５はＳ６００１に処理を戻し、次の未処理フラグがＴｒｕｅとなっている履歴エントリを探す。
他方、ＡＮＤ計算の結果がＴｒｕｅであれば（Ｓ６００５でＴｒｕｅ）、全ての参照元レジスタのレジスタ値が確定しているので、演算命令が実行可能であり、演算実行部１０５は当該エントリの未処理フラグにＦａｌｓｅを記録し（Ｓ６００６）、当該エントリの命令に示されている演算命令を実行し（Ｓ６００７）、演算命令が示されている履歴エントリの下の行の履歴エントリのトレース番号、該当するレジスタ識別子、演算命令の実行結果をレジスタ値確定部１０４に通知し、図８のレジスタ値確定処理を実行させる（Ｓ６００８）。
なお、演算命令が示されている履歴エントリの次の履歴エントリのトレース番号を通知するのは、演算命令が示されているエントリには演算命令の実行前のレジスタ値が記録され、演算命令の実行結果が反映されるのは演算命令が示されている履歴エントリの次の履歴エントリだからである。
具体的には、図１２（ｂ）のトレース番号２０２のレジスタＲ３のレジスタ情報エントリには、レジスタＲ１のレジスタ値０ｘ００００００１１と７との加算命令が実行される前のレジスタＲ３のレジスタ値が記録され、加算命令実行後のレジスタＲ３のレジスタ値（０ｘ００００００１１）は、トレース番号２０３のエントリのレジスタ情報エントリに記録される。
【００３４】
演算実行部１０５から履歴エントリのトレース番号、該当するレジスタ識別子、演算命令の実行結果の通知を受領したレジスタ値確定部１０４は、図８に示す動作を行う。
レジスタ値確定部１０４は、演算実行部１０５から通知されたトレース番号の履歴エントリから順方向に履歴エントリを処理する。
ステップＳ５００１において、レジスタ値確定部１０４は、演算実行部１０５から通知されたトレース番号の履歴エントリの該当レジスタ情報エントリに、通知された演算命令の実行結果の値をレジスタ値として記録し、当該レジスタ情報エントリの確定フラグにＴｒｕｅを記録する。
そして、レジスタ値確定部１０４は、代入フラグがＴｒｕｅである履歴エントリに到達するまで（Ｓ５００２）、当該レジスタのレジスタ情報エントリに通知された演算命令の実行結果の値をレジスタ値として記録し、確定フラグにＴｒｕｅを記録する。
例えば、図１２（ａ）のトレース番号２０２において、レジスタＲ１のレジスタ値０ｘ０００００００Ａと７を加算してレジスタＲ３のレジスタ値０ｘ００００００１１が得られ、この値が次のトレース番号２０３のエントリのレジスタＲ３のレジスタ情報エントリに記録され、確定フラグにＴｒｕｅが記録される。また、図１２ではトレース番号２０４以降のエントリは記載されていないが、トレース番号２０４以降のエントリが存在しているとすれば、レジスタＲ３の代入フラグがＦａｌｓｅである限り、トレース番号２０４以降のエントリのレジスタＲ３のレジスタ情報エントリにレジスタ値０ｘ００００００１１が記録され、確定フラグにＴｒｕｅが記録される。
【００３５】
次に、図１１〜図１４を使って解析処理の実行例を以下に説明する。
前述したように、図１１〜図１４のレジスタ変更履歴データでは、説明の簡明のため、ＳＴＲ命令、ＬＤＲ命令についても命令内容を記述し、また、メモリアクセスの内容（メモリアクセス対象のアドレス、メモリアクセス対象のデータ）を記述しているが、ＣＰＵレジスタ再現装置１００は図３に示すレジスタ変更履歴データを用いて処理可能である。
【００３６】
解析実行例１（図１１）
終了条件：トレース番号１０１におけるレジスタＲ２の値が確定すること。
図１１では、トレース番号１０２において、ＳＴＲ命令であるため、メモリアクセスのデータがレジスタＲ１に格納されていたことが分かり、レジスタＲ１のレジスタ値として０ｘ００００００１１が記録され、確定フラグがＴｒｕｅとなる。
また、トレース番号１０２において、データの格納先がレジスタＲ２のレジスタ値に８を加算したアドレスであるため、アドレス０ｘ４０００００１０から８を減じた値０ｘ４００００００８がレジスタＲ２のレジスタ値として記録される。
また、トレース番号１０１において、アドレス間接参照命令なので、メモリアドレス０ｘ４００００００８がレジスタＲ２に格納されているたことが分かり、この値がレジスタＲ２のレジスタ値として記録される。
なお、トレース番号１０１の時点では、ＬＤＲ命令の実行前のレジスタＲ１のレジスタ値は確定させることができないので、レジスタＲ１の値は空欄である。
そして、図１１の例では、トレース番号１０１におけるレジスタＲ２のレジスタ値が確定することが終了条件なので、レジスタＲ２のレジスタ値が確定した時点で終了条件を満足し、処理を終了する。
【００３７】
解析実行例２（図１２）
終了条件：トレース番号２０３におけるレジスタＲ１とＲ２とＲ３の値が確定すること。
図１２（ａ）は、トレース番号２０２に対し、終了判定処理までを完了した時点の状態を示す。
レジスタＲ２については、図１１の場合と同様に、０ｘ４００００００８が求められ、レジスタＲ２のレジスタ値として記録される。トレース番号２０２では、ＡＤＤ命令なので、未処理フラグにＴｒｕｅが設定され、参照元レジスタであるレジスタＲ１について参照フラグにＴｒｕｅが設定され、代入先レジスタであるレジスタＲ３について代入フラグにＴｒｕｅが設定されている。
図１２（ｂ）は、トレース番号２０１に対し、レジスタ値確定処理までを行った時点の状態を示している。
トレース番号２０１のＬＤＲ命令により、レジスタＲ１に格納されたデータが０ｘ０００００００Ａであることが分かり、一段下のトレース番号２０２のレジスタＲ１のレジスタ値として当該値が記録され、確定フラグがＴｒｕｅとなる。
また、トレース番号２０２のＡＤＤ命令の実行前の参照元レジスタＲ１の値が判明したので、ＡＤＤ命令を実行して、代入先レジスタであるレジスタＲ３の値が０ｘ００００００１１であると分かり、一段下のトレース番号２０３のレジスタＲ３のレジスタ値として当該値が記録され、確定フラグがＴｒｕｅとなる。
図１２（ｃ）は、トレース番号２０２に対し、終了判定処理までを完了した時点で、終了条件を満足した状態を示す。
トレース番号２０３のレジスタＲ１のエントリでは、代入フラグがＴｒｕｅになっていないので、トレース番号２０２の値をそのまま複写して確定フラグをＴｒｕｅとしている。
【００３８】
なお、図１２に示す例において、上述のようにトレース番号２０１のＬＤＲ命令からレジスタＲ１のレジスタ値を確定させ、参照元レジスタＲ１のレジスタ値を用いて演算命令を実行して代入先レジスタＲ３のレジスタ値を求める手順の代わりに、トレース番号２０３のＳＴＲ命令から、レジスタＲ３のレジスタ値はメモリアクセスデータである０ｘ００００００１１であると判断することも可能である。しかし、本実施の形態に係るＣＰＵレジスタ再現装置１００はこのような手法はとらない。
なぜならば、トレース番号２０２のＡＤＤ命令において桁あふれが生じている場合も考えられ、その場合は、トレース番号２０３におけるメモリアクセスデータである０ｘ００００００１１と、ＡＤＤ  Ｒ３←Ｒ１、７の演算結果の間に不一致が生じる。この場合に、トレース番号２０３のメモリアクセスデータに基づくレジスタＲ３のレジスタ値を基準に計算を進めていくと、正しいレジスタ値を得ることができない。このため、本実施の形態に係るＣＰＵレジスタ再現装置１００は、演算命令の全ての参照元レジスタのレジスタ値が確定した後に、確定した参照元レジスタ値を用いて演算命令を実行して、代入先レジスタのレジスタ値を確定させる。
【００３９】
解析実行例３（図１３、図１４）
終了条件：トレース番号３０４におけるレジスタＲ１とＲ２とＲ３とＲ４の値が確定すること。
図１３（ａ）は、トレース番号３０３に対し、終了判定処理までを完了した時点の状態を示す。
トレース番号３０４のエントリの命令はＳＴＲ命令であり、参照元レジスタであるレジスタＲ３の値はメモリアクセスのデータ０ｘ００００００１１に一致するため、この値がレジスタＲ３のレジスタ値として記録される。また、レジスタＲ４については、データの格納先がレジスタＲ４のレジスタ値に８を加算したアドレスであるため、アドレス０ｘ４０００００１０から８を減じた値０ｘ４００００００８がレジスタＲ４のレジスタ値として記録される。また、それぞれの確定フラグにＴｒｕｅが記録される。
図１３（ｂ）は、トレース番号３０２に対し、履歴エントリ追加処理を完了した時点の状態を示す。
トレース番号３０２のＬＤＲ命令により、レジスタＲ１に格納されたデータが０ｘ０００００００４であることが分かり、一段下のトレース番号３０３のレジスタＲ１のレジスタ値として当該値が記録され、確定フラグがＴｒｕｅとなる。
図１３（ｃ）は、トレース番号３０２に対し、終了判定処理までを完了した時点の状態を示す。
トレース番号３０４のレジスタＲ１のエントリでは、代入フラグがＴｒｕｅになっていないので、トレース番号３０３の値をそのまま複写して確定フラグをＴｒｕｅとしている。
図１４（ｄ）は、トレース番号３０１に対し、履歴エントリ追加処理を完了した時点の状態を示す。
トレース番号３０１のＬＤＲ命令により、レジスタＲ２に格納されたデータが０ｘ０００００００Ｄであることが分かり、一段下のトレース番号３０２のレジスタＲ２のレジスタ値として当該値が記録され、確定フラグがＴｒｕｅとなる。
図１４（ｅ）は、トレース番号３０１に対し、終了判定処理までを完了した時点で、終了条件を満足した状態を示す。
トレース番号３０３、３０４のレジスタＲ２のエントリでは、代入フラグがＴｒｕｅになっていないので、トレース番号３０２の値をそのまま複写して確定フラグをＴｒｕｅとしている。
【００４０】
上記のように、本実施の形態によれば、ＣＰＵの命令実行のトレース情報から、所定の時点のＣＰＵレジスタの値を再現することができる。
なお、ＣＰＵの命令実行のトレース情報はＣＰＵの本来の動作に影響を与えずに取得することが可能なため、本技術によって、プログラム動作時のＣＰＵレジスタの値を正確に再現することが可能となり、プログラムの誤動作の解析や原因の追究を効率化することができる。
【００４１】
以上のように、本実施の形態では、レジスタを内蔵するプロセッサとメモリを用いてプログラムを実行するプログラム実行装置おけるプログラムの実行に対する解析を行う解析装置であって、以下の要素を有する解析装置について説明した。
（ａ）初期化部
レジスタ変更履歴データを初期化する。
（ｂ）変更履歴エントリ追加部
プログラム実行中にプロセッサが実行した命令と命令実行によるメモリアクセスのトレースデータを特定の時点から遡りながらひとつずつ取出す。取出したトレースデータの命令がレジスタを参照する命令の場合、レジスタ変更履歴データに、履歴エントリを追加する。
（ｃ）レジスタ値確定部
上記解析や下記演算実行の結果、レジスタの値を確定し、その前後の時点のレジスタ値を見渡してレジスタを変更する命令に行き当たるまで同じ値で確定する。
（ｄ）演算実行部
レジスタ変更履歴データを見渡して、未処理のレジスタ間演算命令のうち、参照元レジスタの値がすべて確定した命令があれば演算を実行し、代入先レジスタの値を演算結果の値で確定する。
（ｅ）終了判定部
所定の時点での所定のレジスタ値が確定したら終了判定の成功とする。
【００４２】
実施の形態２．
実施の形態１では、命令実行トレースデータの特定のトレースエントリにおける特定のレジスタ値が確定した際に処理を終了することとしていたが、本実施の形態では、トレースエントリのトレース番号が、所定の終了トレース番号より小さいか等しい場合に、解析を終了する。
すなわち、レジスタ値が確定・未確定を問わず、所定の終了トレース番号に到達した際に、終了判定部１０６が、変更履歴エントリ追加部１０２に解析の終了を指示し、変更履歴エントリ追加部１０２が処理を終了する。
終了判定処理以外のＣＰＵレジスタ再現装置１００の構成及び処理内容は実施の形態１に示したものと同じである。
【００４３】
このように、本実施の形態によれば、実施の形態１に示した効果に加え、ＣＰＵレジスタ再現処理を効率的に早期に終了することができる。
【００４４】
実施の形態３．
本実施の形態に係るＣＰＵレジスタ再現装置１００では、以下に示す初期化処理を行う。
初期化処理以外の処理は実施の形態１に示すものと同様である。
また、ＣＰＵレジスタ再現装置１００の構成も、実施の形態１に示したものと同様である。
【００４５】
初期化処理
初期化部１０１が、レジスタ変更履歴データをクリアして新たな履歴エントリを挿入し、新たな履歴エントリに対して以下の処理を行う。
（１）未処理フラグにＦａｌｓｅを記録する。
（２）各レジスタ情報エントリの代入フラグ、参照フラグ、確定フラグのそれぞれにＦａｌｓｅを記録する。
（３）各レジスタ情報エントリの値を所定の値で初期化する。
【００４６】
プログラム実行環境２００においてプログラム２０１の実行中に障害が発生した際に、ＣＰＵレジスタ再現装置１００は、命令実行トレースデータ３００とは別に、各レジスタの障害発生時のレジスタ値を示す障害発生時レジスタ値情報をプログラム実行環境２００から取得可能な場合がある。
このような場合に、ＣＰＵレジスタ再現装置１００では、初期化部１０１が、初期化処理として、プログラム実行環境２００から取得した障害発生時レジスタ値情報に示される各レジスタ値をレジスタ変更履歴データのレジスタ情報エントリの値に記録し、プログラム実行環境２００から取得した各レジスタ値に基づいて、プログラム実行中のレジスタ値の変遷を再現する。
【００４７】
本実施の形態では、レジスタの最終的な値が判明しているときに、その値を使ってレジスタ再現処理を開始することで、処理を早期に終了することが可能となる。
また、レジスタ再現処理を繰り返し行って、複数の時点（トレース番号）のレジスタを再現する際に、一度再現した解析結果のレジスタ値を別のレジスタ再現処理に利用することが可能となる。
再現したレジスタ値を別の再現処理の初期値として利用することで、同じ解析処理の繰り返しを省き、処理を効率化できる。
【００４８】
実施の形態４．
図１０は、本実施の形態に係るＣＰＵレジスタ再現装置１００の構成例を示す。
図１０において、関数シンボルデータ４００は、プログラム実行環境２００で実行される関数名と当該関数の先頭アドレス（プログラムカウンタ値）の一覧を示す情報である。
また、関数先頭アドレス１０８は、初期化部１０１により終了条件として設定されたプログラムカウンタ値である。
図２に示すように、命令実行トレースデータには、プログラム実行環境２００のプロセッサがプログラムの実行においてフェッチした命令のプログラムカウンタ値が各エントリに示されている。
変更履歴エントリ追加部１０２は、このような命令実行トレースデータを時系列を遡って解析するが、本実施の形態では、関数先頭アドレス１０８により指定されているプログラムカウンタ値が示されているエントリに到達した際に、命令実行トレースデータの解析及びレジスタ変更履歴データへのエントリの追加を終了し、ＣＰＵレジスタ再現処理を終了する。
【００４９】
本実施の形態では、以下に示す初期化処理と終了判定処理を行う。
初期化処理と終了判定処理以外の処理は実施の形態１に示したものと同じである。
【００５０】
初期化処理
初期化部１０１が、レジスタ変更履歴データをクリアして新たな履歴エントリを挿入し、新たな履歴エントリに対して以下の処理を行う。
（１）未処理フラグにＦａｌｓｅを記録する。
（２）各レジスタ情報エントリの代入フラグ、参照フラグ、確定フラグのそれぞれにＦａｌｓｅを記録する。
（３）関数シンボルデータを探索し、開始トレース番号のトレースエントリのプログラムカウンタのアドレスを含む関数を特定し、その関数の先頭アドレスを終了判定部に通知する。
終了判定処理
トレースエントリのプログラムカウンタが、関数先頭アドレス１０８により指定されている終了プログラムカウンタに等しいときに、終了判定部１０６が、変更履歴エントリ追加部１０２に解析の終了を指示し、変更履歴エントリ追加部１０２が処理を終了する。
【００５１】
このように、本実施の形態によれば、実施の形態１に示した効果に加え、ＣＰＵレジスタ再現処理を効率的に早期に終了することができる。
【００５２】
以上、本実施の形態では、以下の要素を含む解析装置について説明した。
（ｇ）初期化部
レジスタ変更履歴データを初期化する。次に、関数シンボルデータを探索し、開始トレース番号のトレースエントリのプログラムカウンタのアドレスを含む関数を特定し、その関数の先頭アドレスを終了判定部に通知する。
（ｈ）終了判定部
トレースエントリのプログラムカウンタが、関数先頭アドレスにより指定されている終了プログラムカウンタに等しいとき、終了判定の成功とする。
【００５３】
最後に、実施の形態１〜４に示したＣＰＵレジスタ再現装置１００のハードウェア構成例について説明する。
図１５は、実施の形態１〜４に示すＣＰＵレジスタ再現装置１００のハードウェア資源の一例を示す図である。
なお、図１５の構成は、あくまでもＣＰＵレジスタ再現装置１００のハードウェア構成の一例を示すものであり、ＣＰＵレジスタ再現装置１００のハードウェア構成は図１５に記載の構成に限らず、他の構成であってもよい。
【００５４】
図１５において、ＣＰＵレジスタ再現装置１００は、プログラムを実行するＣＰＵ９１１（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ、中央処理装置、処理装置、演算装置、マイクロプロセッサ、マイクロコンピュータ、プロセッサともいう）を備えている。ＣＰＵ９１１は、バス９１２を介して、例えば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）９１３、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）９１４、通信ボード９１５、表示装置９０１、キーボード９０２、マウス９０３、磁気ディスク装置９２０と接続され、これらのハードウェアデバイスを制御する。更に、ＣＰＵ９１１は、ＦＤＤ９０４（Ｆｌｅｘｉｂｌｅ  Ｄｉｓｋ  Ｄｒｉｖｅ）、コンパクトディスク装置９０５（ＣＤＤ）、プリンタ装置９０６、スキャナ装置９０７と接続していてもよい。また、磁気ディスク装置９２０の代わりに、光ディスク装置、メモリカード読み書き装置などの記憶装置でもよい。
ＲＡＭ９１４は、揮発性メモリの一例である。ＲＯＭ９１３、ＦＤＤ９０４、ＣＤＤ９０５、磁気ディスク装置９２０の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置の一例である。
通信ボード９１５、キーボード９０２、マウス３０２、スキャナ装置９０７、ＦＤＤ９０４などは、入力装置の一例である。
また、通信ボード９１５、表示装置９０１、プリンタ装置９０６などは、出力装置の一例である。
【００５５】
通信ボード９１５は、例えば、ＬＡＮ（ローカルエリアネットワーク）、インターネット、ＷＡＮ（ワイドエリアネットワーク）などのネットワークに接続されていても構わない。
磁気ディスク装置９２０には、オペレーティングシステム９２１（ＯＳ）、ウィンドウシステム９２２、プログラム群９２３、ファイル群９２４が記憶されている。プログラム群９２３のプログラムは、ＣＰＵ９１１、オペレーティングシステム９２１、ウィンドウシステム９２２により実行される。
【００５６】
上記プログラム群９２３には、実施の形態１〜４の説明において「〜部」として説明している機能を実行するプログラムが記憶されている。プログラムは、ＣＰＵ９１１により読み出され実行される。
【００５７】
ファイル群９２４には、実施の形態１〜４の説明において、「〜の判断」、「〜の計算」、「〜の比較」、「〜の抽出」、「〜の記録」、「〜の追加」、「〜の設定」、「〜の登録」等として説明している処理の結果を示す情報やデータや信号値や変数値やパラメータが、「〜ファイル」や「〜データベース」の各項目として記憶されている。
「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリになどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してＣＰＵ９１１によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示などのＣＰＵの動作に用いられる。
抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示のＣＰＵの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリ、レジスタ、キャッシュメモリ、バッファメモリ等に一時的に記憶される。
例えば、レジスタ変更履歴データ１０７は、メインメモリであるＲＡＭ９１４、ＣＰＵ９１１内のレジスタ、キャッシュメモリ等に記憶される。
【００５８】
また、実施の形態１〜４で説明しているフローチャートの矢印の部分は主としてデータや信号の入出力を示し、データや信号値は、ＲＡＭ９１４のメモリ、ＦＤＤ９０４のフレキシブルディスク、ＣＤＤ９０５のコンパクトディスク、磁気ディスク装置９２０の磁気ディスク、その他光ディスク、ミニディスク、ＤＶＤ等の記録媒体に記録される。また、データや信号は、バス９１２や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
【００５９】
また、実施の形態１〜４の説明において「〜部」として説明しているものは、「〜回路」、「〜装置」、「〜機器」、であってもよく、また、「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明しているものは、ＲＯＭ９１３に記憶されたファームウェアで実現されていても構わない。或いは、ソフトウェアのみ、或いは、素子・デバイス・基板・配線などのハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、ＤＶＤ等の記録媒体に記憶される。プログラムはＣＰＵ９１１により読み出され、ＣＰＵ９１１により実行される。すなわち、プログラムは、実施の形態１〜４の「〜部」としてコンピュータを機能させるものである。あるいは、実施の形態１〜４の「〜部」の手順や方法をコンピュータに実行させるものである。
【００６０】
このように、実施の形態１〜４に示すＣＰＵレジスタ再現装置１００は、処理装置たるＣＰＵ、記憶装置たるメモリ、磁気ディスク等、入力装置たるキーボード、マウス、通信ボード等、出力装置たる表示装置、通信ボード等を備えるコンピュータであり、上記したように「〜部」として示された機能をこれら処理装置、記憶装置、入力装置、出力装置を用いて実現するものである。
【図面の簡単な説明】
【００６１】
【図１】実施の形態１に係るＣＰＵレジスタ再現装置の構成例を示す図。
【図２】実施の形態１に係る命令実行トレースデータの例を示す図。
【図３】実施の形態１に係るレジスタ更新履歴データの例を示す図。
【図４】従来技術を示す図。
【図５】従来技術を示す図。
【図６】実施の形態１に係るトレースデータ解析処理の例を示すフローチャート図。
【図７】実施の形態１に係る履歴エントリ追加処理の例を示すフローチャート図。
【図８】実施の形態１に係るレジスタ値確定処理の例を示すフローチャート図。
【図９】実施の形態１に係る演算実行処理の例を示すフローチャート図。
【図１０】実施の形態４に係るＣＰＵレジスタ再現装置の構成例を示す図。
【図１１】実施の形態１に係る解析実行例を示す図。
【図１２】実施の形態１に係る解析実行例を示す図。
【図１３】実施の形態１に係る解析実行例を示す図。
【図１４】実施の形態１に係る解析実行例を示す図。
【図１５】実施の形態１〜４に係るＣＰＵレジスタ再現装置のハードウェア構成例を示す図。
【符号の説明】
【００６２】
１００  ＣＰＵレジスタ再現装置、１０１  初期化部、１０２  変更履歴エントリ追加部、１０３  トレース解析部、１０４  レジスタ値確定部、１０５  演算実行部、１０６  終了判定部、１０７  レジスタ変更履歴データ、１０８  関数先頭アドレス、２００  プログラム実行環境、２０１  プログラム、３００  命令実行トレースデータ、４００  関数シンボルデータ。
【図１】
2009020610.tif 000003
【図２】
2009020610.tif 000004
【図３】
2009020610.tif 000005
【図４】
2009020610.tif 000006
【図５】
2009020610.tif 000007
【図６】
2009020610.tif 000008
【図７】
2009020610.tif 000009
【図８】
2009020610.tif 000010
【図９】
2009020610.tif 000011
【図１０】
2009020610.tif 000012
【図１１】
2009020610.tif 000013
【図１２】
2009020610.tif 000014
【図１３】
2009020610.tif 000015
【図１４】
2009020610.tif 000016
【図１５】
2009020610.tif 000017