JP2009020610A - 解析装置及び解析方法及びプログラム - Google Patents
解析装置及び解析方法及びプログラム Download PDFInfo
- Publication number
- JP2009020610A JP2009020610A JP2007181370A JP2007181370A JP2009020610A JP 2009020610 A JP2009020610 A JP 2009020610A JP 2007181370 A JP2007181370 A JP 2007181370A JP 2007181370 A JP2007181370 A JP 2007181370A JP 2009020610 A JP2009020610 A JP 2009020610A
- Authority
- JP
- Japan
- Prior art keywords
- register
- instruction
- entry
- execution
- value
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
【課題】プログラムの実行状況を示す情報から、レジスタ値の変遷を再現する。
【解決手段】変更履歴エントリ追加部102が、プログラム実行環境200でのプログラムの実行中にプロセッサが実行した命令と命令実行によるメモリアクセスの内容が示される命令実行トレースデータ300を特定の時点から遡りながらひとつずつ取出し、取出したトレースデータの命令がレジスタを参照する命令の場合、レジスタ変更履歴データ107に履歴エントリを追加する。演算実行部105が、履歴エントリを見渡して、レジスタ間演算命令に示される演算を実行し、代入先レジスタの値を演算結果の値で確定し、レジスタ値確定部104が、履歴エントリに示されるレジスタ、命令の種類、メモリアクセスの内容、演算実行部105の演算実行結果をもとに、命令実行時の各レジスタの値を確定し、プログラム実行環境200でのプログラム実行中のレジスタ値の変遷を再現する。
【選択図】図1
【解決手段】変更履歴エントリ追加部102が、プログラム実行環境200でのプログラムの実行中にプロセッサが実行した命令と命令実行によるメモリアクセスの内容が示される命令実行トレースデータ300を特定の時点から遡りながらひとつずつ取出し、取出したトレースデータの命令がレジスタを参照する命令の場合、レジスタ変更履歴データ107に履歴エントリを追加する。演算実行部105が、履歴エントリを見渡して、レジスタ間演算命令に示される演算を実行し、代入先レジスタの値を演算結果の値で確定し、レジスタ値確定部104が、履歴エントリに示されるレジスタ、命令の種類、メモリアクセスの内容、演算実行部105の演算実行結果をもとに、命令実行時の各レジスタの値を確定し、プログラム実行環境200でのプログラム実行中のレジスタ値の変遷を再現する。
【選択図】図1
Description
本発明は、例えば、コンピュータプログラムの実行時に利用されたレジスタの内容を再現する技術に関する。
従来のCPUレジスタ再現方式は、デバッグ対象となるプログラムや機器にCPUレジスタ再現に必要な情報を取得するための手段を追加することによって、過去の任意時点のCPUレジスタ状態の再現を行っていた(例えば、特許文献1)。
また、別の従来技術においては、メモリやレジスタに対する書込みの度に書込み直前の値をトレースメモリに退避する命令をデバッグ用プログラムに挿入し、このデバッグ用プログラムを実行すると、バグが存在するときはその影響により実行が停止し、トレースメモリには、実行が停止した位置のアドレス及びその時のレジスタ及びメモリの内容が格納される。そして、トレースメモリの情報を用いて、実行が停止した位置から逆方向にトレースする(例えば、特許文献2)。
また、別の従来技術においては、メモリやレジスタに対する書込みの度に書込み直前の値をトレースメモリに退避する命令をデバッグ用プログラムに挿入し、このデバッグ用プログラムを実行すると、バグが存在するときはその影響により実行が停止し、トレースメモリには、実行が停止した位置のアドレス及びその時のレジスタ及びメモリの内容が格納される。そして、トレースメモリの情報を用いて、実行が停止した位置から逆方向にトレースする(例えば、特許文献2)。
図4は、特許文献1に記載の技術を説明する図である。
図4でのデバッグ手段は、命令実行シミュレータやデバッガが想定されており、被デバッグプログラムの機械語命令を1命令ずつ解釈、実行していく。
バッファ書込み手段は各命令の解釈時に変更されるレジスタ、メモリの内容を実行履歴バッファに格納していく。
逆ステップ実行手段では、上記実行履歴バッファに格納された更新前のレジスタ、メモリの情報を順次書き戻すことで、過去のメモリ内容の再現を実現している。
図4でのデバッグ手段は、命令実行シミュレータやデバッガが想定されており、被デバッグプログラムの機械語命令を1命令ずつ解釈、実行していく。
バッファ書込み手段は各命令の解釈時に変更されるレジスタ、メモリの内容を実行履歴バッファに格納していく。
逆ステップ実行手段では、上記実行履歴バッファに格納された更新前のレジスタ、メモリの情報を順次書き戻すことで、過去のメモリ内容の再現を実現している。
図5は、特許文献2に記載の技術を説明する図である。
図5において、コンパイラは、メモリやレジスタに対する書込みの度に書込み直前の値をトレースメモリに退避する命令が挿入されたデバッグ用プログラムをコンパイルしてトレース用プログラムとし、このトレース用プログラムが実行部で実行されてデバッグが進められる。
デバッグ用プログラムを実行すると、バグが存在するときはその影響により実行が停止し、トレースメモリ3a、3bには、実行が停止した位置のアドレス及びその時のレジスタ及びメモリの内容が格納されている。そして、逆実行部が、実行履歴バッファのデータをもとに、トレース用プログラムを命令ごとに逆実行命令に変換して逆順に実行することで逆方向にトレースする。
特開平5−108404号公報
特開平9−6647号公報
図5において、コンパイラは、メモリやレジスタに対する書込みの度に書込み直前の値をトレースメモリに退避する命令が挿入されたデバッグ用プログラムをコンパイルしてトレース用プログラムとし、このトレース用プログラムが実行部で実行されてデバッグが進められる。
デバッグ用プログラムを実行すると、バグが存在するときはその影響により実行が停止し、トレースメモリ3a、3bには、実行が停止した位置のアドレス及びその時のレジスタ及びメモリの内容が格納されている。そして、逆実行部が、実行履歴バッファのデータをもとに、トレース用プログラムを命令ごとに逆実行命令に変換して逆順に実行することで逆方向にトレースする。
特許文献1に記載のCPUレジスタ再現方式は、デバッグ対象に何らかの変更を行うため、本来のプログラムの動作と、少なからず相違が生じるという課題があった。
また、特許文献2に記載の逆実行デバッグシステムにおいても、トレース用プログラムを命令ごとに逆実行命令に変換するため、本来のプログラムの動作と少なからず相違が生じるという課題があった。
その結果、ソフトウェア障害で最も解析困難なものの1つとされているタイミング障害(互いに副作用を及ぼす複数のプログラムの特異な実行順序の結果生じる障害)の再現を困難し、場合によっては不再現なものとしてしまうという課題があった。
また、特許文献2に記載の逆実行デバッグシステムにおいても、トレース用プログラムを命令ごとに逆実行命令に変換するため、本来のプログラムの動作と少なからず相違が生じるという課題があった。
その結果、ソフトウェア障害で最も解析困難なものの1つとされているタイミング障害(互いに副作用を及ぼす複数のプログラムの特異な実行順序の結果生じる障害)の再現を困難し、場合によっては不再現なものとしてしまうという課題があった。
この発明は、上記のような課題を解決することを主な目的の一つとしており、デバッグ対象のプログラム、機器の通常の動作で得られる情報から、過去の任意時点でのレジスタ状態を再現し、デバッグの効率を向上させることを主な目的とする。
本発明に係る解析装置は、
プロセッサとメモリと前記プロセッサに含まれる一つ以上のレジスタを用いてプログラムを実行するプログラム実行装置におけるプログラムの実行に対する解析を行う解析装置であって、
前記プロセッサがプログラムの実行中に実行した命令の内容と命令実行によるメモリアクセスの内容が時系列で示される複数エントリの命令実行トレースデータの時系列を遡ってエントリごとに命令の内容を解析し、命令にレジスタ識別子が示されているエントリをレジスタ命令エントリとして順次抽出するエントリ抽出部と、
前記エントリ抽出部により抽出されたレジスタ命令エントリに演算命令が示されている場合に、当該演算命令を実行する演算実行部と、
各レジスタ命令エントリの命令に示されているレジスタ識別子、各レジスタ命令エントリに示されているメモリアクセスの内容、及び前記演算実行部による演算命令実行結果を用いて、各レジスタ命令エントリに示されている命令が実行された際の各レジスタのレジスタ値を確定するレジスタ値確定部とを有することを特徴とする。
プロセッサとメモリと前記プロセッサに含まれる一つ以上のレジスタを用いてプログラムを実行するプログラム実行装置におけるプログラムの実行に対する解析を行う解析装置であって、
前記プロセッサがプログラムの実行中に実行した命令の内容と命令実行によるメモリアクセスの内容が時系列で示される複数エントリの命令実行トレースデータの時系列を遡ってエントリごとに命令の内容を解析し、命令にレジスタ識別子が示されているエントリをレジスタ命令エントリとして順次抽出するエントリ抽出部と、
前記エントリ抽出部により抽出されたレジスタ命令エントリに演算命令が示されている場合に、当該演算命令を実行する演算実行部と、
各レジスタ命令エントリの命令に示されているレジスタ識別子、各レジスタ命令エントリに示されているメモリアクセスの内容、及び前記演算実行部による演算命令実行結果を用いて、各レジスタ命令エントリに示されている命令が実行された際の各レジスタのレジスタ値を確定するレジスタ値確定部とを有することを特徴とする。
本発明によれば、プログラム実行装置におけるプログラムの実行状況を示す命令実行トレースデータから、所定時点のプログラム実行装置の各レジスタの値を再現することができる。
命令実行トレースデータは、プロセッサの本来の動作に影響を与えずに取得することが可能なため、プログラム動作時のレジスタの値を正確に再現することが可能となり、プログラムの誤動作の解析や原因の追究を効率化することができる。また、プロセッサの動作に影響を与えないため、タイミング障害の再現が可能となり、デバッグ効率を向上させることができる。
命令実行トレースデータは、プロセッサの本来の動作に影響を与えずに取得することが可能なため、プログラム動作時のレジスタの値を正確に再現することが可能となり、プログラムの誤動作の解析や原因の追究を効率化することができる。また、プロセッサの動作に影響を与えないため、タイミング障害の再現が可能となり、デバッグ効率を向上させることができる。
実施の形態1.
図1は、本実施の形態に係るCPUレジスタ再現装置100の構成例を示す図である。
CPUレジスタ再現装置100は、プログラム実行環境200におけるプログラム201の実行状況を示す命令実行トレースデータ300を取得し、命令実行トレースデータ300を用いて、プログラム実行環境200におけるプログラムの実行に対する解析を行う。CPUレジスタ再現装置100は、解析装置の例である。
プログラム実行環境200は、レジスタを内蔵するプロセッサとメモリを備え、プロセッサとメモリとプロセッサに含まれる一つ以上のレジスタを用いてプログラムを実行するコンピュータであり、プログラム実行装置の例である。
図1は、本実施の形態に係るCPUレジスタ再現装置100の構成例を示す図である。
CPUレジスタ再現装置100は、プログラム実行環境200におけるプログラム201の実行状況を示す命令実行トレースデータ300を取得し、命令実行トレースデータ300を用いて、プログラム実行環境200におけるプログラムの実行に対する解析を行う。CPUレジスタ再現装置100は、解析装置の例である。
プログラム実行環境200は、レジスタを内蔵するプロセッサとメモリを備え、プロセッサとメモリとプロセッサに含まれる一つ以上のレジスタを用いてプログラムを実行するコンピュータであり、プログラム実行装置の例である。
CPUレジスタ再現装置100の内部構成において、初期化部101は、後述するレジスタ変更履歴データを初期化する。
変更履歴エントリ追加部102(エントリ抽出部)は、命令実行トレースデータ300から、トレースエントリをひとつずつ取出し、レジスタ変更履歴データの先頭に履歴エントリを追加する。
トレース解析部103は、変更履歴エントリ追加部102により設定されたフラグ値を参照して、レジスタ値が確定しているか否かを判断する。
レジスタ値確定部104は、新たに確定したレジスタ値があれば、そのレジスタを変更する命令が出現しない範囲の同じレジスタのレジスタ値を確定する。
演算実行部105は、未実行の演算があれば、実行を試みる。参照元レジスタの値がすべて確定していれば、演算は実行できる。
終了判定部106は、解析の終了条件を判定し、条件を満足していれば、解析を終了する。
レジスタ変更履歴データ107は、命令実行トレースデータの各エントリの一部を時系列の逆順に格納する複数エントリからなるテーブルである。
変更履歴エントリ追加部102(エントリ抽出部)は、命令実行トレースデータ300から、トレースエントリをひとつずつ取出し、レジスタ変更履歴データの先頭に履歴エントリを追加する。
トレース解析部103は、変更履歴エントリ追加部102により設定されたフラグ値を参照して、レジスタ値が確定しているか否かを判断する。
レジスタ値確定部104は、新たに確定したレジスタ値があれば、そのレジスタを変更する命令が出現しない範囲の同じレジスタのレジスタ値を確定する。
演算実行部105は、未実行の演算があれば、実行を試みる。参照元レジスタの値がすべて確定していれば、演算は実行できる。
終了判定部106は、解析の終了条件を判定し、条件を満足していれば、解析を終了する。
レジスタ変更履歴データ107は、命令実行トレースデータの各エントリの一部を時系列の逆順に格納する複数エントリからなるテーブルである。
次に、CPUレジスタ再現装置100の内部構成を詳述する前に、命令実行トレースデータ300及びレジスタ変更履歴データ107について説明する。
図2は、命令実行トレースデータ300の例を示す。
命令実行トレースデータ300は、プログラム実行環境200のプロセッサとメモリ間のバス上に流れるデータを時間順に整列させた情報である。つまり、命令実行トレースデータ300は、プログラム実行環境200のプロセッサがプログラムの実行中に実行した命令の内容と命令実行によるメモリアクセスの内容が時系列で示される複数エントリの情報である。
命令実行トレースデータ300は、複数のトレースエントリからなり、各トレースエントリは、(1)トレース番号、(2)プログラムカウンタ、(3)命令、(4)メモリアクセスのアドレス、(5)メモリアクセスのデータの5要素からなる。
(1)トレース番号は、トレースエントリの識別番号である。
(2)プログラムカウンタ値(PC値)は、プログラム実行のためにフェッチされた命令のアドレスを示す。
(3)命令は、そのPC値でフェッチされた命令を示す。命令において、LDRはロード命令を示し、ADDは加算命令を示し、STRはストア命令を示す。また、R1、R2等は、レジスタの識別子である。また、本実施の形態では、説明の簡明のため、演算命令の例としてADD命令を用いて説明するが、他の種類の演算命令(算術演算命令、論理演算命令)が含まれていてもよい。
(4)メモリアクセスアドレスは、命令の実行によってアクセスされたメモリのアドレスを示す。
(5)メモリアクセスデータは、メモリアクセスの結果メモリバス上に流れたデータ(LDRの場合はメモリからレジスタに読込んだ値、STRの場合はレジスタからメモリに書き込んだ値)を示す。
命令実行トレースデータ300は、プログラム実行環境200のプロセッサとメモリ間のバス上に流れるデータを時間順に整列させた情報である。つまり、命令実行トレースデータ300は、プログラム実行環境200のプロセッサがプログラムの実行中に実行した命令の内容と命令実行によるメモリアクセスの内容が時系列で示される複数エントリの情報である。
命令実行トレースデータ300は、複数のトレースエントリからなり、各トレースエントリは、(1)トレース番号、(2)プログラムカウンタ、(3)命令、(4)メモリアクセスのアドレス、(5)メモリアクセスのデータの5要素からなる。
(1)トレース番号は、トレースエントリの識別番号である。
(2)プログラムカウンタ値(PC値)は、プログラム実行のためにフェッチされた命令のアドレスを示す。
(3)命令は、そのPC値でフェッチされた命令を示す。命令において、LDRはロード命令を示し、ADDは加算命令を示し、STRはストア命令を示す。また、R1、R2等は、レジスタの識別子である。また、本実施の形態では、説明の簡明のため、演算命令の例としてADD命令を用いて説明するが、他の種類の演算命令(算術演算命令、論理演算命令)が含まれていてもよい。
(4)メモリアクセスアドレスは、命令の実行によってアクセスされたメモリのアドレスを示す。
(5)メモリアクセスデータは、メモリアクセスの結果メモリバス上に流れたデータ(LDRの場合はメモリからレジスタに読込んだ値、STRの場合はレジスタからメモリに書き込んだ値)を示す。
図3は、レジスタ変更履歴データ107の例を示す。
レジスタ変更履歴データ107は、命令実行トレースデータ300の各トレースエントリをレジスタごとに管理するためのテーブルである。
レジスタ変更履歴データ107は、複数の履歴エントリからなり、各履歴エントリは、(1)トレース番号、(2)未処理フラグ、(3)命令、(4)レジスタ情報の4要素からなる。
また、(4)レジスタ情報は、複数のレジスタ情報エントリからなり、各レジスタ情報エントリは、(4−1)代入フラグ、(4−2)参照フラグ、(4−3)確定フラグ、(4−4)値の4要素からなる。
トレース番号(1)には、命令実行トレースデータ300の各トレースエントリのトレース番号が挿入される。
(2)未処理フラグは、演算命令が完了しているか否かを示すフラグであり、演算命令が未完了の場合はフラグ値がTrueとなり、演算命令が完了している場合又は演算命令以外の命令の場合はフラグ値がFalseとなる。
(3)命令は、命令実行トレースデータ300のトレースエントリに示される命令の内容が記述される。
(4)レジスタ情報は、命令実行トレースデータ300の命令に示されるレジスタごとに区分されている。
(4)レジスタ情報において、
(4−1)代入フラグは、命令の実行の際に値が代入されるレジスタであるか否かを表すフラグであり、値が代入されるレジスタの場合はフラグ値がTrueになる。
(4−2)参照フラグは、命令の実行の際に値が参照されるレジスタであるか否かを表すフラグである。値が参照されるレジスタの場合はフラグ値がTrueになる。
(4−3)確定フラグは、レジスタ値が確定済であるか否かを表すフラグである。レジスタ値が確定済である場合はフラグ値がTrueになる。
(4−4)値は、各履歴エントリ(又は各履歴エントリに対応するトレースエントリ)に示される命令の実行直前のレジスタ値を示す。但し、確定フラグがFalseのときは、レジスタ値は確定しておらず、当該レジスタ値は更新される可能性がある。
図11〜図14は、運用されているレジスタ変更履歴データ107の例を示している。
本実施の形態では、レジスタ変更履歴データ107は、例えば、図12に示すように、時間的に新しいトレースエントリに対応する履歴エントリ(トレース番号203)の上に順次時間的に古いトレースエントリに対応する履歴エントリ(トレース番号202、201)を積み重ねることにより生成される。なお、レジスタ変更履歴データ107における履歴エントリの構成、配列の順序は、図11〜図14に示す例に限るものではない。
また、図11〜図14では、説明のために、図3には含まれていないメモリアクセスの情報を含ませており、また、記述形式の一部を変更している。
図11〜図14の各々の詳細は、後述する。
レジスタ変更履歴データ107は、命令実行トレースデータ300の各トレースエントリをレジスタごとに管理するためのテーブルである。
レジスタ変更履歴データ107は、複数の履歴エントリからなり、各履歴エントリは、(1)トレース番号、(2)未処理フラグ、(3)命令、(4)レジスタ情報の4要素からなる。
また、(4)レジスタ情報は、複数のレジスタ情報エントリからなり、各レジスタ情報エントリは、(4−1)代入フラグ、(4−2)参照フラグ、(4−3)確定フラグ、(4−4)値の4要素からなる。
トレース番号(1)には、命令実行トレースデータ300の各トレースエントリのトレース番号が挿入される。
(2)未処理フラグは、演算命令が完了しているか否かを示すフラグであり、演算命令が未完了の場合はフラグ値がTrueとなり、演算命令が完了している場合又は演算命令以外の命令の場合はフラグ値がFalseとなる。
(3)命令は、命令実行トレースデータ300のトレースエントリに示される命令の内容が記述される。
(4)レジスタ情報は、命令実行トレースデータ300の命令に示されるレジスタごとに区分されている。
(4)レジスタ情報において、
(4−1)代入フラグは、命令の実行の際に値が代入されるレジスタであるか否かを表すフラグであり、値が代入されるレジスタの場合はフラグ値がTrueになる。
(4−2)参照フラグは、命令の実行の際に値が参照されるレジスタであるか否かを表すフラグである。値が参照されるレジスタの場合はフラグ値がTrueになる。
(4−3)確定フラグは、レジスタ値が確定済であるか否かを表すフラグである。レジスタ値が確定済である場合はフラグ値がTrueになる。
(4−4)値は、各履歴エントリ(又は各履歴エントリに対応するトレースエントリ)に示される命令の実行直前のレジスタ値を示す。但し、確定フラグがFalseのときは、レジスタ値は確定しておらず、当該レジスタ値は更新される可能性がある。
図11〜図14は、運用されているレジスタ変更履歴データ107の例を示している。
本実施の形態では、レジスタ変更履歴データ107は、例えば、図12に示すように、時間的に新しいトレースエントリに対応する履歴エントリ(トレース番号203)の上に順次時間的に古いトレースエントリに対応する履歴エントリ(トレース番号202、201)を積み重ねることにより生成される。なお、レジスタ変更履歴データ107における履歴エントリの構成、配列の順序は、図11〜図14に示す例に限るものではない。
また、図11〜図14では、説明のために、図3には含まれていないメモリアクセスの情報を含ませており、また、記述形式の一部を変更している。
図11〜図14の各々の詳細は、後述する。
以上を前提に、図1に示すCPUレジスタ再現装置100における主要構成要素の詳細を説明する。
変更履歴エントリ追加部102は、命令実行トレースデータの時系列を遡ってエントリごとに命令の内容を解析し、命令にレジスタ識別子が示されているエントリをレジスタ命令エントリとして順次抽出する。そして、レジスタ命令エントリを抽出する度に、図3に示す履歴エントリを生成する。つまり、レジスタ命令エントリとは、図3の各履歴エントリのことである。
履歴エントリの生成に際して、変更履歴エントリ追加部102は、レジスタ識別子ごとの確定フラグをFalse(無効)にする。また、変更履歴エントリ追加部102は、抽出したレジスタ命令エントリに示される命令を解析して命令の実行における各レジスタの役割を解析し、値が代入される役割のレジスタのレジスタ識別子に対しては代入フラグをTrue(有効)とし、値が参照される役割のレジスタのレジスタ識別子に対しては参照フラグをTrue(有効)とする。
変更履歴エントリ追加部102は、命令実行トレースデータの時系列を遡ってエントリごとに命令の内容を解析し、命令にレジスタ識別子が示されているエントリをレジスタ命令エントリとして順次抽出する。そして、レジスタ命令エントリを抽出する度に、図3に示す履歴エントリを生成する。つまり、レジスタ命令エントリとは、図3の各履歴エントリのことである。
履歴エントリの生成に際して、変更履歴エントリ追加部102は、レジスタ識別子ごとの確定フラグをFalse(無効)にする。また、変更履歴エントリ追加部102は、抽出したレジスタ命令エントリに示される命令を解析して命令の実行における各レジスタの役割を解析し、値が代入される役割のレジスタのレジスタ識別子に対しては代入フラグをTrue(有効)とし、値が参照される役割のレジスタのレジスタ識別子に対しては参照フラグをTrue(有効)とする。
レジスタ値確定部104は、各レジスタ命令エントリの命令に示されているレジスタ識別子、各レジスタ命令エントリに示されているメモリアクセスの内容、及び演算実行部105による演算命令行結果を用いて、各レジスタ命令エントリに示されている命令が実行された際(命令実行直前)の各レジスタのレジスタ値を確定する。
また、レジスタ値確定部104は、いずれかのレジスタ命令エントリに示されている命令が実行された際のいずれかのレジスタのレジスタ値を確定した場合に、当該確定したレジスタ値を用いて、他のレジスタ命令エントリに示されている命令が実行された際のいずれかのレジスタのレジスタ値を確定し、プログラム実行環境200のプロセッサによるプログラムの実行中のレジスタ値の変遷を再現する。
具体的には、レジスタ値確定部104は、レジスタ命令エントリにレジスタ識別子が含まれる演算命令が示されている場合に、当該演算命令よりも以前に実行された命令に対応するレジスタ命令エントリを解析して、当該演算命令に含まれているレジスタ識別子に対応するレジスタの当該演算命令の実行の際のレジスタ値を確定する。
また、レジスタ値確定部104は、演算命令以外の命令が示されているレジスタ命令エントリに対して、各レジスタ命令エントリの命令に示されているレジスタ識別子、及び各レジスタ命令エントリに示されているメモリアドレス及びデータの少なくともいずれかを用いて、命令の実行の際のレジスタ値を確定する。
更に、レジスタ値確定部104は、履歴エントリの確定フラグを参照し、確定フラグがFalse(無効)であるレジスタ識別子に対応するレジスタのレジスタ値を確定し、レジスタ値が確定する度に、履歴エントリの対応するレジスタ識別子に対してレジスタ値を記述するとともに確定フラグをTrue(有効)にする。
また、レジスタ値確定部104は、演算実行部105の演算命令の実行の結果得られた値を当該履歴エントリの代入フラグがTrue(有効)になっているレジスタ識別子に対して記述するとともに確定フラグをTrue(有効)にする。
また、レジスタ値確定部104は、いずれかのレジスタ命令エントリに示されている命令が実行された際のいずれかのレジスタのレジスタ値を確定した場合に、当該確定したレジスタ値を用いて、他のレジスタ命令エントリに示されている命令が実行された際のいずれかのレジスタのレジスタ値を確定し、プログラム実行環境200のプロセッサによるプログラムの実行中のレジスタ値の変遷を再現する。
具体的には、レジスタ値確定部104は、レジスタ命令エントリにレジスタ識別子が含まれる演算命令が示されている場合に、当該演算命令よりも以前に実行された命令に対応するレジスタ命令エントリを解析して、当該演算命令に含まれているレジスタ識別子に対応するレジスタの当該演算命令の実行の際のレジスタ値を確定する。
また、レジスタ値確定部104は、演算命令以外の命令が示されているレジスタ命令エントリに対して、各レジスタ命令エントリの命令に示されているレジスタ識別子、及び各レジスタ命令エントリに示されているメモリアドレス及びデータの少なくともいずれかを用いて、命令の実行の際のレジスタ値を確定する。
更に、レジスタ値確定部104は、履歴エントリの確定フラグを参照し、確定フラグがFalse(無効)であるレジスタ識別子に対応するレジスタのレジスタ値を確定し、レジスタ値が確定する度に、履歴エントリの対応するレジスタ識別子に対してレジスタ値を記述するとともに確定フラグをTrue(有効)にする。
また、レジスタ値確定部104は、演算実行部105の演算命令の実行の結果得られた値を当該履歴エントリの代入フラグがTrue(有効)になっているレジスタ識別子に対して記述するとともに確定フラグをTrue(有効)にする。
演算実行部105は、レジスタ命令エントリに演算命令が示されている場合に、当該演算命令を実行する。
また、演算実行部105は、レジスタ命令エントリにレジスタ識別子が含まれる演算命令が示されている場合に、当該レジスタ識別子に対応するレジスタの当該演算命令の実行の際のレジスタ値がレジスタ値確定部104により確定したときに、当該レジスタ値を用いて演算命令を実行する。
更に、演算実行部105は、履歴エントリの代入フラグ及び参照フラグを参照し、履歴エントリの代入フラグ及び参照フラグがTrue(有効)になっている場合に、参照フラグがTrue(有効)になっているレジスタ識別子に対して記述されているレジスタ値を用いて、当該履歴エントリに対応するレジスタ命令エントリに示されている演算命令を実行する。
また、演算実行部105は、レジスタ命令エントリにレジスタ識別子が含まれる演算命令が示されている場合に、当該レジスタ識別子に対応するレジスタの当該演算命令の実行の際のレジスタ値がレジスタ値確定部104により確定したときに、当該レジスタ値を用いて演算命令を実行する。
更に、演算実行部105は、履歴エントリの代入フラグ及び参照フラグを参照し、履歴エントリの代入フラグ及び参照フラグがTrue(有効)になっている場合に、参照フラグがTrue(有効)になっているレジスタ識別子に対して記述されているレジスタ値を用いて、当該履歴エントリに対応するレジスタ命令エントリに示されている演算命令を実行する。
次に、図6〜図9を参照して、本実施の形態に係るCPUレジスタ再現装置100の動作例を説明する。
先ず、ステップS100にて、初期化部101が、初期化処理を行う。
具体的には、初期化部101は、レジスタ変更履歴データ107をクリアして新たな履歴エントリを挿入し、新たな履歴エントリに対して以下の処理を行う。
(1)未処理フラグにFalseを記録する。
(2)各レジスタ情報エントリの代入フラグ、参照フラグ、確定フラグのそれぞれにFalseを記録する。
先ず、ステップS100にて、初期化部101が、初期化処理を行う。
具体的には、初期化部101は、レジスタ変更履歴データ107をクリアして新たな履歴エントリを挿入し、新たな履歴エントリに対して以下の処理を行う。
(1)未処理フラグにFalseを記録する。
(2)各レジスタ情報エントリの代入フラグ、参照フラグ、確定フラグのそれぞれにFalseを記録する。
次に、CPUレジスタ再現装置100では、命令実行トレースデータのトレースエントリを時系列とは逆順に処理して、終了条件に合致するまで、ステップS200〜S800を繰り返し実行する。
先ず、ステップS200では、変更履歴エントリ追加部102が、履歴エントリ追加処理を行う(エントリ抽出ステップ)。
履歴エントリ追加処理の詳細は、図7のフローチャートを参照して後述するが、履歴エントリ追加処理の概略を説明すると、変更履歴エントリ追加部102が命令実行トレースデータから、トレースエントリを逆順に(トレース番号の大きいほうから小さいほうに向けて)ひとつずつ取出す。もし、トレースエントリの命令がレジスタにアクセスする命令であれば(命令にレジスタ識別子が含まれていれば)、レジスタ変更履歴データの先頭の履歴エントリの全体をコピーした新たな履歴エントリを先頭に挿入し、新たな履歴エントリに対して所定の方法でデータを記録する。
履歴エントリ追加処理の詳細は、図7のフローチャートを参照して後述するが、履歴エントリ追加処理の概略を説明すると、変更履歴エントリ追加部102が命令実行トレースデータから、トレースエントリを逆順に(トレース番号の大きいほうから小さいほうに向けて)ひとつずつ取出す。もし、トレースエントリの命令がレジスタにアクセスする命令であれば(命令にレジスタ識別子が含まれていれば)、レジスタ変更履歴データの先頭の履歴エントリの全体をコピーした新たな履歴エントリを先頭に挿入し、新たな履歴エントリに対して所定の方法でデータを記録する。
次に、ステップS300において、トレース解析部103が、変更履歴エントリ追加部102により付与された確定フラグの値を確認し、ステップS400においてレジスタ値が確定しているか否かを判断する。
レジスタ値が確定している場合は、ステップS500に進み、レジスタ値確定処理が行われる。他方、レジスタ値が確定していない場合は、ステップS700に進み、終了判定処理が行われる。
レジスタ値が確定している場合は、ステップS500に進み、レジスタ値確定処理が行われる。他方、レジスタ値が確定していない場合は、ステップS700に進み、終了判定処理が行われる。
次に、ステップS500において、レジスタ値確定部104が、レジスタ値確定処理を行う(レジスタ値確定ステップ)。
レジスタ値確定処理の詳細は、図8のフローチャートを参照して後述するが、レジスタ値確定処理の概略を説明すると、レジスタ値確定部104が、レジスタ変更履歴データの指定されたトレース番号の後の履歴エントリを探索し、指定されたレジスタの代入フラグがFalseとなっている連続する範囲の各エントリに対して、指定されたレジスタの値を記録して確定フラグにTrueを記録する。
レジスタ値確定処理の詳細は、図8のフローチャートを参照して後述するが、レジスタ値確定処理の概略を説明すると、レジスタ値確定部104が、レジスタ変更履歴データの指定されたトレース番号の後の履歴エントリを探索し、指定されたレジスタの代入フラグがFalseとなっている連続する範囲の各エントリに対して、指定されたレジスタの値を記録して確定フラグにTrueを記録する。
次に、ステップS600において、演算実行部105が、演算実行処理を行う(演算実行ステップ)。
演算実行処理の詳細は、図9のフローチャートを参照して後述するが、演算実行部105が、レジスタ変更履歴データを探索し、未処理フラグがTrueの履歴エントリのうち、参照フラグがTrueのすべてのレジスタ情報エントリの確定フラグがTrueとなっている履歴エントリがある限り、そのようなすべての履歴エントリに対して以下の処理を行う。
(1)未処理フラグにFalseを記録する。
(2)参照フラグがTrueとなっているレジスタ情報エントリの値を使って命令の演算結果を計算し、代入フラグがTrueとなっているレジスタ情報エントリの値に対してレジスタのレジスタ値確定処理を行う。
演算実行処理の詳細は、図9のフローチャートを参照して後述するが、演算実行部105が、レジスタ変更履歴データを探索し、未処理フラグがTrueの履歴エントリのうち、参照フラグがTrueのすべてのレジスタ情報エントリの確定フラグがTrueとなっている履歴エントリがある限り、そのようなすべての履歴エントリに対して以下の処理を行う。
(1)未処理フラグにFalseを記録する。
(2)参照フラグがTrueとなっているレジスタ情報エントリの値を使って命令の演算結果を計算し、代入フラグがTrueとなっているレジスタ情報エントリの値に対してレジスタのレジスタ値確定処理を行う。
次に、ステップS700において、終了判定部106が、終了判定処理を行う。
終了判定処理では、レジスタ変更履歴データの、所定のトレース番号の履歴エントリの、所定のレジスタに対応するレジスタ情報エントリの確定フラグがTrueの場合に解析を終了する(S800でYES)。
解析を終了しない場合は、履歴エントリ追加処理に戻り、一連の処理(履歴エントリ追加処理、レジスタ値確定処理、演算実行処理、終了判定処理)を繰り返す(S800でNO)。
終了判定処理では、レジスタ変更履歴データの、所定のトレース番号の履歴エントリの、所定のレジスタに対応するレジスタ情報エントリの確定フラグがTrueの場合に解析を終了する(S800でYES)。
解析を終了しない場合は、履歴エントリ追加処理に戻り、一連の処理(履歴エントリ追加処理、レジスタ値確定処理、演算実行処理、終了判定処理)を繰り返す(S800でNO)。
次に、図7を用いて、変更履歴エントリ追加部102による履歴エントリ追加処理の詳細を説明する。
先ず、変更履歴エントリ追加部102は、命令実行トレースデータ300のトレースエントリを一つずつ逆順に取出す(S2001)。逆順とは、時間的に新しいトレースエントリから古いトレースエントリに遡る順序である。
そして、変更履歴エントリ追加部102は、取出したトレースエントリに示されている命令の種類がレジスタにアクセスする命令であるか否か、すなわち、命令にレジスタ識別子が示されているか否かを判断する(S2002)。
レジスタにアクセスする命令でない場合、変更履歴エントリ追加部102は履歴エントリ追加処理を終了する。
他方、レジスタにアクセスする命令の場合、変更履歴エントリ追加部102は、当該トレースエントリをレジスタ命令エントリとして抽出し、レジスタ変更履歴データの先頭に新たな履歴エントリを追加し(S2003)、新しい履歴エントリのトレース番号にレジスタ命令エントリのトレース番号を記録する(S2004)。また、一つ前の履歴エントリ(一つ前に処理した履歴エントリ)から、全レジスタ情報エントリの確定フラグと値をコピーし(S2005)、全レジスタ情報エントリの代入フラグと参照フラグにFalseを記録する(S2006)。
先ず、変更履歴エントリ追加部102は、命令実行トレースデータ300のトレースエントリを一つずつ逆順に取出す(S2001)。逆順とは、時間的に新しいトレースエントリから古いトレースエントリに遡る順序である。
そして、変更履歴エントリ追加部102は、取出したトレースエントリに示されている命令の種類がレジスタにアクセスする命令であるか否か、すなわち、命令にレジスタ識別子が示されているか否かを判断する(S2002)。
レジスタにアクセスする命令でない場合、変更履歴エントリ追加部102は履歴エントリ追加処理を終了する。
他方、レジスタにアクセスする命令の場合、変更履歴エントリ追加部102は、当該トレースエントリをレジスタ命令エントリとして抽出し、レジスタ変更履歴データの先頭に新たな履歴エントリを追加し(S2003)、新しい履歴エントリのトレース番号にレジスタ命令エントリのトレース番号を記録する(S2004)。また、一つ前の履歴エントリ(一つ前に処理した履歴エントリ)から、全レジスタ情報エントリの確定フラグと値をコピーし(S2005)、全レジスタ情報エントリの代入フラグと参照フラグにFalseを記録する(S2006)。
次に、変更履歴エントリ追加部102は、現在対象としているレジスタ命令エントリに示されている命令が演算命令であるか否かを判断し(S2007)、演算命令でない場合(S2007でNO)は、当該履歴エントリの未処理フラグにFalseを記録する(S2008)。
次に、変更履歴エントリ追加部102は、現在対象としているレジスタ命令エントリに示されている命令がレジスタに代入しない命令(STR命令)か、レジスタに代入する命令(LDR命令)かを判断する(S2009)。
レジスタに代入しない命令(STR命令)である場合は、参照元レジスタ値を計算してレジスタ情報エントリの値の欄に計算結果を記録し、更に、確定フラグにTrueを記録する(S2014)。
レジスタに代入する命令(LDR命令)である場合は、代入先レジスタ値を計算して、代入先レジスタのレジスタ情報エントリ(履歴エントリにおける下の行のレジスタ情報エントリ)の値の欄に計算結果を記録し、確定フラグにTrueを記録する(S2015)。また、代入先レジスタのレジスタ情報エントリの代入フラグにTrueを記録し、確定フラグにFalseを記録する(S2013)。
また、アドレス間接参照の命令の場合は、オフセット用の参照元レジスタ値を計算してレジスタ情報エントリの値の欄に計算結果を記録し、確定フラグにTrueを記録する(S2016)。
次に、変更履歴エントリ追加部102は、現在対象としているレジスタ命令エントリに示されている命令がレジスタに代入しない命令(STR命令)か、レジスタに代入する命令(LDR命令)かを判断する(S2009)。
レジスタに代入しない命令(STR命令)である場合は、参照元レジスタ値を計算してレジスタ情報エントリの値の欄に計算結果を記録し、更に、確定フラグにTrueを記録する(S2014)。
レジスタに代入する命令(LDR命令)である場合は、代入先レジスタ値を計算して、代入先レジスタのレジスタ情報エントリ(履歴エントリにおける下の行のレジスタ情報エントリ)の値の欄に計算結果を記録し、確定フラグにTrueを記録する(S2015)。また、代入先レジスタのレジスタ情報エントリの代入フラグにTrueを記録し、確定フラグにFalseを記録する(S2013)。
また、アドレス間接参照の命令の場合は、オフセット用の参照元レジスタ値を計算してレジスタ情報エントリの値の欄に計算結果を記録し、確定フラグにTrueを記録する(S2016)。
アドレス間接参照命令とは、例えば、図11のトレース番号102のSTR命令やトレース番号101のLDR命令に示されるように、レジスタにメモリアドレスの値が格納されており、レジスタに格納されている値に対応するメモリアドレス(又はレジスタに格納されているメモリアドレスの値を用いた演算により得られる値に対応するメモリアドレス)にデータを格納し、若しくはレジスタに格納されている値に対応するメモリアドレス(又はレジスタに格納されているメモリアドレスの値を用いた演算により得られる値に対応するメモリアドレス)からデータを読み出す命令である。
なお、トレース番号102のSTR命令における{R2+8}は、レジスタR2に格納されているメモリアドレスに8を加算したメモリアドレスを意味し、LRD R1→{R2+8}とは、レジスタR1に格納されているデータをレジスタR2に格納されているメモリアドレスに8を加算したメモリアドレスに格納するという命令である。
トレース番号101のLDRにおける{R2}は、レジスタR2に格納されているメモリアドレスを意味し、STR R1←{R2}とは、レジスタR2に格納されているメモリアドレスからデータをレジスタR1に読み出すという命令である。
なお、トレース番号102のSTR命令における{R2+8}は、レジスタR2に格納されているメモリアドレスに8を加算したメモリアドレスを意味し、LRD R1→{R2+8}とは、レジスタR1に格納されているデータをレジスタR2に格納されているメモリアドレスに8を加算したメモリアドレスに格納するという命令である。
トレース番号101のLDRにおける{R2}は、レジスタR2に格納されているメモリアドレスを意味し、STR R1←{R2}とは、レジスタR2に格納されているメモリアドレスからデータをレジスタR1に読み出すという命令である。
例えば、図11のトレース番号102のエントリでは、STR命令なので、未処理フラグがFalseになっている。また、トレース番号102のSTR命令における参照元レジスタはレジスタR1であり、この参照元レジスタR1のレジスタ値とは、メモリアクセスデータである0x00000011である。このため、レジスタR1のレジスタ情報エントリの値の欄に当該値が記録される。
そして、レジスタR1の確定フラグはTrueとなる。
また、トレース番号102の命令は、アドレス間接参照命令であり、オフセット用の参照元レジスタR2の値は、メモリアクセスのアドレスである0x40000010から8を引いた値0x40000008がレジスタR2のレジスタ値となり、レジスタR2のレジスタ情報エントリの値の欄に当該値が記録される。そして、レジスタR2の確定フラグはTrueとなる。
そして、レジスタR1の確定フラグはTrueとなる。
また、トレース番号102の命令は、アドレス間接参照命令であり、オフセット用の参照元レジスタR2の値は、メモリアクセスのアドレスである0x40000010から8を引いた値0x40000008がレジスタR2のレジスタ値となり、レジスタR2のレジスタ情報エントリの値の欄に当該値が記録される。そして、レジスタR2の確定フラグはTrueとなる。
また、図11のトレース番号101のエントリでは、LDR命令なので、未処理フラグがFalseになっている。
また、トレース番号101のLDR命令における代入先レジスタはレジスタR1であり、この代入先レジスタR1のレジスタ値とは、メモリアクセスデータである0x00000011である。
このため、一段下の行であるトレース番号102のレジスタR1のレジスタ情報エントリの値の欄に当該値が記録される。
そして、トレース番号102のエントリのレジスタR1の確定フラグはTrueとなる。
更に、トレース番号101のエントリのレジスタR1の代入フラグにTrueが記録され、確定フラグにはFalseが記録される。なお、トレース番号101の時点では、LDR命令の実行前のレジスタR1のレジスタ値は確定させることができないので、レジスタR1の値は空欄である。
また、トレース番号102の命令は、アドレス間接参照命令であり、オフセット用の参照元レジスタR2の値は、メモリアクセスのアドレスである0x40000008となり、レジスタR2のレジスタ情報エントリの値の欄に当該値が記録される。そして、レジスタR2の確定フラグはTrueとなる。
また、トレース番号101のLDR命令における代入先レジスタはレジスタR1であり、この代入先レジスタR1のレジスタ値とは、メモリアクセスデータである0x00000011である。
このため、一段下の行であるトレース番号102のレジスタR1のレジスタ情報エントリの値の欄に当該値が記録される。
そして、トレース番号102のエントリのレジスタR1の確定フラグはTrueとなる。
更に、トレース番号101のエントリのレジスタR1の代入フラグにTrueが記録され、確定フラグにはFalseが記録される。なお、トレース番号101の時点では、LDR命令の実行前のレジスタR1のレジスタ値は確定させることができないので、レジスタR1の値は空欄である。
また、トレース番号102の命令は、アドレス間接参照命令であり、オフセット用の参照元レジスタR2の値は、メモリアクセスのアドレスである0x40000008となり、レジスタR2のレジスタ情報エントリの値の欄に当該値が記録される。そして、レジスタR2の確定フラグはTrueとなる。
なお、図11〜図14では、STR命令、LDR命令の場合も命令の内容が、履歴エントリの命令欄に記述されることになっているが、STR命令、LDR命令の場合は命令内容を記述しなくてもよい。図7のフローチャートでは、STR命令、LDR命令の場合は命令内容を記述しないこととしている。
図7において、ステップS2007の判断で、現在対象としているレジスタ命令エントリに示されている命令が演算命令である場合(S2007でYES)、変更履歴エントリ追加部102は、当該履歴エントリの未処理フラグにTrueを記録する(S2010)。
また、変更履歴エントリ追加部102は、当該履歴エントリの命令欄に、トレースデータの命令(現在対象としているレジスタ命令エントリに示されている命令)を記録する(S2011)。
次に、変更履歴エントリ追加部102は、当該履歴エントリにおいて、参照元となるレジスタのレジスタ情報エントリの参照フラグにTrueを記録する(S2012)。
そして、変更履歴エントリ追加部102は、代入先のレジスタ情報エントリの代入フラグにTrueを記録し、確定フラグにFalseを記録する(S2013)。
更に、アドレス間接参照の命令の場合は、オフセット用の参照元レジスタ値を計算してレジスタ情報エントリの値の欄に計算結果を記録し、確定フラグにTrueを記録する(S2016)。
また、変更履歴エントリ追加部102は、当該履歴エントリの命令欄に、トレースデータの命令(現在対象としているレジスタ命令エントリに示されている命令)を記録する(S2011)。
次に、変更履歴エントリ追加部102は、当該履歴エントリにおいて、参照元となるレジスタのレジスタ情報エントリの参照フラグにTrueを記録する(S2012)。
そして、変更履歴エントリ追加部102は、代入先のレジスタ情報エントリの代入フラグにTrueを記録し、確定フラグにFalseを記録する(S2013)。
更に、アドレス間接参照の命令の場合は、オフセット用の参照元レジスタ値を計算してレジスタ情報エントリの値の欄に計算結果を記録し、確定フラグにTrueを記録する(S2016)。
例えば、図12(a)のトレース番号202のエントリでは、ADD命令が示されており、未処理フラグがTrueになっている。
また、このADD命令では、レジスタR1が参照元レジスタであり、レジスタR3が代入先レジスタである。このため、レジスタR1の参照フラグがTrueになっており、また、レジスタR3の代入フラグがTrueになっている。
また、このADD命令では、レジスタR1が参照元レジスタであり、レジスタR3が代入先レジスタである。このため、レジスタR1の参照フラグがTrueになっており、また、レジスタR3の代入フラグがTrueになっている。
次に、図8を参照して、レジスタ値確定部104によるレジスタ値確定処理の詳細を説明する。
図8のレジスタ値確定処理は、図6のステップS400においてトレース解析部103による確定フラグの確認により処理の対象となっている履歴エントリのいずれかのレジスタ値が確定していると判断された後に行われる。
レジスタ値確定部104は、ステップS5001とS5002から構成されるループ2を実行する。
ループ2では、現在処理の対象となっている履歴エントリから順方向に履歴エントリを処理する。順方向とは、時間的に古い命令実行についての履歴エントリから新しい命令実行についての履歴エントリに向かう方向であり、トレース番号の小さい履歴エントリから大きい履歴エントリに向かう方向(例えば、図12のトレース番号201から203に向かう方向)である。
図7のS2001に示すように、変更履歴エントリ追加部102は、命令実行トレースデータを逆順(時間的に新しいトレースエントリから古いトレースエントリに遡る順序)に処理し、履歴エントリも命令実行トレースデータの逆順で生成されるため、現在処理の対象としている履歴エントリよりも時間的に新しい(トレース番号が大きい)履歴エントリは存在しており、履歴エントリを順方向に探索することができる。
レジスタ値確定部104は、代入フラグがTrueとなっているエントリに到達するまで、現在処理の対象となっている履歴エントリの確定レジスタ値を順方向に存在しているエントリに順次記録し、各エントリの対応するレジスタ情報エントリの確定フラグにTrueを記録する(S5001、S5002)。
図8のレジスタ値確定処理は、図6のステップS400においてトレース解析部103による確定フラグの確認により処理の対象となっている履歴エントリのいずれかのレジスタ値が確定していると判断された後に行われる。
レジスタ値確定部104は、ステップS5001とS5002から構成されるループ2を実行する。
ループ2では、現在処理の対象となっている履歴エントリから順方向に履歴エントリを処理する。順方向とは、時間的に古い命令実行についての履歴エントリから新しい命令実行についての履歴エントリに向かう方向であり、トレース番号の小さい履歴エントリから大きい履歴エントリに向かう方向(例えば、図12のトレース番号201から203に向かう方向)である。
図7のS2001に示すように、変更履歴エントリ追加部102は、命令実行トレースデータを逆順(時間的に新しいトレースエントリから古いトレースエントリに遡る順序)に処理し、履歴エントリも命令実行トレースデータの逆順で生成されるため、現在処理の対象としている履歴エントリよりも時間的に新しい(トレース番号が大きい)履歴エントリは存在しており、履歴エントリを順方向に探索することができる。
レジスタ値確定部104は、代入フラグがTrueとなっているエントリに到達するまで、現在処理の対象となっている履歴エントリの確定レジスタ値を順方向に存在しているエントリに順次記録し、各エントリの対応するレジスタ情報エントリの確定フラグにTrueを記録する(S5001、S5002)。
次に、図9を参照して、演算実行部105による演算実行処理の詳細を説明する。
演算実行部105は、ステップS6001〜S6008で構成されるループ3を実行する。
ループ3では、演算実行部105は、すべての履歴エントリを対象とする。
例えば、レジスタ変更履歴データの最上位の履歴エントリから順に未処理フラグの値を確認し、未処理フラグがTrueとなっている履歴エントリが存在した場合(S6001でYES)、当該履歴エントリのレジスタ情報エントリを探索し、代入フラグがTrueとなっているレジスタ情報エントリを探す(S6002)。
そして、演算実行部105は、代入フラグがTrueとなっているレジスタ情報エントリの確定フラグがTrueとなっているか否かを判断する(S6003)。
確定フラグがTrueとなっていれば(S6003でTrue)、当該レジスタのレジスタ値は確定しているので、演算実行部105はS6001に処理を戻し、次の未処理フラグがTrueとなっている履歴エントリを探す。
他方、確定フラグがFalseの場合(S6003でFalse)は、次に、演算実行部105は、参照フラグがTrueとなっている全レジスタ情報エントリの確定フラグのANDを計算する(S6004)。
例えば、図14(d)のトレース番号303のエントリでは、未処理フラグがTrueであり、レジスタR3のレジスタ情報エントリの代入フラグがTrueであり、確定フラグがFalseである。このエントリにおいて参照フラグがTrueであるのはレジスタR1とレジスタR2である。ステップS6004では、このレジスタR1とレジスタR2の確定フラグの値でANDを計算する(図14(d)のトレース番号303のエントリでは、レジスタR2の確定フラグがFalseなので、AND計算の結果はFalseになる)。
AND計算の結果がFalseであれば(S6005でFalse)、少なくとも一つの参照元レジスタのレジスタ値が未確定であるので、演算命令が実行できず、演算実行部105はS6001に処理を戻し、次の未処理フラグがTrueとなっている履歴エントリを探す。
他方、AND計算の結果がTrueであれば(S6005でTrue)、全ての参照元レジスタのレジスタ値が確定しているので、演算命令が実行可能であり、演算実行部105は当該エントリの未処理フラグにFalseを記録し(S6006)、当該エントリの命令に示されている演算命令を実行し(S6007)、演算命令が示されている履歴エントリの下の行の履歴エントリのトレース番号、該当するレジスタ識別子、演算命令の実行結果をレジスタ値確定部104に通知し、図8のレジスタ値確定処理を実行させる(S6008)。
なお、演算命令が示されている履歴エントリの次の履歴エントリのトレース番号を通知するのは、演算命令が示されているエントリには演算命令の実行前のレジスタ値が記録され、演算命令の実行結果が反映されるのは演算命令が示されている履歴エントリの次の履歴エントリだからである。
具体的には、図12(b)のトレース番号202のレジスタR3のレジスタ情報エントリには、レジスタR1のレジスタ値0x00000011と7との加算命令が実行される前のレジスタR3のレジスタ値が記録され、加算命令実行後のレジスタR3のレジスタ値(0x00000011)は、トレース番号203のエントリのレジスタ情報エントリに記録される。
演算実行部105は、ステップS6001〜S6008で構成されるループ3を実行する。
ループ3では、演算実行部105は、すべての履歴エントリを対象とする。
例えば、レジスタ変更履歴データの最上位の履歴エントリから順に未処理フラグの値を確認し、未処理フラグがTrueとなっている履歴エントリが存在した場合(S6001でYES)、当該履歴エントリのレジスタ情報エントリを探索し、代入フラグがTrueとなっているレジスタ情報エントリを探す(S6002)。
そして、演算実行部105は、代入フラグがTrueとなっているレジスタ情報エントリの確定フラグがTrueとなっているか否かを判断する(S6003)。
確定フラグがTrueとなっていれば(S6003でTrue)、当該レジスタのレジスタ値は確定しているので、演算実行部105はS6001に処理を戻し、次の未処理フラグがTrueとなっている履歴エントリを探す。
他方、確定フラグがFalseの場合(S6003でFalse)は、次に、演算実行部105は、参照フラグがTrueとなっている全レジスタ情報エントリの確定フラグのANDを計算する(S6004)。
例えば、図14(d)のトレース番号303のエントリでは、未処理フラグがTrueであり、レジスタR3のレジスタ情報エントリの代入フラグがTrueであり、確定フラグがFalseである。このエントリにおいて参照フラグがTrueであるのはレジスタR1とレジスタR2である。ステップS6004では、このレジスタR1とレジスタR2の確定フラグの値でANDを計算する(図14(d)のトレース番号303のエントリでは、レジスタR2の確定フラグがFalseなので、AND計算の結果はFalseになる)。
AND計算の結果がFalseであれば(S6005でFalse)、少なくとも一つの参照元レジスタのレジスタ値が未確定であるので、演算命令が実行できず、演算実行部105はS6001に処理を戻し、次の未処理フラグがTrueとなっている履歴エントリを探す。
他方、AND計算の結果がTrueであれば(S6005でTrue)、全ての参照元レジスタのレジスタ値が確定しているので、演算命令が実行可能であり、演算実行部105は当該エントリの未処理フラグにFalseを記録し(S6006)、当該エントリの命令に示されている演算命令を実行し(S6007)、演算命令が示されている履歴エントリの下の行の履歴エントリのトレース番号、該当するレジスタ識別子、演算命令の実行結果をレジスタ値確定部104に通知し、図8のレジスタ値確定処理を実行させる(S6008)。
なお、演算命令が示されている履歴エントリの次の履歴エントリのトレース番号を通知するのは、演算命令が示されているエントリには演算命令の実行前のレジスタ値が記録され、演算命令の実行結果が反映されるのは演算命令が示されている履歴エントリの次の履歴エントリだからである。
具体的には、図12(b)のトレース番号202のレジスタR3のレジスタ情報エントリには、レジスタR1のレジスタ値0x00000011と7との加算命令が実行される前のレジスタR3のレジスタ値が記録され、加算命令実行後のレジスタR3のレジスタ値(0x00000011)は、トレース番号203のエントリのレジスタ情報エントリに記録される。
演算実行部105から履歴エントリのトレース番号、該当するレジスタ識別子、演算命令の実行結果の通知を受領したレジスタ値確定部104は、図8に示す動作を行う。
レジスタ値確定部104は、演算実行部105から通知されたトレース番号の履歴エントリから順方向に履歴エントリを処理する。
ステップS5001において、レジスタ値確定部104は、演算実行部105から通知されたトレース番号の履歴エントリの該当レジスタ情報エントリに、通知された演算命令の実行結果の値をレジスタ値として記録し、当該レジスタ情報エントリの確定フラグにTrueを記録する。
そして、レジスタ値確定部104は、代入フラグがTrueである履歴エントリに到達するまで(S5002)、当該レジスタのレジスタ情報エントリに通知された演算命令の実行結果の値をレジスタ値として記録し、確定フラグにTrueを記録する。
例えば、図12(a)のトレース番号202において、レジスタR1のレジスタ値0x0000000Aと7を加算してレジスタR3のレジスタ値0x00000011が得られ、この値が次のトレース番号203のエントリのレジスタR3のレジスタ情報エントリに記録され、確定フラグにTrueが記録される。また、図12ではトレース番号204以降のエントリは記載されていないが、トレース番号204以降のエントリが存在しているとすれば、レジスタR3の代入フラグがFalseである限り、トレース番号204以降のエントリのレジスタR3のレジスタ情報エントリにレジスタ値0x00000011が記録され、確定フラグにTrueが記録される。
レジスタ値確定部104は、演算実行部105から通知されたトレース番号の履歴エントリから順方向に履歴エントリを処理する。
ステップS5001において、レジスタ値確定部104は、演算実行部105から通知されたトレース番号の履歴エントリの該当レジスタ情報エントリに、通知された演算命令の実行結果の値をレジスタ値として記録し、当該レジスタ情報エントリの確定フラグにTrueを記録する。
そして、レジスタ値確定部104は、代入フラグがTrueである履歴エントリに到達するまで(S5002)、当該レジスタのレジスタ情報エントリに通知された演算命令の実行結果の値をレジスタ値として記録し、確定フラグにTrueを記録する。
例えば、図12(a)のトレース番号202において、レジスタR1のレジスタ値0x0000000Aと7を加算してレジスタR3のレジスタ値0x00000011が得られ、この値が次のトレース番号203のエントリのレジスタR3のレジスタ情報エントリに記録され、確定フラグにTrueが記録される。また、図12ではトレース番号204以降のエントリは記載されていないが、トレース番号204以降のエントリが存在しているとすれば、レジスタR3の代入フラグがFalseである限り、トレース番号204以降のエントリのレジスタR3のレジスタ情報エントリにレジスタ値0x00000011が記録され、確定フラグにTrueが記録される。
次に、図11〜図14を使って解析処理の実行例を以下に説明する。
前述したように、図11〜図14のレジスタ変更履歴データでは、説明の簡明のため、STR命令、LDR命令についても命令内容を記述し、また、メモリアクセスの内容(メモリアクセス対象のアドレス、メモリアクセス対象のデータ)を記述しているが、CPUレジスタ再現装置100は図3に示すレジスタ変更履歴データを用いて処理可能である。
前述したように、図11〜図14のレジスタ変更履歴データでは、説明の簡明のため、STR命令、LDR命令についても命令内容を記述し、また、メモリアクセスの内容(メモリアクセス対象のアドレス、メモリアクセス対象のデータ)を記述しているが、CPUレジスタ再現装置100は図3に示すレジスタ変更履歴データを用いて処理可能である。
解析実行例1(図11)
終了条件:トレース番号101におけるレジスタR2の値が確定すること。
図11では、トレース番号102において、STR命令であるため、メモリアクセスのデータがレジスタR1に格納されていたことが分かり、レジスタR1のレジスタ値として0x00000011が記録され、確定フラグがTrueとなる。
また、トレース番号102において、データの格納先がレジスタR2のレジスタ値に8を加算したアドレスであるため、アドレス0x40000010から8を減じた値0x40000008がレジスタR2のレジスタ値として記録される。
また、トレース番号101において、アドレス間接参照命令なので、メモリアドレス0x40000008がレジスタR2に格納されているたことが分かり、この値がレジスタR2のレジスタ値として記録される。
なお、トレース番号101の時点では、LDR命令の実行前のレジスタR1のレジスタ値は確定させることができないので、レジスタR1の値は空欄である。
そして、図11の例では、トレース番号101におけるレジスタR2のレジスタ値が確定することが終了条件なので、レジスタR2のレジスタ値が確定した時点で終了条件を満足し、処理を終了する。
終了条件:トレース番号101におけるレジスタR2の値が確定すること。
図11では、トレース番号102において、STR命令であるため、メモリアクセスのデータがレジスタR1に格納されていたことが分かり、レジスタR1のレジスタ値として0x00000011が記録され、確定フラグがTrueとなる。
また、トレース番号102において、データの格納先がレジスタR2のレジスタ値に8を加算したアドレスであるため、アドレス0x40000010から8を減じた値0x40000008がレジスタR2のレジスタ値として記録される。
また、トレース番号101において、アドレス間接参照命令なので、メモリアドレス0x40000008がレジスタR2に格納されているたことが分かり、この値がレジスタR2のレジスタ値として記録される。
なお、トレース番号101の時点では、LDR命令の実行前のレジスタR1のレジスタ値は確定させることができないので、レジスタR1の値は空欄である。
そして、図11の例では、トレース番号101におけるレジスタR2のレジスタ値が確定することが終了条件なので、レジスタR2のレジスタ値が確定した時点で終了条件を満足し、処理を終了する。
解析実行例2(図12)
終了条件:トレース番号203におけるレジスタR1とR2とR3の値が確定すること。
図12(a)は、トレース番号202に対し、終了判定処理までを完了した時点の状態を示す。
レジスタR2については、図11の場合と同様に、0x40000008が求められ、レジスタR2のレジスタ値として記録される。トレース番号202では、ADD命令なので、未処理フラグにTrueが設定され、参照元レジスタであるレジスタR1について参照フラグにTrueが設定され、代入先レジスタであるレジスタR3について代入フラグにTrueが設定されている。
図12(b)は、トレース番号201に対し、レジスタ値確定処理までを行った時点の状態を示している。
トレース番号201のLDR命令により、レジスタR1に格納されたデータが0x0000000Aであることが分かり、一段下のトレース番号202のレジスタR1のレジスタ値として当該値が記録され、確定フラグがTrueとなる。
また、トレース番号202のADD命令の実行前の参照元レジスタR1の値が判明したので、ADD命令を実行して、代入先レジスタであるレジスタR3の値が0x00000011であると分かり、一段下のトレース番号203のレジスタR3のレジスタ値として当該値が記録され、確定フラグがTrueとなる。
図12(c)は、トレース番号202に対し、終了判定処理までを完了した時点で、終了条件を満足した状態を示す。
トレース番号203のレジスタR1のエントリでは、代入フラグがTrueになっていないので、トレース番号202の値をそのまま複写して確定フラグをTrueとしている。
終了条件:トレース番号203におけるレジスタR1とR2とR3の値が確定すること。
図12(a)は、トレース番号202に対し、終了判定処理までを完了した時点の状態を示す。
レジスタR2については、図11の場合と同様に、0x40000008が求められ、レジスタR2のレジスタ値として記録される。トレース番号202では、ADD命令なので、未処理フラグにTrueが設定され、参照元レジスタであるレジスタR1について参照フラグにTrueが設定され、代入先レジスタであるレジスタR3について代入フラグにTrueが設定されている。
図12(b)は、トレース番号201に対し、レジスタ値確定処理までを行った時点の状態を示している。
トレース番号201のLDR命令により、レジスタR1に格納されたデータが0x0000000Aであることが分かり、一段下のトレース番号202のレジスタR1のレジスタ値として当該値が記録され、確定フラグがTrueとなる。
また、トレース番号202のADD命令の実行前の参照元レジスタR1の値が判明したので、ADD命令を実行して、代入先レジスタであるレジスタR3の値が0x00000011であると分かり、一段下のトレース番号203のレジスタR3のレジスタ値として当該値が記録され、確定フラグがTrueとなる。
図12(c)は、トレース番号202に対し、終了判定処理までを完了した時点で、終了条件を満足した状態を示す。
トレース番号203のレジスタR1のエントリでは、代入フラグがTrueになっていないので、トレース番号202の値をそのまま複写して確定フラグをTrueとしている。
なお、図12に示す例において、上述のようにトレース番号201のLDR命令からレジスタR1のレジスタ値を確定させ、参照元レジスタR1のレジスタ値を用いて演算命令を実行して代入先レジスタR3のレジスタ値を求める手順の代わりに、トレース番号203のSTR命令から、レジスタR3のレジスタ値はメモリアクセスデータである0x00000011であると判断することも可能である。しかし、本実施の形態に係るCPUレジスタ再現装置100はこのような手法はとらない。
なぜならば、トレース番号202のADD命令において桁あふれが生じている場合も考えられ、その場合は、トレース番号203におけるメモリアクセスデータである0x00000011と、ADD R3←R1、7の演算結果の間に不一致が生じる。この場合に、トレース番号203のメモリアクセスデータに基づくレジスタR3のレジスタ値を基準に計算を進めていくと、正しいレジスタ値を得ることができない。このため、本実施の形態に係るCPUレジスタ再現装置100は、演算命令の全ての参照元レジスタのレジスタ値が確定した後に、確定した参照元レジスタ値を用いて演算命令を実行して、代入先レジスタのレジスタ値を確定させる。
なぜならば、トレース番号202のADD命令において桁あふれが生じている場合も考えられ、その場合は、トレース番号203におけるメモリアクセスデータである0x00000011と、ADD R3←R1、7の演算結果の間に不一致が生じる。この場合に、トレース番号203のメモリアクセスデータに基づくレジスタR3のレジスタ値を基準に計算を進めていくと、正しいレジスタ値を得ることができない。このため、本実施の形態に係るCPUレジスタ再現装置100は、演算命令の全ての参照元レジスタのレジスタ値が確定した後に、確定した参照元レジスタ値を用いて演算命令を実行して、代入先レジスタのレジスタ値を確定させる。
解析実行例3(図13、図14)
終了条件:トレース番号304におけるレジスタR1とR2とR3とR4の値が確定すること。
図13(a)は、トレース番号303に対し、終了判定処理までを完了した時点の状態を示す。
トレース番号304のエントリの命令はSTR命令であり、参照元レジスタであるレジスタR3の値はメモリアクセスのデータ0x00000011に一致するため、この値がレジスタR3のレジスタ値として記録される。また、レジスタR4については、データの格納先がレジスタR4のレジスタ値に8を加算したアドレスであるため、アドレス0x40000010から8を減じた値0x40000008がレジスタR4のレジスタ値として記録される。また、それぞれの確定フラグにTrueが記録される。
図13(b)は、トレース番号302に対し、履歴エントリ追加処理を完了した時点の状態を示す。
トレース番号302のLDR命令により、レジスタR1に格納されたデータが0x00000004であることが分かり、一段下のトレース番号303のレジスタR1のレジスタ値として当該値が記録され、確定フラグがTrueとなる。
図13(c)は、トレース番号302に対し、終了判定処理までを完了した時点の状態を示す。
トレース番号304のレジスタR1のエントリでは、代入フラグがTrueになっていないので、トレース番号303の値をそのまま複写して確定フラグをTrueとしている。
図14(d)は、トレース番号301に対し、履歴エントリ追加処理を完了した時点の状態を示す。
トレース番号301のLDR命令により、レジスタR2に格納されたデータが0x0000000Dであることが分かり、一段下のトレース番号302のレジスタR2のレジスタ値として当該値が記録され、確定フラグがTrueとなる。
図14(e)は、トレース番号301に対し、終了判定処理までを完了した時点で、終了条件を満足した状態を示す。
トレース番号303、304のレジスタR2のエントリでは、代入フラグがTrueになっていないので、トレース番号302の値をそのまま複写して確定フラグをTrueとしている。
終了条件:トレース番号304におけるレジスタR1とR2とR3とR4の値が確定すること。
図13(a)は、トレース番号303に対し、終了判定処理までを完了した時点の状態を示す。
トレース番号304のエントリの命令はSTR命令であり、参照元レジスタであるレジスタR3の値はメモリアクセスのデータ0x00000011に一致するため、この値がレジスタR3のレジスタ値として記録される。また、レジスタR4については、データの格納先がレジスタR4のレジスタ値に8を加算したアドレスであるため、アドレス0x40000010から8を減じた値0x40000008がレジスタR4のレジスタ値として記録される。また、それぞれの確定フラグにTrueが記録される。
図13(b)は、トレース番号302に対し、履歴エントリ追加処理を完了した時点の状態を示す。
トレース番号302のLDR命令により、レジスタR1に格納されたデータが0x00000004であることが分かり、一段下のトレース番号303のレジスタR1のレジスタ値として当該値が記録され、確定フラグがTrueとなる。
図13(c)は、トレース番号302に対し、終了判定処理までを完了した時点の状態を示す。
トレース番号304のレジスタR1のエントリでは、代入フラグがTrueになっていないので、トレース番号303の値をそのまま複写して確定フラグをTrueとしている。
図14(d)は、トレース番号301に対し、履歴エントリ追加処理を完了した時点の状態を示す。
トレース番号301のLDR命令により、レジスタR2に格納されたデータが0x0000000Dであることが分かり、一段下のトレース番号302のレジスタR2のレジスタ値として当該値が記録され、確定フラグがTrueとなる。
図14(e)は、トレース番号301に対し、終了判定処理までを完了した時点で、終了条件を満足した状態を示す。
トレース番号303、304のレジスタR2のエントリでは、代入フラグがTrueになっていないので、トレース番号302の値をそのまま複写して確定フラグをTrueとしている。
上記のように、本実施の形態によれば、CPUの命令実行のトレース情報から、所定の時点のCPUレジスタの値を再現することができる。
なお、CPUの命令実行のトレース情報はCPUの本来の動作に影響を与えずに取得することが可能なため、本技術によって、プログラム動作時のCPUレジスタの値を正確に再現することが可能となり、プログラムの誤動作の解析や原因の追究を効率化することができる。
なお、CPUの命令実行のトレース情報はCPUの本来の動作に影響を与えずに取得することが可能なため、本技術によって、プログラム動作時のCPUレジスタの値を正確に再現することが可能となり、プログラムの誤動作の解析や原因の追究を効率化することができる。
以上のように、本実施の形態では、レジスタを内蔵するプロセッサとメモリを用いてプログラムを実行するプログラム実行装置おけるプログラムの実行に対する解析を行う解析装置であって、以下の要素を有する解析装置について説明した。
(a)初期化部
レジスタ変更履歴データを初期化する。
(b)変更履歴エントリ追加部
プログラム実行中にプロセッサが実行した命令と命令実行によるメモリアクセスのトレースデータを特定の時点から遡りながらひとつずつ取出す。取出したトレースデータの命令がレジスタを参照する命令の場合、レジスタ変更履歴データに、履歴エントリを追加する。
(c)レジスタ値確定部
上記解析や下記演算実行の結果、レジスタの値を確定し、その前後の時点のレジスタ値を見渡してレジスタを変更する命令に行き当たるまで同じ値で確定する。
(d)演算実行部
レジスタ変更履歴データを見渡して、未処理のレジスタ間演算命令のうち、参照元レジスタの値がすべて確定した命令があれば演算を実行し、代入先レジスタの値を演算結果の値で確定する。
(e)終了判定部
所定の時点での所定のレジスタ値が確定したら終了判定の成功とする。
(a)初期化部
レジスタ変更履歴データを初期化する。
(b)変更履歴エントリ追加部
プログラム実行中にプロセッサが実行した命令と命令実行によるメモリアクセスのトレースデータを特定の時点から遡りながらひとつずつ取出す。取出したトレースデータの命令がレジスタを参照する命令の場合、レジスタ変更履歴データに、履歴エントリを追加する。
(c)レジスタ値確定部
上記解析や下記演算実行の結果、レジスタの値を確定し、その前後の時点のレジスタ値を見渡してレジスタを変更する命令に行き当たるまで同じ値で確定する。
(d)演算実行部
レジスタ変更履歴データを見渡して、未処理のレジスタ間演算命令のうち、参照元レジスタの値がすべて確定した命令があれば演算を実行し、代入先レジスタの値を演算結果の値で確定する。
(e)終了判定部
所定の時点での所定のレジスタ値が確定したら終了判定の成功とする。
実施の形態2.
実施の形態1では、命令実行トレースデータの特定のトレースエントリにおける特定のレジスタ値が確定した際に処理を終了することとしていたが、本実施の形態では、トレースエントリのトレース番号が、所定の終了トレース番号より小さいか等しい場合に、解析を終了する。
すなわち、レジスタ値が確定・未確定を問わず、所定の終了トレース番号に到達した際に、終了判定部106が、変更履歴エントリ追加部102に解析の終了を指示し、変更履歴エントリ追加部102が処理を終了する。
終了判定処理以外のCPUレジスタ再現装置100の構成及び処理内容は実施の形態1に示したものと同じである。
実施の形態1では、命令実行トレースデータの特定のトレースエントリにおける特定のレジスタ値が確定した際に処理を終了することとしていたが、本実施の形態では、トレースエントリのトレース番号が、所定の終了トレース番号より小さいか等しい場合に、解析を終了する。
すなわち、レジスタ値が確定・未確定を問わず、所定の終了トレース番号に到達した際に、終了判定部106が、変更履歴エントリ追加部102に解析の終了を指示し、変更履歴エントリ追加部102が処理を終了する。
終了判定処理以外のCPUレジスタ再現装置100の構成及び処理内容は実施の形態1に示したものと同じである。
このように、本実施の形態によれば、実施の形態1に示した効果に加え、CPUレジスタ再現処理を効率的に早期に終了することができる。
実施の形態3.
本実施の形態に係るCPUレジスタ再現装置100では、以下に示す初期化処理を行う。
初期化処理以外の処理は実施の形態1に示すものと同様である。
また、CPUレジスタ再現装置100の構成も、実施の形態1に示したものと同様である。
本実施の形態に係るCPUレジスタ再現装置100では、以下に示す初期化処理を行う。
初期化処理以外の処理は実施の形態1に示すものと同様である。
また、CPUレジスタ再現装置100の構成も、実施の形態1に示したものと同様である。
初期化処理
初期化部101が、レジスタ変更履歴データをクリアして新たな履歴エントリを挿入し、新たな履歴エントリに対して以下の処理を行う。
(1)未処理フラグにFalseを記録する。
(2)各レジスタ情報エントリの代入フラグ、参照フラグ、確定フラグのそれぞれにFalseを記録する。
(3)各レジスタ情報エントリの値を所定の値で初期化する。
初期化部101が、レジスタ変更履歴データをクリアして新たな履歴エントリを挿入し、新たな履歴エントリに対して以下の処理を行う。
(1)未処理フラグにFalseを記録する。
(2)各レジスタ情報エントリの代入フラグ、参照フラグ、確定フラグのそれぞれにFalseを記録する。
(3)各レジスタ情報エントリの値を所定の値で初期化する。
プログラム実行環境200においてプログラム201の実行中に障害が発生した際に、CPUレジスタ再現装置100は、命令実行トレースデータ300とは別に、各レジスタの障害発生時のレジスタ値を示す障害発生時レジスタ値情報をプログラム実行環境200から取得可能な場合がある。
このような場合に、CPUレジスタ再現装置100では、初期化部101が、初期化処理として、プログラム実行環境200から取得した障害発生時レジスタ値情報に示される各レジスタ値をレジスタ変更履歴データのレジスタ情報エントリの値に記録し、プログラム実行環境200から取得した各レジスタ値に基づいて、プログラム実行中のレジスタ値の変遷を再現する。
このような場合に、CPUレジスタ再現装置100では、初期化部101が、初期化処理として、プログラム実行環境200から取得した障害発生時レジスタ値情報に示される各レジスタ値をレジスタ変更履歴データのレジスタ情報エントリの値に記録し、プログラム実行環境200から取得した各レジスタ値に基づいて、プログラム実行中のレジスタ値の変遷を再現する。
本実施の形態では、レジスタの最終的な値が判明しているときに、その値を使ってレジスタ再現処理を開始することで、処理を早期に終了することが可能となる。
また、レジスタ再現処理を繰り返し行って、複数の時点(トレース番号)のレジスタを再現する際に、一度再現した解析結果のレジスタ値を別のレジスタ再現処理に利用することが可能となる。
再現したレジスタ値を別の再現処理の初期値として利用することで、同じ解析処理の繰り返しを省き、処理を効率化できる。
また、レジスタ再現処理を繰り返し行って、複数の時点(トレース番号)のレジスタを再現する際に、一度再現した解析結果のレジスタ値を別のレジスタ再現処理に利用することが可能となる。
再現したレジスタ値を別の再現処理の初期値として利用することで、同じ解析処理の繰り返しを省き、処理を効率化できる。
実施の形態4.
図10は、本実施の形態に係るCPUレジスタ再現装置100の構成例を示す。
図10において、関数シンボルデータ400は、プログラム実行環境200で実行される関数名と当該関数の先頭アドレス(プログラムカウンタ値)の一覧を示す情報である。
また、関数先頭アドレス108は、初期化部101により終了条件として設定されたプログラムカウンタ値である。
図2に示すように、命令実行トレースデータには、プログラム実行環境200のプロセッサがプログラムの実行においてフェッチした命令のプログラムカウンタ値が各エントリに示されている。
変更履歴エントリ追加部102は、このような命令実行トレースデータを時系列を遡って解析するが、本実施の形態では、関数先頭アドレス108により指定されているプログラムカウンタ値が示されているエントリに到達した際に、命令実行トレースデータの解析及びレジスタ変更履歴データへのエントリの追加を終了し、CPUレジスタ再現処理を終了する。
図10は、本実施の形態に係るCPUレジスタ再現装置100の構成例を示す。
図10において、関数シンボルデータ400は、プログラム実行環境200で実行される関数名と当該関数の先頭アドレス(プログラムカウンタ値)の一覧を示す情報である。
また、関数先頭アドレス108は、初期化部101により終了条件として設定されたプログラムカウンタ値である。
図2に示すように、命令実行トレースデータには、プログラム実行環境200のプロセッサがプログラムの実行においてフェッチした命令のプログラムカウンタ値が各エントリに示されている。
変更履歴エントリ追加部102は、このような命令実行トレースデータを時系列を遡って解析するが、本実施の形態では、関数先頭アドレス108により指定されているプログラムカウンタ値が示されているエントリに到達した際に、命令実行トレースデータの解析及びレジスタ変更履歴データへのエントリの追加を終了し、CPUレジスタ再現処理を終了する。
本実施の形態では、以下に示す初期化処理と終了判定処理を行う。
初期化処理と終了判定処理以外の処理は実施の形態1に示したものと同じである。
初期化処理と終了判定処理以外の処理は実施の形態1に示したものと同じである。
初期化処理
初期化部101が、レジスタ変更履歴データをクリアして新たな履歴エントリを挿入し、新たな履歴エントリに対して以下の処理を行う。
(1)未処理フラグにFalseを記録する。
(2)各レジスタ情報エントリの代入フラグ、参照フラグ、確定フラグのそれぞれにFalseを記録する。
(3)関数シンボルデータを探索し、開始トレース番号のトレースエントリのプログラムカウンタのアドレスを含む関数を特定し、その関数の先頭アドレスを終了判定部に通知する。
終了判定処理
トレースエントリのプログラムカウンタが、関数先頭アドレス108により指定されている終了プログラムカウンタに等しいときに、終了判定部106が、変更履歴エントリ追加部102に解析の終了を指示し、変更履歴エントリ追加部102が処理を終了する。
初期化部101が、レジスタ変更履歴データをクリアして新たな履歴エントリを挿入し、新たな履歴エントリに対して以下の処理を行う。
(1)未処理フラグにFalseを記録する。
(2)各レジスタ情報エントリの代入フラグ、参照フラグ、確定フラグのそれぞれにFalseを記録する。
(3)関数シンボルデータを探索し、開始トレース番号のトレースエントリのプログラムカウンタのアドレスを含む関数を特定し、その関数の先頭アドレスを終了判定部に通知する。
終了判定処理
トレースエントリのプログラムカウンタが、関数先頭アドレス108により指定されている終了プログラムカウンタに等しいときに、終了判定部106が、変更履歴エントリ追加部102に解析の終了を指示し、変更履歴エントリ追加部102が処理を終了する。
このように、本実施の形態によれば、実施の形態1に示した効果に加え、CPUレジスタ再現処理を効率的に早期に終了することができる。
以上、本実施の形態では、以下の要素を含む解析装置について説明した。
(g)初期化部
レジスタ変更履歴データを初期化する。次に、関数シンボルデータを探索し、開始トレース番号のトレースエントリのプログラムカウンタのアドレスを含む関数を特定し、その関数の先頭アドレスを終了判定部に通知する。
(h)終了判定部
トレースエントリのプログラムカウンタが、関数先頭アドレスにより指定されている終了プログラムカウンタに等しいとき、終了判定の成功とする。
(g)初期化部
レジスタ変更履歴データを初期化する。次に、関数シンボルデータを探索し、開始トレース番号のトレースエントリのプログラムカウンタのアドレスを含む関数を特定し、その関数の先頭アドレスを終了判定部に通知する。
(h)終了判定部
トレースエントリのプログラムカウンタが、関数先頭アドレスにより指定されている終了プログラムカウンタに等しいとき、終了判定の成功とする。
最後に、実施の形態1〜4に示したCPUレジスタ再現装置100のハードウェア構成例について説明する。
図15は、実施の形態1〜4に示すCPUレジスタ再現装置100のハードウェア資源の一例を示す図である。
なお、図15の構成は、あくまでもCPUレジスタ再現装置100のハードウェア構成の一例を示すものであり、CPUレジスタ再現装置100のハードウェア構成は図15に記載の構成に限らず、他の構成であってもよい。
図15は、実施の形態1〜4に示すCPUレジスタ再現装置100のハードウェア資源の一例を示す図である。
なお、図15の構成は、あくまでもCPUレジスタ再現装置100のハードウェア構成の一例を示すものであり、CPUレジスタ再現装置100のハードウェア構成は図15に記載の構成に限らず、他の構成であってもよい。
図15において、CPUレジスタ再現装置100は、プログラムを実行するCPU911(Central Processing Unit、中央処理装置、処理装置、演算装置、マイクロプロセッサ、マイクロコンピュータ、プロセッサともいう)を備えている。CPU911は、バス912を介して、例えば、ROM(Read Only Memory)913、RAM(Random Access Memory)914、通信ボード915、表示装置901、キーボード902、マウス903、磁気ディスク装置920と接続され、これらのハードウェアデバイスを制御する。更に、CPU911は、FDD904(Flexible Disk Drive)、コンパクトディスク装置905(CDD)、プリンタ装置906、スキャナ装置907と接続していてもよい。また、磁気ディスク装置920の代わりに、光ディスク装置、メモリカード読み書き装置などの記憶装置でもよい。
RAM914は、揮発性メモリの一例である。ROM913、FDD904、CDD905、磁気ディスク装置920の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置の一例である。
通信ボード915、キーボード902、マウス302、スキャナ装置907、FDD904などは、入力装置の一例である。
また、通信ボード915、表示装置901、プリンタ装置906などは、出力装置の一例である。
RAM914は、揮発性メモリの一例である。ROM913、FDD904、CDD905、磁気ディスク装置920の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置の一例である。
通信ボード915、キーボード902、マウス302、スキャナ装置907、FDD904などは、入力装置の一例である。
また、通信ボード915、表示装置901、プリンタ装置906などは、出力装置の一例である。
通信ボード915は、例えば、LAN(ローカルエリアネットワーク)、インターネット、WAN(ワイドエリアネットワーク)などのネットワークに接続されていても構わない。
磁気ディスク装置920には、オペレーティングシステム921(OS)、ウィンドウシステム922、プログラム群923、ファイル群924が記憶されている。プログラム群923のプログラムは、CPU911、オペレーティングシステム921、ウィンドウシステム922により実行される。
磁気ディスク装置920には、オペレーティングシステム921(OS)、ウィンドウシステム922、プログラム群923、ファイル群924が記憶されている。プログラム群923のプログラムは、CPU911、オペレーティングシステム921、ウィンドウシステム922により実行される。
上記プログラム群923には、実施の形態1〜4の説明において「〜部」として説明している機能を実行するプログラムが記憶されている。プログラムは、CPU911により読み出され実行される。
ファイル群924には、実施の形態1〜4の説明において、「〜の判断」、「〜の計算」、「〜の比較」、「〜の抽出」、「〜の記録」、「〜の追加」、「〜の設定」、「〜の登録」等として説明している処理の結果を示す情報やデータや信号値や変数値やパラメータが、「〜ファイル」や「〜データベース」の各項目として記憶されている。
「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリになどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してCPU911によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示などのCPUの動作に用いられる。
抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示のCPUの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリ、レジスタ、キャッシュメモリ、バッファメモリ等に一時的に記憶される。
例えば、レジスタ変更履歴データ107は、メインメモリであるRAM914、CPU911内のレジスタ、キャッシュメモリ等に記憶される。
「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリになどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してCPU911によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示などのCPUの動作に用いられる。
抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示のCPUの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリ、レジスタ、キャッシュメモリ、バッファメモリ等に一時的に記憶される。
例えば、レジスタ変更履歴データ107は、メインメモリであるRAM914、CPU911内のレジスタ、キャッシュメモリ等に記憶される。
また、実施の形態1〜4で説明しているフローチャートの矢印の部分は主としてデータや信号の入出力を示し、データや信号値は、RAM914のメモリ、FDD904のフレキシブルディスク、CDD905のコンパクトディスク、磁気ディスク装置920の磁気ディスク、その他光ディスク、ミニディスク、DVD等の記録媒体に記録される。また、データや信号は、バス912や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
また、実施の形態1〜4の説明において「〜部」として説明しているものは、「〜回路」、「〜装置」、「〜機器」、であってもよく、また、「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明しているものは、ROM913に記憶されたファームウェアで実現されていても構わない。或いは、ソフトウェアのみ、或いは、素子・デバイス・基板・配線などのハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、DVD等の記録媒体に記憶される。プログラムはCPU911により読み出され、CPU911により実行される。すなわち、プログラムは、実施の形態1〜4の「〜部」としてコンピュータを機能させるものである。あるいは、実施の形態1〜4の「〜部」の手順や方法をコンピュータに実行させるものである。
このように、実施の形態1〜4に示すCPUレジスタ再現装置100は、処理装置たるCPU、記憶装置たるメモリ、磁気ディスク等、入力装置たるキーボード、マウス、通信ボード等、出力装置たる表示装置、通信ボード等を備えるコンピュータであり、上記したように「〜部」として示された機能をこれら処理装置、記憶装置、入力装置、出力装置を用いて実現するものである。
100 CPUレジスタ再現装置、101 初期化部、102 変更履歴エントリ追加部、103 トレース解析部、104 レジスタ値確定部、105 演算実行部、106 終了判定部、107 レジスタ変更履歴データ、108 関数先頭アドレス、200 プログラム実行環境、201 プログラム、300 命令実行トレースデータ、400 関数シンボルデータ。
Claims (11)
- プロセッサとメモリと前記プロセッサに含まれる一つ以上のレジスタを用いてプログラムを実行するプログラム実行装置におけるプログラムの実行に対する解析を行う解析装置であって、
前記プロセッサがプログラムの実行中に実行した命令の内容と命令実行によるメモリアクセスの内容が時系列で示される複数エントリの命令実行トレースデータの時系列を遡ってエントリごとに命令の内容を解析し、命令にレジスタ識別子が示されているエントリをレジスタ命令エントリとして順次抽出するエントリ抽出部と、
前記エントリ抽出部により抽出されたレジスタ命令エントリに演算命令が示されている場合に、当該演算命令を実行する演算実行部と、
各レジスタ命令エントリの命令に示されているレジスタ識別子、各レジスタ命令エントリに示されているメモリアクセスの内容、及び前記演算実行部による演算命令実行結果を用いて、各レジスタ命令エントリに示されている命令が実行された際の各レジスタのレジスタ値を確定するレジスタ値確定部とを有することを特徴とする解析装置。 - 前記レジスタ値確定部は、
いずれかのレジスタ命令エントリに示されている命令が前記プログラム実行装置において実行された際のいずれかのレジスタ値を確定した場合に、当該確定したレジスタ値を用いて、他のレジスタ命令エントリに示されている命令が前記プログラム実行装置において実行された際のいずれかのレジスタ値を確定し、前記プロセッサによるプログラムの実行中のレジスタ値の変遷を再現することを特徴とする請求項1に記載の解析装置。 - 前記演算実行部は、
前記エントリ抽出部により抽出されたレジスタ命令エントリにレジスタ識別子が含まれる演算命令が示されている場合に、当該レジスタ識別子に対応するレジスタの当該演算命令の実行直前のレジスタ値が前記レジスタ値確定部により確定したときに、当該レジスタ値を用いて前記演算命令を実行することを特徴とする請求項1又は2に記載の解析装置。 - 前記レジスタ値確定部は、
前記エントリ抽出部により抽出されたレジスタ命令エントリにレジスタ識別子が含まれる演算命令が示されている場合に、当該演算命令よりも以前に前記プログラム実行装置において実行された命令に対応するレジスタ命令エントリを解析して、当該演算命令に含まれているレジスタ識別子に対応するレジスタの当該演算命令の実行直前のレジスタ値を確定することを特徴とする請求項1〜3のいずれかに記載の解析装置。 - 前記エントリ抽出部は、
メモリアクセスの内容として、前記プロセッサによりメモリアクセスの行われたメモリアドレス及びメモリアクセスの対象となったデータが示されている命令実行トレースデータを解析し、演算命令以外の命令が示されているレジスタ命令エントリに対して、各レジスタ命令エントリの命令に示されているレジスタ識別子、及び各レジスタ命令エントリに示されているメモリアドレス及びデータの少なくともいずれかを用いて、命令の実行の際のレジスタ値を確定することを特徴とする請求項1〜4のいずれかに記載の解析装置。 - 前記エントリ抽出部は、
レジスタ命令エントリを抽出する度に、抽出したレジスタ命令エントリに対応づけて、各レジスタのレジスタ識別子が示されるとともにレジスタ値が確定済であるか否かを表す確定フラグがレジスタ識別子ごとに示される履歴エントリを生成し、各確定フラグを無効とし、
前記レジスタ値確定部は、
履歴エントリの確定フラグを参照し、確定フラグが無効であるレジスタ識別子に対応するレジスタのレジスタ値を確定し、レジスタ値が確定する度に、履歴エントリの対応するレジスタ識別子に対してレジスタ値を記述するとともに確定フラグを有効にすることを特徴とする請求項1〜5のいずれかに記載の解析装置。 - 前記エントリ抽出部は、
値が代入されるレジスタであるか否かを表す代入フラグ、値が参照されるレジスタであるか否かを表す参照フラグがレジスタ識別子ごとに示される履歴エントリを生成し、抽出したレジスタ命令エントリに示される命令を解析して命令の実行における各レジスタの役割を解析し、値が代入される役割のレジスタのレジスタ識別子に対しては代入フラグを有効にし、値が参照される役割のレジスタのレジスタ識別子に対しては参照フラグを有効にし、
前記演算実行部は、
履歴エントリの代入フラグ及び参照フラグを参照し、履歴エントリの代入フラグ及び参照フラグが有効になっている場合に、参照フラグが有効になっているレジスタ識別子に対して記述されているレジスタ値を用いて、当該履歴エントリに対応するレジスタ命令エントリに示されている演算命令を実行し、
前記レジスタ値確定部は、
前記演算実行部の演算命令の実行の結果得られた値を当該履歴エントリの代入フラグが有効になっているレジスタ識別子に対して記述するとともに確定フラグを有効にすることを特徴とする請求項6に記載の解析装置。 - 前記解析装置は、
前記プログラム実行装置によるプログラムの実行中に障害が発生した際に前記プログラム実行装置におけるプログラムの実行に対する解析を行う場合があり、更に、障害発生時の各レジスタのレジスタ値が示される障害発生時レジスタ値情報を入力する場合があり、
前記レジスタ値確定部は、
前記障害発生時レジスタ値情報に示される障害発生時の各レジスタのレジスタ値を用いて、各レジスタ命令エントリに示されている命令が実行された際の各レジスタのレジスタ値を確定することを特徴とする請求項1〜7のいずれかに記載の解析装置。 - 前記エントリ抽出部は、
前記プロセッサがプログラムの実行においてフェッチした命令のプログラムカウンタ値が各エントリに示されている命令実行トレースデータを時系列を遡って解析し、特定のプログラムカウンタ値が示されているエントリに到達した際に、命令実行トレースデータの解析及びレジスタ命令エントリの抽出を終了することを特徴とする請求項1〜8のいずれかに記載の解析装置。 - プロセッサとメモリと前記プロセッサに含まれる一つ以上のレジスタを用いてプログラムを実行するプログラム実行装置におけるプログラムの実行に対する解析をコンピュータが行う解析方法であって、
前記コンピュータが、前記プロセッサがプログラムの実行中に実行した命令の内容と命令実行によるメモリアクセスの内容が時系列で示される複数エントリの命令実行トレースデータの時系列を遡ってエントリごとに命令の内容を解析し、命令にレジスタ識別子が示されているエントリをレジスタ命令エントリとして順次抽出するエントリ抽出ステップと、
前記エントリ抽出ステップにより抽出されたレジスタ命令エントリに演算命令が示されている場合に、前記コンピュータが、当該演算命令を実行する演算実行ステップと、
前記コンピュータが、各レジスタ命令エントリの命令に示されているレジスタ識別子、各レジスタ命令エントリに示されているメモリアクセスの内容、及び前記演算実行ステップによる演算命令実行結果を用いて、各レジスタ命令エントリに示されている命令が実行された際の各レジスタのレジスタ値を確定するレジスタ値確定ステップとを有することを特徴とする解析方法。 - プロセッサとメモリと前記プロセッサに含まれる一つ以上のレジスタを用いてプログラムを実行するプログラム実行装置におけるプログラムの実行に対する解析をコンピュータに実行させるプログラムであって、
前記プロセッサがプログラムの実行中に実行した命令の内容と命令実行によるメモリアクセスの内容が時系列で示される複数エントリの命令実行トレースデータの時系列を遡ってエントリごとに命令の内容を解析し、命令にレジスタ識別子が示されているエントリをレジスタ命令エントリとして順次抽出するエントリ抽出処理と、
前記エントリ抽出処理により抽出されたレジスタ命令エントリに演算命令が示されている場合に、当該演算命令を実行する演算実行処理と、
各レジスタ命令エントリの命令に示されているレジスタ識別子、各レジスタ命令エントリに示されているメモリアクセスの内容、及び前記演算実行処理による演算命令実行結果を用いて、各レジスタ命令エントリに示されている命令が実行された際の各レジスタのレジスタ値を確定するレジスタ値確定処理とをコンピュータに実行させることを特徴とするプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007181370A JP2009020610A (ja) | 2007-07-10 | 2007-07-10 | 解析装置及び解析方法及びプログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007181370A JP2009020610A (ja) | 2007-07-10 | 2007-07-10 | 解析装置及び解析方法及びプログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2009020610A true JP2009020610A (ja) | 2009-01-29 |
Family
ID=40360219
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2007181370A Pending JP2009020610A (ja) | 2007-07-10 | 2007-07-10 | 解析装置及び解析方法及びプログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2009020610A (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2011008789A (ja) * | 2009-06-26 | 2011-01-13 | Intel Corp | グラフィック分析技術 |
US8624907B2 (en) | 2009-06-26 | 2014-01-07 | Intel Corporation | Graphics analysis techniques |
-
2007
- 2007-07-10 JP JP2007181370A patent/JP2009020610A/ja active Pending
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2011008789A (ja) * | 2009-06-26 | 2011-01-13 | Intel Corp | グラフィック分析技術 |
US8581916B2 (en) | 2009-06-26 | 2013-11-12 | Intel Corporation | Graphics analysis techniques |
US8624907B2 (en) | 2009-06-26 | 2014-01-07 | Intel Corporation | Graphics analysis techniques |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6954747B1 (en) | Methods for comparing versions of a program | |
JP3570855B2 (ja) | 分岐予測装置 | |
US20070011664A1 (en) | Device and method for generating an instruction set simulator | |
US20070022406A1 (en) | Enhanced scenario testing of an application under test | |
US8332833B2 (en) | Procedure control descriptor-based code specialization for context sensitive memory disambiguation | |
US7480768B2 (en) | Apparatus, systems and methods to reduce access to shared data storage | |
US20020170034A1 (en) | Method for debugging a dynamic program compiler, interpreter, or optimizer | |
CN111813670B (zh) | 一种非侵入式mc/dc覆盖率统计分析方法 | |
JP2009020610A (ja) | 解析装置及び解析方法及びプログラム | |
US6704861B1 (en) | Mechanism for executing computer instructions in parallel | |
US20070079109A1 (en) | Simulation apparatus and simulation method | |
CN117369830A (zh) | 二进制翻译方法、电子设备和可读存储介质 | |
JP2008191796A (ja) | 解析装置及び解析方法及びプログラム | |
JP3833626B2 (ja) | テストケース生成装置及びテストケース生成方法 | |
KR20200086093A (ko) | 병렬 프로그램의 소스 코드 분석 장치 및 방법, 기록매체 | |
JP2020038482A (ja) | プログラム検証プログラム、プログラム検証方法およびプログラム検証装置 | |
CN113296833B (zh) | 一种二进制文件中合法指令的识别方法及装置 | |
JP5855989B2 (ja) | データ処理装置及びデータ処理方法及びデータ処理プログラム | |
JP2002014847A (ja) | プログラム検査装置、プログラム検査方法及び検査を行うためのプログラムを格納した記録媒体 | |
JP4861942B2 (ja) | Webページテスト自動化装置 | |
US20240111843A1 (en) | Software license-based code suggestions | |
US20230101206A1 (en) | Data Hazard Generation | |
JP4434931B2 (ja) | 論理システムの検証装置および検証方法 | |
JP3110391B2 (ja) | プログラム再実行方法 | |
JP2021015481A (ja) | 情報処理プログラム、情報処理方法、及び情報処理装置 |