JP2003122595A - Method and device for software fault analysis - Google Patents
Method and device for software fault analysisInfo
- Publication number
- JP2003122595A JP2003122595A JP2001314183A JP2001314183A JP2003122595A JP 2003122595 A JP2003122595 A JP 2003122595A JP 2001314183 A JP2001314183 A JP 2001314183A JP 2001314183 A JP2001314183 A JP 2001314183A JP 2003122595 A JP2003122595 A JP 2003122595A
- Authority
- JP
- Japan
- Prior art keywords
- program
- log
- expression
- backward
- processing
- 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.)
- Granted
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
Description
【0001】[0001]
【発明の属する技術分野】この発明は、ソフトウェア障
害解析(デバッグ)方法及び装置に関し、特に、原始プ
ログラム(ソースコード)を計算機の命令語へ翻訳(コ
ンパイル)する方法を工夫することによりプログラムを
逆向きに実行できるようにして障害が発生した時点より
前の状態を再現できるようにすることで障害解析を行い
やすくするものである。BACKGROUND OF THE INVENTION 1. Field of the Invention The present invention relates to a software failure analysis (debugging) method and apparatus, and more particularly to a method for reversing a program by devising a method for translating (compiling) a source program into an instruction word of a computer. By making it possible to execute in the direction so that the state before the time when the failure occurs can be reproduced, the failure analysis is facilitated.
【0002】[0002]
【従来の技術】ソフトウェアの障害解析では、何らかの
異常(障害)を検出した時点でプログラムの動作をスト
ップさせ、その時点のメモリの状態を詳しく調べること
で障害の原因を推定する方法が広く使われている。2. Description of the Related Art In software failure analysis, a method of presuming the cause of the failure is widely used by stopping the operation of the program at the time when any abnormality (failure) is detected and examining the memory state at that time in detail. ing.
【0003】しかし、この方法では障害が検出された時
点での情報しか得られないため、それ以前にどのような
経過をたどって障害に至ったのかについては正確な情報
が得られないという問題がある。従来技術では、この問
題を解決するため以下のような技術が知られている。However, in this method, since only the information at the time when the failure is detected is obtained, there is a problem that it is not possible to obtain accurate information as to what progress has been taken before the failure. is there. In the prior art, the following techniques are known to solve this problem.
【0004】(1)変数値やプログラムの状態を表示ま
たはファイルに保存する処理をプログラムに埋め込み、
実行中の中間結果を記録に残すことで障害の原因を推定
する方法。しかし、表示処理や記録処理の埋め込みはプ
ログラムの設計時に行う必要があり、どの情報を記録す
ればよいのか等の判断も設計時に行う必要がある。ま
た、プログラムの状態を正確に知るためには記録すべき
情報量が多くなるという欠点をもつ。(1) Embedding a process for displaying or saving a variable value or the state of the program in a file,
A method of estimating the cause of failure by recording the intermediate results during execution. However, it is necessary to embed the display processing and the recording processing at the time of designing the program, and it is also necessary to make a determination at the time of designing which information should be recorded. Further, there is a drawback that the amount of information to be recorded is large in order to know the state of the program accurately.
【0005】(2)逆命令ログに基づく方法。一般に
は、アプリケーション・プログラムのユーザー・インタ
フェース部分でUNDO処理(取り消し処理)を実現す
るために用いられる方法で、実行プログラムの処理を行
うたびに、その処理を打ち消すような処理を行う命令列
(逆命令)を記録に残しておく方法である。この逆命令
の実行によって、プログラムが停止した時点より前の状
態を再現させ、障害に至った原因を推定することができ
る。この方法は、多段階の取り消しを容易に実現できる
という特徴を持つ。(2) Method based on reverse instruction log. Generally, this is a method used to realize UNDO processing (cancellation processing) in the user interface portion of an application program, and an instruction string (reverse processing) that cancels processing every time the execution program is processed. Instruction) is a method of keeping a record. By executing this reverse instruction, it is possible to reproduce the state before the time when the program stopped and to estimate the cause of the failure. This method has a feature that multi-step cancellation can be easily realized.
【0006】[0006]
【発明が解決しようとする課題】プログラムの動作の過
程を調べるためには、障害が起こった時点から過去の状
態へ溯って調べていく方法が有効だが、これを逆命令ロ
グに基づく方法を用いて実現すると、ログに記録すべき
情報量が多くなり長時間の記録が行えないという問題が
発生する。これは、従来の技術では、命令の種類と、命
令が操作するメモリ・アドレスとデータのサイズ、及
び、状態を回復するためのデータなど、処理に必要な全
ての情報がログの中に含まれているためである。In order to investigate the process of operation of a program, a method of investigating from the time of failure to the past state is effective, but the method based on the reverse instruction log is used. If it is realized, there is a problem that the amount of information to be recorded in the log is large and the recording cannot be performed for a long time. This is because in the conventional technology, the log contains all the information necessary for processing, such as the type of instruction, the size of memory address and data operated by the instruction, and the data for recovering the state. This is because
【0007】この発明は上述した点に鑑みてなされたも
ので、上述した逆命令に基づく方法を改良し、命令の種
類の情報と、命令が操作するメモリのアドレス、および
データ・サイズの情報を、逆方向プログラムの形でログ
から分離することで、ログの記録に必要なメモリの量を
削減し、同一メモリ量で逆方向実行が可能な範囲を拡大
することができるソフトウエア障害解析方法及び装置を
提供することを目的とする。The present invention has been made in view of the above-mentioned points, and improves the method based on the above-mentioned reverse instruction so that the information of the type of the instruction, the address of the memory operated by the instruction, and the information of the data size can be obtained. By separating the log in the form of a backward program, the amount of memory required for recording the log can be reduced and the range in which backward execution can be performed with the same amount of memory can be expanded. The purpose is to provide a device.
【0008】[0008]
【課題を解決するための手段】この発明に係るソフトウ
エア障害解析方法は、原始プログラム(ソースコード)
の翻訳(コンパイル)時に、翻訳結果へのログ生成処理
の埋め込みと逆方向プログラムの生成を行い、プログラ
ムの実行時に生成されたログ情報を入力として逆方向プ
ログラムを実行することでプログラムを逆向きに実行し
プログラムの過去の状態を復元することを特徴とするも
のである。A software fault analysis method according to the present invention is a source program (source code).
When the program is translated (compiled), the log generation process is embedded in the translation result and the backward direction program is generated, and the backward direction program is executed by using the log information generated at the time of program execution as input. It is characterized by executing and restoring the past state of the program.
【0009】また、この発明に係るソフトウエア障害解
析装置は、原始プログラム(ソースコード)の翻訳(コ
ンパイル)時に、翻訳結果へのログ生成処理の埋め込み
と逆方向プログラムの生成を行うコンパイラと、プログ
ラムの実行時に生成されたログ情報を入力として逆方向
プログラムを実行することでプログラムを逆向きに実行
しプログラムの過去の状態を復元する障害解析手段(デ
バッガ)とを備えたことを特徴とするものである。Further, the software fault analysis apparatus according to the present invention includes a compiler for embedding log generation processing in a translation result and generating a backward program when a source program (source code) is translated (compiled), and a program. And a failure analysis means (debugger) for executing the backward direction program by executing the backward direction program using the log information generated at the time of execution of the program and restoring the past state of the program. Is.
【0010】[0010]
【発明の実施の形態】この発明では、以下のような特徴
をもつプログラムのコンパイル手段(コンパイラ)と、
障害解析手段(デバッガ)を用いることで、上記の課題
を解決する。BEST MODE FOR CARRYING OUT THE INVENTION In the present invention, a program compiling means (compiler) having the following features,
The above problem is solved by using the failure analysis means (debugger).
【0011】この発明のコンパイラは、ソースコードを
プログラムに翻訳する際に、通常のプログラムと同じ順
序で実行する「順方向プログラム」と、逆の順序で実行
する「逆方向プログラム」を生成する。逆方向プログラ
ムは、それを実行することで順方向プログラムの動作結
果を打ち消すように構成される。このような2つのプロ
グラムを生成するためには、プログラムの動作において
メモリの内容が書き換わる個所と、プログラムの流れ
(制御フロー)が変更される個所に対して特別な処理を
行う必要がある。When the source code is translated into a program, the compiler of the present invention generates a "forward program" that is executed in the same order as a normal program and a "backward program" that is executed in the reverse order. The backward program is configured to cancel the operation result of the forward program by executing it. In order to generate such two programs, it is necessary to perform special processing on a portion where the contents of the memory are rewritten in the operation of the program and a portion where the flow of the program (control flow) is changed.
【0012】まず、メモリの内容が書きかえられる個所
に対する処理を説明する。メモリ内容の書きかえには、
(1)未初期化メモリを初期設定する場合、(2)初期
化済みメモリの内容を上書きする場合、(3)初期化済
みメモリを開放する場合の3種類がある。First, the processing for the portion where the contents of the memory are rewritten will be described. To rewrite the memory contents,
There are three types: (1) initializing the uninitialized memory, (2) overwriting the contents of the initialized memory, and (3) releasing the initialized memory.
【0013】未初期化メモリを初期化する場合は、逆方
向プログラムとしてメモリの内容が未初期化状態に戻っ
たことを障害解析手段(デバッガ)に対して伝達する逆
方向プログラムを出力する。これによって、順方向プロ
グラムでは未初期化メモリが初期化される過程が、逆方
向プログラムでは初期化済みメモリが未初期化状態へ戻
る過程として再現されることになる。When initializing the uninitialized memory, a backward program is output as a backward program which informs the failure analysis means (debugger) that the memory contents have returned to the uninitialized state. As a result, the process of initializing the uninitialized memory in the forward program is reproduced as the process of returning the initialized memory to the uninitialized state in the reverse program.
【0014】初期化済みメモリの内容を上書きする場合
は、上書きされる前のメモリ内容を何らかの方法で保存
しておき、逆方向プログラム側で保存されていた値を復
元することによって、メモリが上書きされる前の状態を
復元する。この時、上書きされる前のメモリの内容を復
元するには、以下に示す3通りの方法を使用する。When the contents of the initialized memory are overwritten, the contents of the memory before being overwritten are saved by some method, and the values saved in the backward program side are restored to overwrite the memory. Restore the state before. At this time, in order to restore the contents of the memory before being overwritten, the following three methods are used.
【0015】1番目の方法は、失われるデータを順方向
プログラム側でログ用のメモリに保存しておき、逆方向
プログラム側でそれを取り出して復元する方法である。
この方法は従来技術である逆命令ログ法とよく似ている
が、逆命令ログ法ではログ情報として、逆命令、アドレ
ス、サイズなどの情報がログに記録されるのに対し、こ
の発明の方法では逆方向プログラムを実行することでこ
れらの情報が得られるため、ログに記録する必要がない
という特徴がある。The first method is to store lost data in a log memory on the forward program side, and retrieve and restore it on the backward program side.
This method is very similar to the reverse instruction log method which is a conventional technique, but in the reverse instruction log method, information such as reverse instruction, address and size is recorded in the log as the log information. Since this information can be obtained by executing the backward program, there is no need to record it in the log.
【0016】2番目の方法は、処理の内容がもともと可
逆性のある演算である場合に、その可逆性を利用して値
を復元する方法である。たとえば整数の値を1だけ増や
す演算(インクリメント演算)は可逆性のある演算であ
り、これは値を1だけ減らす演算(デクリメント演算)
を行うことによって、演算が行われる前の状態を復元す
ることができる。したがって、順方向プログラム側でイ
ンクリメント演算を行う個所に対しては、逆方向プログ
ラム側でデクリメント演算を行うことで、過去の状態を
復元することができる。The second method is a method of reconstructing a value by utilizing the reversibility when the contents of the process are originally reversible operations. For example, an operation that increases the value of an integer by 1 (increment operation) is a reversible operation, and this is an operation that decreases the value by 1 (decrement operation).
By performing the above, the state before the calculation can be restored. Therefore, the past state can be restored by performing the decrement operation on the backward program side for the portion on which the forward program side performs the increment operation.
【0017】3番目の方法は、メモリの上書きによって
失われるデータを再度計算することによってデータを再
生する方法である。失われたデータを計算するときに使
用したデータが、まだ他の変数やログ領域の中に残って
いる場合に使用する。たとえば変数Aの値が変数Bと変
数Cの和であるとする。このとき、変数Aの値が上書き
によって失われても、変数Bと変数Cの値がまだ残って
いるならば、BとCの和をもう一度計算することによっ
て失われたデータを復元することができる。The third method is to reproduce the data by recalculating the data lost by overwriting the memory. It is used when the data used to calculate the lost data still remains in other variables or log areas. For example, assume that the value of variable A is the sum of variable B and variable C. At this time, even if the value of the variable A is lost by overwriting, if the values of the variable B and the variable C still remain, the lost data can be restored by calculating the sum of B and C again. it can.
【0018】次に、メモリ開放の場合について説明す
る。メモリの開放は、メモリが保持していたデータが失
われるという点において本質的にメモリの上書きと同一
である。そのため、メモリ上書きの場合と同じ手法を使
用することでデータを再生することができる。ただし、
メモリの開放は可逆性のある演算ではないので、失われ
るデータをログにとる方法と、再計算を行うことによっ
てデータを再生する方法の2つのみが使用できる。Next, the case where the memory is released will be described. Freeing memory is essentially the same as overwriting memory in that the data it held is lost. Therefore, the data can be reproduced by using the same method as the case of the memory overwrite. However,
Since freeing memory is not a reversible operation, only two methods can be used: logging lost data and replaying data by recalculating.
【0019】次に、制御の流れが変更される個所に対し
ての処理を説明する。制御の流れの変更に対しては、逆
方向プログラムの制御の流れが、順方向プログラムの制
御の流れと逆になるように構成する。制御の流れの変更
には、条件分岐、無条件分岐、繰り返し(ループ)、サ
ブルーチン呼び出し、割り込みの5つの種類がある。Next, a process for a portion where the control flow is changed will be described. When the control flow is changed, the control flow of the backward program is configured to be the reverse of the control flow of the forward program. There are five types of control flow changes: conditional branch, unconditional branch, repeat (loop), subroutine call, and interrupt.
【0020】順方向プログラムで条件分岐を行う処理
は、逆方向プログラムでも条件分岐を行う処理となる。
逆方向プログラムでは条件分岐の選択肢(経路)のう
ち、どれが選択されたかを再現する必要があるため、順
方向プログラム側で選択結果を記録しておき、逆方向プ
ログラムでその情報を元に条件分岐の選択を再現する。
選択結果を記録する方法には、メモリの上書きによって
失われる値を復元するのに使用したのと同じ方法を使
う。The processing for performing a conditional branch in the forward program is the processing for performing a conditional branch in the backward program as well.
In the backward program, it is necessary to reproduce which one of the options (routes) for conditional branching was selected, so the forward program side records the selection result, and the backward program records the conditions based on that information. Reproduce the branch selection.
The method of recording the selection results is the same method used to restore the values lost due to the memory overwrite.
【0021】順方向プログラムで無条件分岐を行う個所
に対しては、逆方向プログラム側では条件分岐を行うプ
ログラムを生成する。これは、無条件分岐では複数の分
岐が1つの飛び先(飛び先ラベル)に向かってジャンプ
する場合があるためで、逆方向プログラム側で無条件分
岐を逆向きにたどるためには、どこから飛んできたのか
を選択する必要があるためである。これに伴って、順方
向プログラム側の無条件分岐を行う個所にも、どの場所
からジャンプを行ったのかを記録する処理が必要にな
る。For a portion where an unconditional branch is performed in the forward program, a program for performing a conditional branch is generated on the backward program side. This is because in an unconditional branch, multiple branches may jump toward one jump destination (jump destination label). This is because it is necessary to select whether it was possible. Along with this, it is necessary to record the location from which the jump is made at the location of the unconditional branch on the forward program side.
【0022】順方向プログラムで繰り返し処理(ルー
プ)を行う個所に対しては、逆方向プログラム側にもル
ープの処理を生成する。逆方向プログラムの実行の際に
はループがどれくらいの回数だけ回ったのかを再現する
必要があるため、順方向プログラムの実行時にループの
実行回数に関する情報を何らかの手段で記録しておき、
逆プログラム側でそれを取り出して、順方向プログラム
と同じ回数だけループするように構成する。A loop process is also generated on the backward program side for a portion where the iterative process (loop) is performed in the forward program. Since it is necessary to reproduce how many times the loop has turned when executing the backward program, record information on the number of times the loop is executed by some means when executing the forward program,
The reverse program takes it out and configures it to loop as many times as the forward program.
【0023】順方向プログラムでサブルーチン呼び出し
を行う処理は、逆方向プログラムでも対応する逆方向プ
ログラム内のサブルーチン呼び出しを行う処理となる。
これについては特に特別な処理は必要ない。The process of calling a subroutine in the forward program is the process of calling a subroutine in the corresponding backward program in the backward program.
No special treatment is required for this.
【0024】割り込みに対しては特別な処理が必要にな
る。割り込みはいつ発生するのかあらかじめ予測できな
いため、いつ、どこで発生したのかを記録に残す必要が
ある。これには割り込み発生ログを使用する。割り込み
発生ログは通常の逆方向実行用のログとは別の領域に保
存する。また、割り込み発生ログを記録する処理は割り
込みによって実行されるプログラム(割り込みハンド
ラ)の中に埋め込んでおく。Special processing is required for interrupts. Since it is not possible to predict when an interrupt will occur, it is necessary to record when and where it occurred. The interrupt generation log is used for this. The interrupt generation log is saved in an area different from the normal backward execution log. The process of recording the interrupt generation log is embedded in the program (interrupt handler) executed by the interrupt.
【0025】割り込み時点を表すデータには、その時点
でのログ領域の先頭を表すカウンタ(ポインタ)と、割
り込みが発生したプログラム上のアドレスのペアを用い
る。このペアが割り込み時点を一意に表すようにするた
めには、ログがまったく出力されないようなループ処理
やサブルーチン呼び出しがあってはならないため、この
ようなループ処理やサブルーチン呼び出しの個所に、ダ
ミーのログ処理を入れておく。A pair of a counter (pointer) indicating the head of the log area at that time and an address on the program where the interrupt occurred is used as the data indicating the interrupt time. In order for this pair to uniquely represent the interrupt point, there must be no loop processing or subroutine call that does not output the log at all.Therefore, at the location of such loop processing or subroutine call, a dummy log Put processing.
【0026】どちらの場合でも、逆方向実行時に、割り
込み発生ログが示す個所へ達したら、逆方向プログラム
側の対応する割り込み処理が呼び出される必要がある。
この呼び出し処理は障害解析手段(デバッガ)が行う。In either case, upon execution in the backward direction, when the location indicated by the interrupt generation log is reached, the corresponding interrupt processing on the backward program side must be called.
This call processing is performed by the failure analysis means (debugger).
【0027】次に、障害解析手段(デバッガ)の動作に
ついて説明する。障害解析手段は、まず順方向プログラ
ムが停止している個所を求め、コンパイラが生成した順
方向プログラムと逆方向プログラムの対応関係を表す情
報を用いて、停止個所に対応する逆方向プログラムの位
置を求め、その位置から逆方向プログラムを実行してい
くことによって順方向プログラムの過去の状態を復元す
る。Next, the operation of the failure analysis means (debugger) will be described. The failure analysis means first finds the point at which the forward program is stopped, and uses the information indicating the correspondence between the forward program and the backward program generated by the compiler to determine the position of the backward program corresponding to the stopped point. Then, the backward state of the forward program is restored by executing the backward program from that position.
【0028】状態をどこまで復元するのかはソースコー
ド上の位置をユーザーが指示することによって行う。ソ
ースコードと順方向プログラムの対応関係、および、順
方向プログラムと逆方向プログラムの対応関係を用いる
ことで、逆方向プログラム上の位置が求められるので、
その個所まで逆方向プログラムを実行すれば、指定され
た時点まで復元された状態となる。The extent to which the state is restored is determined by the user indicating the position on the source code. By using the correspondence between the source code and the forward program and the correspondence between the forward program and the backward program, the position on the backward program can be obtained,
If the backward program is executed up to that point, it will be restored to the specified time.
【0029】以下、図示される具体的な実施の形態につ
いて説明する。図1に、本実施の形態における障害解析
手段(デバッガ)が動作している時のハードウェア構成
と、そのメモリ内のソフトウェア構成を示す。計算機本
体(0101)には、中央処理装置(プロセッサ)(0
102)と、主記憶(メモリ)(0103)が含まれて
いる。この主記憶(0103)上には翻訳手段(コンパ
イラ)が作成した順方向プログラム(0104)と、逆
方向プログラム(0105)、および障害解析手段(デ
バッガ)(0106)のソフトウェアが含まれている。Specific embodiments shown in the drawings will be described below. FIG. 1 shows a hardware configuration when the failure analysis unit (debugger) according to the present embodiment is operating, and a software configuration in the memory. The computer main body (0101) has a central processing unit (processor) (0
102) and a main memory (memory) (0103). The main memory (0103) contains the software of the forward program (0104) created by the translation means (compiler), the backward program (0105), and the failure analysis means (debugger) (0106).
【0030】順方向プログラムと、逆方向プログラム
は、一つのデータ領域(0107)を共有し、この領域
を使用して計算を行う。また、順方向プログラムの実行
によって生成されたログ情報はログ領域(0108)に
書き込まれ、逆方向プログラムの実行時に読み取られ
る。また、割り込みに関するログ(0109)は通常の
ログ領域とは別に取られる。The forward program and the backward program share one data area (0107) and use this area to perform calculation. Also, the log information generated by the execution of the forward program is written in the log area (0108) and read when the backward program is executed. The log (0109) related to the interrupt is taken separately from the normal log area.
【0031】順方向プログラムと逆方向プログラムの切
り替えや、その他の障害解析に関わる処理は、障害解析
手段のソフトウェア(デバッガ)が行う。このソフトウ
ェアの働きによって、プロセッサが順方向と逆方向のど
ちらのプログラムに対して割り当てられるかがコントロ
ールされる。障害解析を行う使用者(ユーザ)は制御端
末(0110)経由でこのデバッガを操作し、順方向プ
ログラムまたは逆方向プログラムの実行、およびメモリ
中のデータの表示や修正などの操作を行う。Switching between the forward program and the backward program, and other processing related to failure analysis are performed by software (debugger) of failure analysis means. This software controls whether the processor is assigned to forward or backward programs. A user (user) who performs a failure analysis operates this debugger via the control terminal (0110) to execute a forward program or a backward program and display or modify data in the memory.
【0032】次に、図2に、コンパイラ(翻訳手段)内
部のブロック構成とデータ・フローを示す。コンパイラ
(0202)は、ソース・プログラム(0201)をソ
ース読み込み部(0203)で読み込み、字句解析部
(0204)で文字列から記号を抽出し、構文解析部
(0205)で文法の解析を行って中間解析木と呼ばれ
るデータ構造を作成する。この中間解析木に含まれる無
駄な部分を構文木最適化部(0206)で取り除いた
後、順方向コード生成部(0207)と、逆方向コード
生成部(0208)で計算機の命令コードを生成する。Next, FIG. 2 shows a block structure and a data flow inside the compiler (translating means). The compiler (0202) reads the source program (0201) by the source reading unit (0203), the lexical analysis unit (0204) extracts a symbol from the character string, and the syntax analysis unit (0205) analyzes the grammar. Create a data structure called an intermediate parse tree. After removing a useless part included in the intermediate parse tree by the syntax tree optimizing unit (0206), the forward code generating unit (0207) and the backward code generating unit (0208) generate the instruction code of the computer. .
【0033】この部分がこの発明の特徴的な部分であ
る。通常のコンパイラでは一つのコードのみを生成する
のに対し、この発明のコンパイラでは順方向実行用のコ
ードと、逆方向実行用の2つのコードを生成する。この
部分の詳細については後で詳しく述べる。This part is a characteristic part of the present invention. A normal compiler generates only one code, whereas the compiler of the present invention generates two codes, one for forward execution and the other for backward execution. Details of this portion will be described later.
【0034】次に、コード生成処理で作られた計算機の
命令コードに対して再度、最適化が行われる。これは計
算機毎の特徴を生かした最適化を行うためである。そし
て、最後にコード出力部(0210)と対応関係テーブ
ル生成部(0211)で、コンパイル結果のファイル
(実行プログラム)(0212)に、順方向プログラム
(0213)と、逆方向プログラム(0214)と、原
始プログラム(ソースコード)と各プログラム間の対応
関係を表す対応関係テーブル(0215)が生成され
る。Next, optimization is performed again on the instruction code of the computer created by the code generation processing. This is because optimization is performed by taking advantage of the characteristics of each computer. Finally, in the code output unit (0210) and the correspondence relationship table generation unit (0211), the forward program (0213), the backward program (0214), the file (execution program) (0212) of the compilation result, A correspondence relation table (0215) representing the correspondence relation between the source program (source code) and each program is generated.
【0035】次に、コンパイラが内部で使用するデータ
構造を図3に示す。このデータ構造は、メモリの上書き
によってデータが失われる場合に、上書きされる前の値
をログに残す必要があるものなのか、それとも他の変数
から再計算して求められるものなのかを判定するのに使
用する。Next, FIG. 3 shows a data structure used internally by the compiler. This data structure determines whether the value before being overwritten needs to be logged or is recalculated from another variable when data is lost due to overwriting of memory. Used for.
【0036】データ構造全体は、再生情報テーブル(0
301)を中心に構成される。このテーブルは、変数ま
たは代入可能なメモリ領域(これを総称して左辺値と呼
ぶ)に関する情報と、左辺値を参照する式(左辺式)に
関する情報を示す再生情報(0302)が含まれてい
る。また、再生情報は次々とテーブルに追加される形で
登録されていくため、テーブルがどこまで使用されたか
を示すのにテーブル先頭位置を示すポインタ(030
3)を使用する。The entire data structure is the reproduction information table (0
301). This table includes information about a variable or a substitutable memory area (collectively referred to as an lvalue) and reproduction information (0302) indicating information about an expression (left-side expression) that refers to an lvalue. . Also, since the reproduction information is registered in the form of being added to the table one after another, a pointer (030
Use 3).
【0037】再生情報は、個々の左辺値を識別するため
に使用する左辺式(0304)と、その左辺値がポイン
タ経由で書き換わる可能性(エリアシング可能性)があ
るかどうかを示す真偽値(0305)、その左辺値を参
照するための式(参照式)(0306)、参照式を計算
するために必要になる他の左辺式のリスト(参照依存
先)(0307)、左辺値が失われたときに再計算する
方法を示す再生式(0308)、再生式を計算するため
に必要になる他の左辺式のリスト(再生依存先)(03
09)の合計6個の要素から構成される。The reproduction information is a left-side expression (0304) used to identify each left-side value and a true / false indicating whether or not the left-side value may be rewritten via a pointer (aliasing possibility). A value (0305), an expression (reference expression) (0306) for referencing the left side value, a list of other left side expressions (reference dependents) (0307) required to calculate the reference expression, and a left side value is A replay formula (0308) showing how to recalculate when lost, a list of other left-hand side formulas required for replay formula calculation (playback destination) (03
09) composed of a total of 6 elements.
【0038】参照式と再生式は、中間解析木の形で式の
情報を保持する(0311,0312)。一つの中間解
析木には再帰的に複数の左辺式が含まれていて、それら
の部分左辺式に関する再生情報もテーブルの中に確保さ
れる。どの部分左辺式がテーブルのどこに割り当てられ
たかを示すため、参照依存先リスト(0313)と、再
生依存先リスト(0314)を使用する。依存先がテー
ブルのどの位置にあるかを示すのには、相対的な位置関
係(例えばテーブルの10個前にある等)を表す数値を
用いる。The reference expression and the reproduction expression hold expression information in the form of an intermediate parse tree (0311, 0312). One intermediate parse tree recursively includes a plurality of left-side expressions, and the reproduction information regarding these partial left-side expressions is also secured in the table. The reference dependence destination list (0313) and the reproduction dependence destination list (0314) are used to indicate which partial left side expression is assigned to which part of the table. A numerical value indicating a relative positional relationship (for example, 10 positions before the table) is used to indicate at which position in the table the dependence destination exists.
【0039】また、再生情報の1番目の要素の左辺式
と、参照依存先リスト(0313)に含まれる左辺式、
および再生依存先リストに含まれる左辺式については、
再生情報の検索に使用するため中間解析木の形式ではな
く文字列の式で表現する。The left side expression of the first element of the reproduction information and the left side expression included in the reference dependence destination list (0313),
And the left-side expression included in the playback dependence list,
Since it is used for retrieval of reproduction information, it is expressed by a character string expression instead of the format of the intermediate parse tree.
【0040】次に、このデータ構造を使用して順方向プ
ログラムと逆方向プログラムのコード生成を行う手順に
ついて説明する。まず、代入文をコード生成する場合の
処理手順を図4に示す。この手順では、代入先を表す式
と、代入する値を計算する式の2つのデータを引数とし
て受け取る(S0401)。次に、ポインタを保持する
変数がエリアシング可能であるときに必要になる特別な
処理を行うための手順(S0402)を呼び出す。Next, a procedure for generating codes for a forward program and a backward program using this data structure will be described. First, FIG. 4 shows a processing procedure for code generation of an assignment statement. In this procedure, two pieces of data, an expression representing a substitution destination and an expression for calculating a value to be substituted, are received as arguments (S0401). Next, a procedure (S0402) for performing a special process required when the variable holding the pointer can be aliased is called.
【0041】次に、代入先の左辺式に一致する再生情報
を再生情報テーブルから検索する。この時、左辺式が一
致する再生情報が複数ある場合は、その中で最後に登録
された再生情報を選択する。再生情報には、代入先のデ
ータが失われた時に、それが再計算によって再生可能か
どうかを判定できるデータが含まれているので、後述す
る図5に示す再生可能性の判定手順を用いて再生可能で
あるかどうかを判定する(S0404)。Next, the reproduction information that matches the expression on the left side of the substitution destination is searched from the reproduction information table. At this time, if there are a plurality of pieces of reproduction information having the same left-hand side expression, the reproduction information registered last among them is selected. Since the reproduction information includes data that can be determined by recalculation when the data of the substitution destination is lost, the reproduction possibility determination procedure shown in FIG. 5 described later is used. It is determined whether reproduction is possible (S0404).
【0042】もし、再生可能であると判定された場合
は、順方向プログラムに対しては通常の代入処理を行う
コードを生成する。また、逆方向プログラムに対しては
再計算によって失われた値を再生し、それを代入先の左
辺値に書き戻す処理を生成する(S0405)。また、
再計算処理の生成には後述する図7に示す再生コードの
生成手順を使用する(なお、図4のフローチャートで
は、順方向プログラムに対するコード生成には
「順:」、逆方向プログラムに対するコード生成には
「逆:」と表記する)。If it is determined that the reproduction is possible, a code for performing a normal substitution process is generated for the forward program. For the backward program, the value lost by the recalculation is reproduced, and a process of writing it back to the left-side value of the assignment destination is generated (S0405). Also,
The reproduction code generation procedure shown in FIG. 7 to be described later is used to generate the recalculation process (in the flowchart of FIG. 4, “forward:” is used for code generation for the forward program, and “forward:” for code generation for the backward program). Is written as "reverse:").
【0043】次に、再生情報の参照式と参照依存先に、
再生式と再生依存先をコピーする(S0406)。これ
は、代入によって失われた値を参照する時には、再生式
を使用して参照する必要があることを表す。Next, in the reference expression of the reproduction information and the reference dependence destination,
The reproduction formula and reproduction dependence destination are copied (S0406). This means that when referring to a value lost due to substitution, it is necessary to refer to it using a regenerating formula.
【0044】もし、代入先の左辺式が再生可能ではない
場合は、順方向プログラム側に代入前にデータをログに
保存する_SAVE処理と、その後に通常の代入を行う
代入処理を生成する。また、逆方向プログラムに対して
はログからデータを読み出して代入先に書き戻す_RE
STORE処理を生成する(S0407)。_SAVE
処理と_RESTORE処理の動作については図20と
図21に示す。また、_SAVE処理が何個生成された
かを表すログ生成個数カウンタをインクリメントしてお
く(S0408)。If the left-hand side expression of the substitution destination is not reproducible, the forward program side generates the _SAVE processing for saving the data in the log before the substitution and the substitution processing for performing the normal substitution after that. For the backward program, read the data from the log and write it back to the assignment destination_RE.
A STORE process is generated (S0407). _SAVE
The processing and the operation of the _RESTORE processing are shown in FIGS. 20 and 21. Further, the log generation number counter indicating how many _SAVE processes have been generated is incremented (S0408).
【0045】次に、再生情報の参照式を、ログからデー
タを取り出す_PEEK式に置き換える(S040
9)。_PEEK式にはログのどこからデータを取り出
すかを指示する引数を与える必要があるが、その値には
現在のログ生成個数カウンタの値を与える。この値は仮
のもので、後で参照式が実際に使用されるときに修正さ
れる。また、参照依存先は空にする。_PEEK式の動
作については図22に示す。Next, the reference expression of the reproduction information is replaced with the _PEEK expression for extracting the data from the log (S040).
9). The _PEEK expression needs to be given an argument that indicates from which part of the log the data should be extracted, and the value is given as the value of the current log generation number counter. This value is tentative and will be modified later when the lookup expression is actually used. Also, the reference dependency destination is empty. The operation of the _PEEK formula is shown in FIG.
【0046】次に、新たに書き込まれた値に関する再生
情報を登録する(S0410)。この登録は新しい再生
情報を追加していく形で行うため、同一の左辺式に対す
る代入が複数箇所ある場合は複数の再生情報が登録され
ることになる。これは、左辺値の過去の状態を表す情報
と、最新の状態を表す情報が、すべて記録に残るように
するためである。Next, the reproduction information regarding the newly written value is registered (S0410). Since this registration is performed by adding new reproduction information, if there are a plurality of substitutions for the same left-side expression, a plurality of reproduction information will be registered. This is so that the information indicating the past state of the left side value and the information indicating the latest state are all recorded.
【0047】再生情報のそれぞれの要素は次のように設
定する。
(1)左辺式は登録する左辺式を文字列にしたものを設
定する。
(2)エリアシング可能かどうかの真偽値には、ローカ
ル変数と値渡しの引数に対しては偽、それ以外の左辺式
については真を設定する。
(3)参照式に対しては左辺式の中間解析木をそのまま
設定する。
(4)参照依存先については、参照式の部分左辺式をす
べて取り出して一覧の形にし、それらを再生情報テーブ
ルから検索して相対的な位置関係の情報を設定する。
(5)再生式には代入処理の右辺の式(右辺式)を設定
する。これは最後に行われた代入がどのように行われた
かを記録するためである。
(6)再生依存先については、参照依存先と同じように
右辺式のすべての部分左辺式を取り出したリストを作成
して設定する。Each element of the reproduction information is set as follows. (1) The left-hand side expression sets the left-hand side expression to be registered as a character string. (2) For the boolean value indicating whether aliasing is possible, false is set for the local variable and the argument passed by value, and true is set for the other left-side expressions. (3) For the reference expression, the intermediate parse tree of the expression on the left side is set as it is. (4) As for the reference dependence destination, all the left-hand side expressions of the reference expressions are taken out to form a list, and they are searched from the reproduction information table to set the information on the relative positional relationship. (5) The expression on the right side of the substitution process (right side expression) is set as the reproduction expression. This is to record how the last substitution made. (6) As for the reproduction dependence destination, as in the case of the reference dependence destination, a list in which all partial left-side expressions of the right-side expression are extracted is created and set.
【0048】次に、再生可能性の判定手順を図5に示
す。この手順は、判定対象の左辺式に関する再生情報を
受け取り(S0501)、受け取った再生情報の再生式
が空である場合は、再生不可能であることを表している
ので偽(再生不能)であると判定して終了する(S05
02,S0503)。逆に、再生式がある場合は、再生
式の計算に必要になる依存先がすべて参照可能であるか
どうかを検査する(S0504,S0506,S050
7)。もし、すべての依存先が参照可能である場合は真
(再現可能)であると判定して終了する(S050
5)。逆に、一つでも参照不可能な依存先がある場合
は、偽(再生不能)であると判定して終了する(S05
08)。Next, FIG. 5 shows the procedure for determining the reproducibility. This procedure is false (unreproducible) because the reproduction information of the left-hand side expression to be judged is received (S0501), and if the reproduction expression of the received reproduction information is empty, it means that reproduction is impossible. And terminates (S05
02, S0503). On the contrary, if there is a replay formula, it is checked whether or not all the dependees necessary for replay formula calculation can be referenced (S0504, S0506, S050).
7). If all the dependees can be referred to, it is determined to be true (reproducible) and the process ends (S050).
5). On the contrary, if even one of the dependents cannot be referred to, it is determined to be false (reproducible) and the processing ends (S05).
08).
【0049】依存先が参照可能であるかどうかは、図6
に示す参照可能性の判定手順を使用する。この手順は、
再生情報として渡された左辺式の参照依存先を再帰的に
すべてたどり(S0601,S0602,S0603,
S0604,S0606,S0607)、それら全てが
参照可能である場合に真(参照可能)と判定する(S0
605)。もし、一つでも参照不可能なものが見つかれ
ば偽(参照不能)と判定する(S0609)。また、一
度参照不能になったデータは、後から参照可能な状態に
戻ることはないので、参照不能と判定された左辺式の参
照式を空にしておくことで次回の判定が高速にできるよ
うにしておく(S0608)。Whether or not the dependee can be referred to is shown in FIG.
Use the referenceability determination procedure shown in. This procedure
Recursively traces all the reference dependence destinations of the left-hand side expression passed as the reproduction information (S0601, S0602, S0603
S0604, S0606, S0607), and if all of them can be referenced, it is determined to be true (reference is possible) (S0
605). If even one is unreferenceable, it is determined to be false (reference not possible) (S0609). In addition, once the data becomes unreferenceable, it will not return to the referenceable state later, so by leaving the reference expression of the left-hand side expression that is determined as unreferenceable empty, the next determination can be made faster. (S0608).
【0050】次に、再生コード(再計算をすることで失
われたデータを復元するプログラム・コード)を生成す
る処理手順を図7に示す。再生コードの生成では、再生
依存先のすべての左辺値を参照する処理を生成し(S0
701,S0702,S0703)、それらによって参
照されたデータを用いて再生式を計算する処理を生成す
る(S0705)。ただし、再生式に_PEEK式が含
まれている場合は、現在のログ生成個数カウンタの値を
_PEEK式の引数から引いた値を計算し、その値で_
PEEK式の引数を置き換えた式を作って再計算を行う
コードを生成する(S0706,S0707)。これ
は、実際に参照する時に参照先のログの位置がどれくら
いの深さの所にあるのかを計算するためである。Next, FIG. 7 shows a processing procedure for generating a reproduction code (a program code for restoring data lost by recalculation). In the generation of the reproduction code, a process for referring to all the lvalues of the reproduction dependence destination is generated (S0
701, S0702, S0703), and a process for calculating a reproduction formula using the data referred to by them (S0705). However, when the playback expression includes the _PEEK expression, the value of the current log generation number counter is subtracted from the argument of the _PEEK expression to calculate the value,
A code for performing recalculation is created by creating an expression in which the arguments of the PEEK expression are replaced (S0706, S0707). This is to calculate how deep the location of the referenced log is when actually referring to it.
【0051】また、参照コードの生成手順を図8に示
す。これは、計算と検査の対象が再生式と再生依存先で
はなく、参照式と参照依存先である点を除けば、図7に
示す再生コードの生成手順と同じものである。すなわ
ち、参照コードの生成では、参照依存先のすべての左辺
値を参照する処理を生成し(S0801,S0802,
S0803)、それらによって参照されたデータを用い
て参照式を計算する処理を生成する(S0805)。た
だし、参照式に_PEEK式が含まれている場合は、現
在のログ生成個数カウンタの値を_PEEK式の引数か
ら引いた値を計算し、その値で_PEEK式の引数を置
き換えた式を作って再計算を行うコードを生成する(S
0806,S0807)。。FIG. 8 shows the procedure for generating the reference code. This is the same as the reproduction code generation procedure shown in FIG. 7, except that the target of calculation and inspection is the reference expression and the reference dependence destination, not the reproduction expression and the reproduction dependence destination. That is, in the generation of the reference code, a process of referring to all the lvalues of the reference dependence destination is generated (S0801, S0802,
(S0803), a process of calculating a reference expression using the data referred to by them is generated (S0805). However, when the _PEEK expression is included in the reference expression, the value of the current log generation number counter is subtracted from the argument of the _PEEK expression to calculate the value, and the expression that replaces the argument of the _PEEK expression is created. Generate code for recalculation (S
0806, S0807). .
【0052】次に、自己破壊代入回避処理について説明
する。自己破壊代入は、ポインタ経由で値を書き込む時
にポインタ自身が失われるような代入で、代入先の左辺
式がポインタ経由の左辺式で、かつポインタを保持する
左辺値がエリアシング可能な場合にのみ発生する。この
ような代入に対しては代入よってポインタ値が失われる
前にポインタを保存しておく必要がある。Next, the self-destructive substitution avoidance process will be described. Self-destructive assignment is an assignment in which the pointer itself is lost when writing a value via a pointer, and only if the left-side expression of the assignment destination is the left-side expression via the pointer and the left-side value holding the pointer is aliasable. Occur. For such assignments, it is necessary to save the pointer before the assignment causes the pointer value to be lost.
【0053】図9に、自己破壊代入の恐れがある部分に
対してポインタを保存する処理を生成する手順を示す。
まず、代入先の左辺式がポインタ経由での代入かどうか
を判定し(S0902)、かつポインタを保持する変数
の再生情報を参照してエリアシング可能であるかを判定
する(S0903)。この場合は、自己破壊代入が起き
る可能性があるためポインタを保存する必要が生じる。FIG. 9 shows a procedure for generating a process for saving a pointer for a portion where self-destructive substitution may occur.
First, it is determined whether the left-side expression of the assignment destination is an assignment via a pointer (S0902), and it is determined whether aliasing is possible by referring to the reproduction information of the variable holding the pointer (S0903). In this case, it is necessary to save the pointer because self-destructive substitution may occur.
【0054】しかし、このようなポインタがポインタ自
身を指しているという状態は多くのプログラムでは発生
しないため、コンパイラに対するオプション指令によっ
て、回避処理を行わないように指示できるようにしてお
けば、大部分のプログラムでオーバーヘッドを回避する
ことができる。図9のステップ(S0904)はこの回
避処理を生成するかどうかを判定する部分で、ユーザー
が回避処理を生成すると選択した場合のみポインタの保
存処理と再現処理を生成する(S0905)。However, since the state where such a pointer points to the pointer itself does not occur in many programs, if it is possible to instruct the compiler not to perform the avoidance processing by the option directive, most of the The overhead can be avoided with the program. The step (S0904) of FIG. 9 is a part for determining whether or not to generate the avoidance process, and the pointer saving process and the reproducing process are generated only when the user selects to generate the avoidance process (S0905).
【0055】次に、代入を含む数式全体のコード生成手
順を図10に示す。図4から図9までの代入処理に関す
るコード生成手順は、図10に示した式全体のコード生
成手順から呼び出されるようになっている。Next, FIG. 10 shows a code generation procedure for the whole mathematical expression including substitution. The code generation procedure relating to the assignment process shown in FIGS. 4 to 9 is called from the code generation procedure for the entire expression shown in FIG.
【0056】式全体のコード生成では、まず、最初に式
全体を部分左辺式に分解し、それらが再生情報テーブル
に登録されていない場合は、新たに登録する処理を行う
(S1002)。この時、図4に示す再生情報の登録処
理(S0410)と同様に、再生情報内部の各情報を初
期化しておく。ただし、この場合は、右辺式に相当する
ものは無いため、再生式と再生依存先は空の状態で生成
する。In the code generation of the entire expression, first, the entire expression is decomposed into partial left-side expressions, and if they are not registered in the reproduction information table, a new registration processing is performed (S1002). At this time, as in the reproduction information registration process (S0410) shown in FIG. 4, each information inside the reproduction information is initialized. However, in this case, since there is no equivalent to the right-hand side expression, the reproduction expression and the reproduction dependence destination are generated in an empty state.
【0057】次に、式の中に左辺式のアドレスを取得す
る演算が含まれているかどうかを判定する(S100
3)。左辺式のアドレスが取得された場合、その左辺式
はエリアシング可能になるため、再生情報にエリアシン
グ可能であることを記録する。Next, it is determined whether or not the expression includes an operation for obtaining the address of the left side expression (S100).
3). When the address of the left-hand side expression is acquired, the left-hand side expression can be aliased, and therefore it is recorded in the reproduction information that it can be aliased.
【0058】次に、式が関数呼び出しを含んでいるかど
うかを判定し(S1005)、関数呼び出しが含まれて
いる場合は、関数の帰り値を保持するローカル変数を追
加して、関数呼び出しの部分を式から分離し(S100
6)、分離した関数呼び出しが式の計算の前に行われる
ようにする(S1007)。これは、式の中から代入以
外の副作用を取り除くためである。関数呼び出しのコー
ド生成手順については後述する図11に示す。Next, it is judged whether or not the expression includes a function call (S1005), and if the function call is included, a local variable holding the return value of the function is added to the function call part. Is separated from the expression (S100
6), the separated function call is made before the calculation of the expression (S1007). This is to remove side effects other than assignment from the expression. The code generation procedure for function call is shown in FIG. 11 described later.
【0059】次に、式が可逆演算のパターンに一致して
いるかどうかを判定する(S1008)。整数の加減算
と符号反転、ビット値の排他的論理和(XOR)とビッ
ト反転などの計算は、ログを使用しなくても計算結果か
ら計算前の値を正確に再現することができるため、これ
らの演算に対して、あらかじめ用意しておいた変換パタ
ーンに基づいて順方向プログラムと逆方向プログラムを
生成する(S1011)。この時、可逆パターン以外の
部分についてはあらかじめ式を分離しておき(S100
9)、可逆パターン以外の式については、式のコード生
成手順を再帰的に呼び出すことでコード生成を行う(S
1010)。Next, it is determined whether the expression matches the reversible operation pattern (S1008). Calculations such as addition and subtraction of integers and inversion of signs, exclusive OR (XOR) of bit values and bit inversion can accurately reproduce the value before calculation from the calculation result without using a log. With respect to the above calculation, a forward program and a backward program are generated based on a conversion pattern prepared in advance (S1011). At this time, the equations are separated in advance for the portions other than the reversible pattern (S100
9), for expressions other than the reversible pattern, code generation is performed by recursively calling the code generation procedure of the expression (S
1010).
【0060】次に、式が代入演算を含むかどうかを判定
し(S1012)、代入演算が含まれている場合は、代
入先(左辺式)と代入値を求める式(右辺式)に分離し
(S1013)、左辺式と右辺式のペアを代入処理のコ
ード生成手順(図4から図9)を呼び出すことで、代入
に関するコードを生成させる(S1014)。Next, it is determined whether or not the expression includes an assignment operation (S1012). If the expression includes an assignment operation, it is separated into an assignment destination (left side expression) and an expression for obtaining an assignment value (right side expression). (S1013), by calling the code generation procedure (FIGS. 4 to 9) of the assignment process for the pair of the left-side expression and the right-side expression, a code related to the assignment is generated (S1014).
【0061】もし、式が可逆演算パターンに一致せず、
代入演算でもない場合は、通常の数値計算であるため、
通常のコンパイラが行うのと同じように、計算を行う処
理を生成する(S1015)。If the expression does not match the reversible arithmetic pattern,
If it is not an assignment operation, it is a normal numerical calculation, so
In the same manner as a normal compiler does, a process for performing a calculation is generated (S1015).
【0062】次に、関数呼び出しの手順を図11に示
す。関数呼び出しでは、まず、最初に実引数を評価する
処理を生成しておく(S1102)。ただし、これは順
方向プログラムの場合のみで、逆方向プログラムは引数
の評価を必要としない。これは順方向プログラムが引数
から結果を求めるのに対し、逆方向プログラムは結果か
ら元データへと遡っていくためである。ただし、関数に
与えるデータの量については、順方向プログラムと逆方
向プログラムを一致させておく。これは、スタックのメ
モリ・レイアウトが順方向と逆方向で同じになるように
するためである。Next, FIG. 11 shows a procedure for calling a function. In the function call, first, a process for evaluating an actual argument is first generated (S1102). However, this is only the case for forward programs, and backward programs do not require argument evaluation. This is because the forward program obtains the result from the argument, while the backward program goes back from the result to the original data. However, regarding the amount of data to be given to the function, the forward program and the backward program should be matched. This is to ensure that the stack memory layout is the same in the forward and reverse directions.
【0063】引数を評価するコードの生成が終わった
ら、呼び出される関数が「副作用なし」と分類される関
数に属しているかどうかを判定する(S1103)。こ
れは、SINやCOSなどの、まったく副作用を持たな
い数学関数に対しては逆方向プログラムを生成する必要
がないためである。もし、副作用のない関数であった場
合は、順方向プログラム側だけに関数呼び出しのコード
を生成しておく(S1104)。After the code for evaluating the arguments is generated, it is determined whether the called function belongs to the function classified as "no side effect" (S1103). This is because it is not necessary to generate backward programs for mathematical functions such as SIN and COS that have no side effects. If the function has no side effect, the function call code is generated only on the forward program side (S1104).
【0064】逆に、「副作用なし」と登録されていない
関数に対しては、順方向プログラム用の関数(関数名の
先頭に_F_が付く)と、逆方向プログラム用の関数
(関数名の先頭に_B_が付く)が生成されているはず
だから、順方向と逆方向のそれぞれに対して、関数呼び
出しのコードを生成する(S1105)。On the other hand, for functions not registered as "no side effect", functions for forward program (function name has _F_ at the beginning) and functions for backward program (function name at the beginning) Since _B_ is added to each of the forward and backward directions, a function call code is generated for each of the forward direction and the backward direction (S1105).
【0065】また、副作用がある関数が呼び出された場
合、グローバル変数やポインタで指されるメモリ上の変
数などのエリアシング可能な左辺値は、関数によって書
き換えられている可能性がある。データの値と再生式が
一致しない状態では再生式は使用できないため、書き換
えが行われる可能性があるすべての左辺式、すなわちエ
リアシング可能な左辺式に対して、再生情報から再生式
をクリアしておく必要がある(S1106)。When a function having a side effect is called, there is a possibility that the aliasable left side value of the global variable or the variable on the memory pointed to by the pointer is rewritten by the function. Since the playback formula cannot be used when the data value and the playback formula do not match, clear the playback formula from the playback information for all left-hand side expressions that may be rewritten, that is, the left-hand side expressions that can be aliased. It is necessary to keep it (S1106).
【0066】また、同様に、関数の中で生成されるログ
の個数は未知であるため、_PEEK式によってログの
古い部分に積まれているデータにアクセスすることがで
きなくなる。従って、参照式に_PEEK式が含まれる
再生情報に対しては参照式をクリアしておく(S110
6)。また、この時、古いログにアクセスする位置を求
めるために使用していたログ生成個数カウンタもゼロに
しておく。Similarly, since the number of logs generated in the function is unknown, the data accumulated in the old part of the log cannot be accessed by the _PEEK expression. Therefore, the reference expression is cleared for the reproduction information including the _PEEK expression in the reference expression (S110).
6). In addition, at this time, the log generation number counter used for obtaining the position to access the old log is also set to zero.
【0067】次に、図12に関数定義のコード生成手順
を示す。関数定義では順方向用の関数と逆方向用の関数
が一つのプログラムの中に生成されるため、それぞれの
関数の名前を付け替えることによって区別できるように
しておく。この時、順方向用関数に対しては関数名の先
頭に_F_を付ける。同様に、逆方向用の関数には_B
_を付ける(S1202)。Next, FIG. 12 shows a function definition code generation procedure. In the function definition, the function for the forward direction and the function for the backward direction are generated in one program, so it is possible to distinguish them by renaming each function. At this time, _F_ is added to the head of the function name for the forward function. Similarly, the function for the reverse direction is _B
Add _ (S1202).
【0068】次に、関数本体のコード生成のための準備
に入る。まず、再生情報テーブルを初期化して空の状態
にする(S1203)。これは、この発明における再生
情報が、個々の関数毎に管理されるためで、関数の範囲
を超えて左辺値の状態を管理するようにはなっていない
からである。そのため、関数毎に個別にテーブルの作成
(S1203)と破棄(S1213)を行う。Next, preparations are made for code generation of the function body. First, the reproduction information table is initialized to be empty (S1203). This is because the reproduction information in the present invention is managed for each individual function, and the state of the left side value is not managed beyond the range of the function. Therefore, a table is created (S1203) and discarded (S1213) for each function.
【0069】次に、ローカル変数のための再生情報を割
り当てる(S1204)。この時、左辺式、エリアシン
グ可能かどうかの真偽値、参照式、参照依存先について
は、図4の再生情報割り当て(S0410)と同様に設
定する。しかし、再生式については_INVALIDA
TE処理を設定しておく。これは、ローカル変数が最初
に代入される前は未定義状態であることを示すためのも
のである。Next, reproduction information for local variables is assigned (S1204). At this time, the left side expression, the true / false value of whether or not aliasing is possible, the reference expression, and the reference dependence destination are set in the same manner as in the reproduction information allocation (S0410) in FIG. However, regarding the playback formula, _INVALIDA
TE processing is set. This is to show that the local variable is in an undefined state before being first assigned.
【0070】次に、無条件分岐処理で使用する到達経路
番号や、ログ生成個数カウンタなどの関数本体のコード
生成時に使用するデータを初期化しておく(S120
5)。Next, the reaching route number used in the unconditional branching process and the data used when generating the code of the function body such as the log generation number counter are initialized (S120).
5).
【0071】次に、関数が割り込みハンドラ用として指
定されているかどうかを判定する(S1206)。これ
は、割り込みハンドラに対しては通常の関数とは異なっ
たフレーム初期化手順やフレーム開放手順を行う必要が
あるためである。もし、通常の関数である場合は通常関
数用のフレーム生成処理を生成する。もし、割り込みハ
ンドラ用と指定されている場合は、割り込みハンドラ用
のフレーム生成処理を生成する(S1208)。さら
に、割り込みが起こったことを記録するための処理(_
INTERRUPT_START処理)を順方向プログ
ラム側に生成する(S1209)。Next, it is judged whether or not the function is designated for the interrupt handler (S1206). This is because it is necessary to perform a frame initialization procedure and a frame release procedure different from those of normal functions for interrupt handlers. If it is an ordinary function, a frame generation process for the ordinary function is generated. If it is designated for the interrupt handler, a frame generation process for the interrupt handler is generated (S1208). Furthermore, a process for recording that an interrupt has occurred (_
INTERRUPT_START processing) is generated on the forward program side (S1209).
【0072】以上の手順によって、関数本体のコード生
成の準備が整ったので、プログラム列のコード生成手順
を呼び出して関数定義の本体をコード生成する(S12
10)。関数本体部分のコード生成が終了したら、その
コード生成手順の中で追加されたローカル変数の分だけ
フレーム・サイズの情報を修正しておく(S121
1)。With the above procedure, the code generation of the function body is ready, so the code generation procedure of the program sequence is called to generate the code of the function definition body (S12).
10). When the code generation of the function body portion is completed, the frame size information is corrected by the amount of the local variable added in the code generation procedure (S121).
1).
【0073】次に、関数の終了時に必要になる処理の生
成に移る。 ローカル変数と引数については、関数の終
了と共に変数の破棄が行われるため、破棄される変数値
が再生可能ではないものに対しては順方向プログラム側
への保存処理(_SAVE処理)と、逆方向プログラム
側への復帰処理(_RESTORE処理)の生成を行
う。また、再生可能あものに対しては再生コードを逆方
向プログラム側に生成する(S1212)。Next, the process required for ending the function is generated. For local variables and arguments, the variables are discarded when the function ends, so if the discarded variable values are not reproducible, the save process (_SAVE process) to the forward program side and the reverse direction are performed. A return process (_RESTORE process) to the program side is generated. For a reproducible item, a reproduction code is generated on the backward program side (S1212).
【0074】次に、関数本体の中で、ログを生成するよ
うな処理が一つも無かった場合は、ダミーのログを生成
する処理と、読み込む処理を生成する(S1213)。
これは、割り込み発生時点を正確に記録に残すための手
段としてログの先頭位置を使用するため、全くログが生
成されないような関数があると問題が発生するためであ
る。以上で関数本体のコード生成に関する処理は完了で
ある。関数本体のデータに関する再生情報テーブルは不
要になるので削除しておく(S1214)。Next, if there is no process for creating a log in the function body, a process for creating a dummy log and a process for reading are created (S1213).
This is because the log head position is used as a means for accurately recording the interrupt generation time point, so that a problem occurs if there is a function that does not generate a log at all. With the above, the process related to code generation of the function body is completed. The reproduction information table regarding the data of the function body is unnecessary and is deleted (S1214).
【0075】最後に、関数終了時のフレーム削除処理を
生成する。フレーム削除処理は割り込みハンドラと通常
の関数では異なるため、関数がどちらの種類であるかを
判定し(S1215)、通常関数である場合は通常のフ
レーム削除処理を生成する(S1216)。また、割り
込みハンドラである場合は、割り込みハンドラが終了し
たことを記録するログ処理(_INTERRUPT_E
ND処理)を順方向プログラム側に生成し(S121
7)、最後に、割り込みハンドラ用フレーム削除処理を
生成する(S1218)。Finally, a frame deletion process at the end of the function is generated. Since the frame deletion process differs between the interrupt handler and the normal function, it is determined which type the function is (S1215), and if it is the normal function, the normal frame deletion process is generated (S1216). If it is an interrupt handler, log processing (_INTERRUPT_E) that records the termination of the interrupt handler is recorded.
ND processing) is generated on the forward program side (S121
7) Finally, a frame deletion process for interrupt handler is generated (S1218).
【0076】次に、条件分岐のコード生成手順について
図13に示す。条件分岐では、順方向プログラムの実行
時に条件分岐の選択肢のどれが選ばれたのかを何らかの
手段で記録しておき、逆方向プログラムはそれを再現す
ることで、プログラムの制御の流れ(制御フロー)を逆
向きに辿っていく必要がある。これを実現するために
は、条件分岐の選択肢を選ぶための条件式の値が残って
いれば良い。Next, FIG. 13 shows a code generation procedure for conditional branching. In the conditional branch, the control flow of the program (control flow) is recorded by recording some of the choices of the conditional branch during execution of the forward program by some means, and reproducing it in the backward program. It is necessary to trace in the opposite direction. In order to realize this, it is sufficient that the value of the conditional expression for selecting the option of the conditional branch remains.
【0077】もし条件式の値が再生可能である場合は、
再生式を使って条件式の値を再生すればよい。もし再生
不可能である場合は、条件式の結果を保持するローカル
変数を条件式毎に用意しておき、ローカル変数に条件式
の結果を残しておく。このようにする理由は、ログを使
って条件式の結果を残した場合、条件分岐のそれぞれの
選択肢を実行した結果のログの量がそれぞれ異なるため
に、条件式のログが積まれている位置が計算できない可
能性があるためである。If the value of the conditional expression is reproducible,
The value of the conditional expression may be reproduced using the reproduction expression. If reproduction is not possible, prepare a local variable that holds the result of the conditional expression for each conditional expression, and leave the result of the conditional expression in the local variable. The reason for doing this is that if the result of the conditional expression is left using logs, the log amount of the result of executing each option of the conditional branch is different, so the position where the log of the conditional expression is stacked. This is because there is a possibility that cannot be calculated.
【0078】そのため、まず、条件式を計算した結果を
ローカル変数に保存する処理を生成し(S1302)、
順方向プログラム側では計算結果をすぐに分岐に使用す
るコードを生成し、逆方向プログラム側にはローカル変
数に残っている条件式の結果を使用して分岐するコード
を生成する(S1303)。以上によって条件分岐の選
択結果を再現すること関する手順は完了である。Therefore, first, a process of storing the result of calculating the conditional expression in a local variable is generated (S1302),
The forward program side generates a code that immediately uses the calculation result for branching, and the backward program side generates a code that branches using the result of the conditional expression remaining in the local variable (S1303). By the above, the procedure for reproducing the selection result of the conditional branch is completed.
【0079】次に、それぞれの選択肢の実行コードの生
成と、選択肢の実行が終わった後に使用できる再生情報
の選択に関する手順を行う。まず選択肢のコード生成の
前に、それらのために再生情報テーブルのコピーを作成
しておく(S1304)。このコピーした情報を使用し
てそれぞれの選択肢をコード生成し(S1305,S1
306,S1307)、最後に、それぞれの選択肢のコ
ード生成で変更された再生情報テーブルの情報を混合し
て単一化(マージ)する(S1306)。マージの手順
については後述する図16に示す。これによって、条件
分岐を越えた位置で生成されたログや、再生式に関する
情報を利用できるようになる。Next, the procedure concerning the generation of the execution code of each option and the selection of the reproduction information that can be used after the execution of the option is completed is performed. First, before the code generation of the options, a copy of the reproduction information table is created for them (S1304). A code is generated for each option using this copied information (S1305, S1
306, S1307), and finally, the information of the reproduction information table changed by the code generation of each option is mixed and unified (S1306). The merging procedure is shown in FIG. 16 described later. This makes it possible to use the log generated at the position beyond the conditional branch and the information on the replay formula.
【0080】次に、無条件分岐と、ラベルのコード生成
の手順を図14と図15に示す。無条件分岐と、ラベル
に関する処理はペアになって行われる。まず、無条件分
岐側で、順方向プログラム側に経路情報をログに記録す
る処理が生成される(S1402)。これは、一つのラ
ベルに到達する実行経路が複数ある場合に、どの経路を
通ったのかを記録する必要があるためである。次に、ロ
グ生成個数カウンタをインクリメントする(S140
3)。これは、_PEEK式を使ってログにアクセスす
る際に、ログの位置を計算するのに使用される。Next, the procedure for unconditional branching and label code generation is shown in FIGS. The unconditional branch and the processing related to the label are performed as a pair. First, on the unconditional branching side, a process of recording path information in a log on the forward program side is generated (S1402). This is because when there are a plurality of execution routes that reach one label, it is necessary to record which route was taken. Next, the log generation number counter is incremented (S140).
3). This is used to calculate the location of the log when accessing the log using the _PEEK expression.
【0081】次に、経路番号をインクリメントする(S
1404)。これは、それぞれの無条件分岐に対して一
意な番号を生成するためである。この経路番号は、逆方
向プログラムがラベルから無条件分岐の位置へ逆向きに
分岐する際に、飛び先を判別するために使用する(S1
502,S1503)。最後に、ラベルのコード生成後
に再生情報テーブルを全て削除する処理を行う。失われ
たデータの再生ができなくなるため、ログの使用効率が
下がることになるが、これは、複数の経路からどのよう
な再生情報がもたらされるのかを計算するのが困難であ
るからである。Next, the route number is incremented (S
1404). This is to generate a unique number for each unconditional branch. This path number is used to determine the jump destination when the backward program branches backward from the label to the position of the unconditional branch (S1).
502, S1503). Finally, the process of deleting the entire reproduction information table is performed after the label code is generated. Since the lost data cannot be replayed, the log will be used less efficiently, because it is difficult to calculate what replay information will be provided from multiple routes.
【0082】次に、再生情報テーブルのマージの手順を
図16に示す。まず、マージ対象の2つのテーブルAお
よびBと、条件分岐で用いられた条件式を引数として受
け取る(S1601)。次にテーブルAの全ての要素に
対して処理が終わるまでループして処理を繰り返す(S
1602,S1603,S1609)。もしテーブルA
の要素とまったく同じ要素がテーブルBにも存在する場
合は(S1606)、条件分岐の影響を受けなかった
か、または、どちらの経路でも同じ結果になったもので
あるため、そのままテーブルAの中に残しておく。Next, FIG. 16 shows the procedure for merging the reproduction information tables. First, the two tables A and B to be merged and the conditional expression used in the conditional branch are received as arguments (S1601). Next, the process is repeated by looping until all the elements of table A are processed (S
1602, S1603, S1609). If table A
If the element exactly the same as the element in the table B is also present in the table B (S1606), it is not affected by the conditional branch, or the same result is obtained in either path, and therefore, it is directly in the table A. Leave it.
【0083】次に、参照式および参照依存先のみが異な
る要素があった場合は、2つの参照方法を条件式によっ
て切り替えるような条件式を作成し、参照牛木をそれで
置き換えた要素をテーブルAに残しておくようにする
(S1608)。これら以外の要素に対しては、条件分
岐の結果による影響が大きすぎるため破棄する(S16
07)。最後にマージ結果としてテーブルAを返して終
了する(S1604)。Next, if there is an element that differs only in the reference expression and the reference dependent, create a conditional expression that switches the two reference methods by the conditional expression, and replace the reference cow tree with that element in Table A. (S1608). Elements other than these are discarded because the effect of the result of the conditional branch is too large (S16).
07). Finally, the table A is returned as the merge result, and the process ends (S1604).
【0084】次に、繰り返し処理(ループ)のコード生
成手順について図17から図19に示す。繰り返し処理
においては、ループの最初の実行の時と2回目以降の処
理では異なった経路通ってループ内の処理に到達するた
め、再生情報が異なってしまうという問題が生じる。2
回目のループの時点で異なる情報を持つのは、ループ内
で代入が行われる左辺式に関する情報である。そのた
め、ループ内で更新される左辺式に対してはループの次
の周期まで再生情報を引き継がないようにすることで、
ループの影響を受けないようにすることができる。ルー
プ内で書き換えられる左辺式の一覧については構文解析
段階(図2の0205)にて取得できるので、それを利
用する。Next, FIG. 17 to FIG. 19 show the code generation procedure of the repetitive processing (loop). In the repetitive processing, the reproduction information is different because the processing at the first execution of the loop and the processing at the second and subsequent times reach the processing in the loop through different routes. Two
What has different information at the time of the loop of the first time is the information about the left-side expression that is assigned in the loop. Therefore, by not allowing the playback information to be inherited until the next cycle of the loop for the left-hand side expression that is updated in the loop,
You can avoid being affected by loops. The list of left-side expressions rewritten in the loop can be acquired at the syntax analysis stage (0205 in FIG. 2), and is used.
【0085】また同様に、ループではログに積まれるデ
ータの量をあらかじめ計算することができないため、ロ
グを参照するときの位置も計算できなくなるという問題
が生じる。これもループの周期を越えてログを参照する
ことが無いようにすることで問題を解決することができ
る。Similarly, in the loop, since the amount of data to be accumulated in the log cannot be calculated in advance, there arises a problem that the position when referring to the log cannot be calculated. This can also solve the problem by making sure that the log is not referenced beyond the cycle of the loop.
【0086】図17に、これらの調整を行う処理の手順
を示す。まず、ループが始まる前の位置で、ループ内で
更新される全ての左辺式に対して再生式を空に書き換え
る(S1702,S1703,S1704,S170
5)。これによって、ループが開始される前の再生式の
情報と、ループの前の周期で書き換えられたと思われる
左辺式に関する情報を使用しなくなるので、再生情報が
食い違うという問題点を回避することができる。次に、
再生情報テーブルの全ての要素に対して、参照式に_P
EEK式が含まれているものを空に書き換える(S17
06,S1707,S1708)。これによって、ログ
の位置を使用して参照する部分が無くなるので、ログの
位置計算ができなくなるという問題を回避することがで
きる。最後に、ログの位置に関する情報が失われたので
ログの生成個数カウンタもゼロに戻しておく(S170
9)。FIG. 17 shows the procedure of processing for making these adjustments. First, at the position before the loop starts, the reproduction expressions are rewritten to empty for all the left-side expressions updated in the loop (S1702, S1703, S1704, S170).
5). As a result, the information about the replay expression before the loop is started and the information about the left-hand side expression that seems to have been rewritten in the cycle before the loop are not used, so that the problem that the replay information conflicts can be avoided. . next,
_P is used as a reference expression for all elements in the playback information table.
The one that includes the EEK expression is rewritten to be empty (S17).
06, S1707, S1708). As a result, since there is no portion to be referred using the log position, it is possible to avoid the problem that the log position cannot be calculated. Finally, since the information regarding the log position is lost, the log generation number counter is also reset to zero (S170).
9).
【0087】これらの問題は、ループを実行した後のプ
ログラムに対しても同様に発生するため、ループが終わ
った直後の位置で同様な再生情報の書き換え処理を行
う。Since these problems similarly occur in the program after the loop is executed, the same reproduction information rewriting process is performed at the position immediately after the loop ends.
【0088】次に、ループの実行回数をどうやって再現
するかという問題に対して説明する。これには2つの解
決方法がある。一つは、ループした回数を数えて記録す
る方法で、もう一つは、ループを継続したのか、終了し
たのかを示すフラグを、ループを実行するたびに残す方
法である。ループ回数を数える方式は、ログの使用量が
少なくなるという利点があるが、無限にループするよう
な処理に対しては、カウンタがオーバー・フローすると
いう問題があるため使用できない。そのため、ループ回
数がカウンタで数えられることが明らかな処理に対して
はカウンタによる方法を適用し、無限ループまたはルー
プ回数がカウンタの範囲に収まる保証がないようなルー
プに対しては、実行するたびにフラグを残す方法を適用
する。また、ループ回数が固定であるような処理に対し
ては、ループ・インデックスを逆の順序で生成するよう
なループ制御処理を生成することによって、ログを全く
使用せずに逆向きの処理をすることが可能であるため、
それらについては可逆パターン毎に用意した順方向プロ
グラムと逆方法プログラム用のループ制御処理を生成す
ることで対応する。Next, the problem of how to reproduce the loop execution count will be described. There are two solutions to this. One is a method of counting the number of times of looping and recording, and the other is a method of leaving a flag indicating whether the loop is continued or ended each time the loop is executed. The method of counting the number of loops has an advantage that the amount of logs used is small, but it cannot be used for a process that loops endlessly because the counter overflows. Therefore, the method by the counter is applied to the processing in which it is clear that the number of loops can be counted by the counter. Apply the method to leave the flag on. For processing with a fixed number of loops, a loop control processing that generates loop indexes in the reverse order is generated, so that the processing is performed in the reverse direction without using any log. Because it is possible
These are dealt with by generating loop control processing for the forward program and the reverse method program prepared for each reversible pattern.
【0089】図18に、ループ・カウンタを使用する場
合のコード生成手順を示す。まず、ループの中で書き換
える全ての左辺値に関して、再生情報が問題を起こさな
いようにするための調整手続き(図17の手続き)を呼
び出す(S1802)。次に、ループが可逆パターンに
一致するかを判定する(S1803)。可逆パターンに
一致する場合はパターンに基づくコードを順方向プログ
ラムと逆方向プログラムのそれぞれに対して生成する
(S1805)。可逆パターンに一致しないようなルー
プの場合は、ループ・カウンタ用のローカル変数を追加
し(S1806)、順方向プログラム側にはループの回
数を数えるようなコードを生成し(S1807)、ルー
プ終了後にそのカウンタを保存する処理を生成する(S
1809)。逆に、逆方向プログラム側では、ログに保
存されたカウンタを取り出す処理と、その値の数だけル
ープを繰り返すループ制御コードを生成する(S180
7)。最後に、ループによって書き換えられた左辺式に
関する再生情報を調整するために調整手続き(図17の
手続き)を呼び出して、再生情報テーブルを整理して終
了する(S1810)。FIG. 18 shows a code generation procedure when the loop counter is used. First, an adjustment procedure (procedure of FIG. 17) for preventing reproduction information from causing a problem is called for all the left-side values to be rewritten in the loop (S1802). Next, it is determined whether the loop matches the reversible pattern (S1803). If it matches the reversible pattern, a code based on the pattern is generated for each of the forward program and the backward program (S1805). In the case of a loop that does not match the reversible pattern, a local variable for the loop counter is added (S1806), a code for counting the number of loops is generated on the forward program side (S1807), and after the loop ends. Generate a process to save the counter (S
1809). On the other hand, on the backward program side, a loop control code for retrieving the counter stored in the log and repeating the loop by the number of the values is generated (S180).
7). Finally, an adjustment procedure (procedure in FIG. 17) is called to adjust the reproduction information relating to the left-hand side expression rewritten by the loop, and the reproduction information table is sorted and ended (S1810).
【0090】次に、図19にループを継続したかどうか
のフラグをログに残す方法を適用した場合のコード生成
手順を示す。この手順は、ループ・カウンタを使用する
コード生成手順とほぼ同じであるため、異なった点のみ
を示す。まず、順方向プログラムのループの前に、逆方
向プログラムのループを停止するためのフラグ(ゼロ)
をログに残す処理が生成される(S1906)。また、
ループの中で行われる処理を生成(S1907)したあ
と、その最後にループが実行されたことを表すフラグ
(1)をログに残す処理が生成される(S1908)。
これによって、順方向プログラムの実行時には、まず最
初にループを停止するフラグが生成され、つぎにループ
を実行した数だけ、ループ実行を示すフラグが生成され
ることになる。逆方向プログラムではこれを読み取っ
て、ループするかどうかを判定するループ制御処理を生
成する(S1906)。Next, FIG. 19 shows a code generation procedure in the case where the method of leaving a flag indicating whether or not the loop is continued in the log is applied. This procedure is similar to the code generation procedure using a loop counter, so only the differences are shown. First, before the forward program loop, a flag (zero) to stop the backward program loop
Is generated in the log (S1906). Also,
After the processing performed in the loop is generated (S1907), the processing of leaving the flag (1) indicating that the loop has been executed in the log is generated at the end (S1908).
As a result, when the forward program is executed, first, the flag for stopping the loop is generated, and then, the number of flags indicating the loop execution is generated by the number of times the loop is executed. The backward program reads this and generates loop control processing for determining whether to loop (S1906).
【0091】次に、関数定義の本体、条件分岐の実行部
分、くり返し処理の実行部分に現れるプログラム列をコ
ード生成する手順を図20に示す。プログラム列は、代
入文や関数呼び出しや条件分岐などのプログラムを構成
する単位が単純に並んだものである。順方向プログラム
のコード生成では、これらのプログラムを1単位分コー
ド生成すること(S2008)を続けて、プログラム列
の最後に達するまで繰り返せば良い(S2002,S2
003,S2004)。Next, FIG. 20 shows a procedure for code generation of a program string appearing in the main body of the function definition, the conditional branch execution part, and the repeat process execution part. The program sequence is a simple arrangement of units that make up a program such as assignment statements, function calls, and conditional branches. In the code generation of the forward direction program, these programs may be continuously generated for one unit (S2008) and repeated until the end of the program sequence is reached (S2002, S2).
003, S2004).
【0092】逆方向プログラムは、順方向プログラム
と、逆の順序で実行していかなければならない。例えば
順方向プログラムで_F_func1()、_F_fu
nc2()、_F_func3()の順で関数呼び出し
が行なわれる場合は、逆プログラム側では_B_fun
c3()、_B_func2()、_B_func
1()の順序で関数を呼び出さなければならない。その
ため逆方向プログラム側ではプログラムを1単位分コー
ド生成するたびに、逆の順序になるようにコードを並べ
る(S2004)。The backward program must be executed in the reverse order of the forward program. For example, in a forward program, _F_func1 (), _F_fu
When function calls are performed in the order of nc2 () and _F_func3 (), _B_fun is set on the reverse program side.
c3 (), _B_func2 (), _B_func
The functions must be called in the order of 1 (). Therefore, every time the backward program side generates a code for one unit of the program, the codes are arranged in the reverse order (S2004).
【0093】またこの時、順方向プログラムと、逆方向
プログラムの対応関係を表す情報も生成する(S200
5)。これは障害解析手段(デバッガ)が順方向プログ
ラムの停止した個所が、逆方向プログラムの何処にあた
るのかを求めるのに使用する。生成される対応関係テー
ブルのデータ構造を図28に示す。このテーブル(28
01)では、ユーザーの便利性を高めるためプログラム
上の位置をソースコードの行で管理する。そのため、順
方向プログラムと逆方向プログラムに対して、それぞれ
がソースコードのどの行に相当するのかの情報(280
2)と、どのアドレスに配置されたのかを示す情報(2
803,2804)が生成される。At this time, information indicating the correspondence between the forward program and the backward program is also generated (S200).
5). This is used by the failure analysis means (debugger) to determine where in the backward program the stopped portion of the forward program is. The data structure of the generated correspondence table is shown in FIG. This table (28
In 01), the position on the program is managed by the line of the source code in order to improve the convenience for the user. Therefore, for the forward program and the backward program, information on which line of the source code each corresponds (280
2) and information (2
803, 2804) is generated.
【0094】次に、プログラム全体のコード生成手順を
図21に示す。プログラム全体は手続き(関数定義)の
並びで構成されるため、プログラム列の場合と異なり、
生成されるコードの並び順と実行順序は無関係である。
そのため、順方向プログラム側でも逆方向プログラム側
でも同じように、全ての関数定義を順番にコード生成し
ていくだけで良い(S2102,S2103)。Next, FIG. 21 shows the code generation procedure of the entire program. Since the entire program consists of a sequence of procedures (function definitions), unlike the case of the program sequence,
The order of the generated code and the order of execution are irrelevant.
Therefore, it is sufficient to generate code for all function definitions in order in the same way on both the forward program side and the backward program side (S2102, S2103).
【0095】次に、これまでのコード生成手順で順方向
と逆方向のそれぞれのプログラムに埋め込まれてきたロ
グ処理の内容について説明する。図22に_SAVE処
理、図23に_RESTORE処理、図24に_PEE
K処理の処理内容を示す。これらの処理手続きはログ領
域へのデータの保存と取り出しを行なうために使用す
る。Next, the contents of the log processing embedded in the forward and backward programs in the code generation procedure up to this point will be described. FIG. 22 shows _SAVE processing, FIG. 23 shows _RESTORE processing, and FIG. 24 shows _PEE.
The processing content of the K processing is shown. These processing procedures are used to save and retrieve data in the log area.
【0096】図22に示す_SAVE処理では、ログに
保存すべきデータが、メモリ上のどこにあるのかを示す
アドレスと、そのデータのサイズを受け取り(S220
1)、指定された分だけデータをログ領域にコピー(S
2202)したあと、ログの先頭を指すポインタを更新
する(S2203)。もしこの時、ログ領域をすべて使
い切ってしまった場合は、何らかの処置が必要であるた
め、デバッガに対してそれを通知する(S2204,S
2205)。In the _SAVE processing shown in FIG. 22, the address indicating where the data to be saved in the log is in the memory and the size of the data are received (S220).
1) Copy the specified amount of data to the log area (S
2202), the pointer pointing to the beginning of the log is updated (S2203). At this time, if the log area is completely used up, some kind of action is required and the debugger is notified of it (S2204, S).
2205).
【0097】図23に示す_RESTORE処理は、_
SAVE処理と全く逆の手順でログ領域からデータを取
り出す。まず、取り出したデータをどこに格納すべきか
を示すアドレスと、データのサイズを受け取り(S23
01)、ログ領域にデータが全く無い場合はデバッガに
対してそれを通知する(S2302,S2303)。次
にデータ・サイズの分だけログの先頭を指すポインタを
戻し(S2304)、指定されたデータ・サイズの分だ
け、データをコピー先にコピーする(S2305)。The _RESTORE processing shown in FIG.
Data is taken out from the log area by the procedure completely opposite to the SAVE processing. First, the address indicating where the fetched data should be stored and the size of the data are received (S23
01), if there is no data in the log area, it is notified to the debugger (S2302, S2303). Next, a pointer pointing to the beginning of the log is returned by the amount corresponding to the data size (S2304), and the data corresponding to the designated data size is copied to the copy destination (S2305).
【0098】図24に示す_PEEK処理は、ログ領域
そのものは更新せず、ログの先頭から指定されたサイズ
だけずれた位置からデータをコピーする。まずコピー先
アドレスと、データのサイズ、および、ログの先頭から
のオフセットのサイズを受け取る(S2401)。つぎ
に、指定されたオフセットの位置から、指定されたデー
タ・サイズの分だけコピー先にデータをコピーする(S
2403)。In the _PEEK process shown in FIG. 24, the log area itself is not updated, but the data is copied from a position shifted from the beginning of the log by the designated size. First, the copy destination address, the size of the data, and the size of the offset from the beginning of the log are received (S2401). Next, data is copied from the position of the designated offset to the copy destination by the designated data size (S
2403).
【0099】次に_INVALIDATE処理について
図25に示す。_INVALIDATE処理は、逆プロ
グラムの実行によって、ローカル変数の状態が最初の代
入が行なわれる前の状態に戻ったことをデバッガに通知
するために使用される。そのため、_INVALIDA
TE処理は、デバッガへの通知処理のみで構成される
(S2502)。このような処理が必要になるのは、ロ
ーカル変数では最初の代入が行なわれる前のメモリの状
態が不定であるためである。デバッガは_INVALI
DATEであると指定されたメモリ領域の内容を表示す
るように指示された場合は、それが不定であることを表
示する。Next, FIG. 25 shows the _INVALIDATE processing. The _INVALIDATE processing is used to notify the debugger that the state of the local variable has returned to the state before the first assignment by the execution of the inverse program. Therefore, _INVALIDA
The TE process is composed only of a notification process to the debugger (S2502). Such processing is necessary because the state of the memory before the first substitution is performed is undefined for the local variable. Debugger is _INVALI
When instructed to display the contents of the memory area designated as DATE, it is displayed that it is indefinite.
【0100】次に、割り込みハンドラの先頭と最後に挿
入される_INTERRUPT_START処理と、_
INTERRUPT_END処理を、図26と図27に
示す。これらの処理は割り込みが、いつ、どこで発生し
たのかを記録すために使用される。データを記録する領
域は通常のログとは異なり、割り込みログのみを記録す
るための専用の領域に保存される。これは割り込みがい
つ発生するかが不定であるため、通常のログ情報と、割
り込みを示すログ情報を区別することが困難であるため
である。Next, _INTERRUPT_START processing inserted at the beginning and end of the interrupt handler and _
The INTERRUPT_END process is shown in FIGS. 26 and 27. These processes are used to record when and where the interrupt occurred. The area for recording data is different from the normal log, and is saved in a dedicated area for recording only the interrupt log. This is because it is difficult to distinguish the normal log information from the log information indicating the interrupt because it is uncertain when the interrupt will occur.
【0101】割り込みログ領域へのデータの書き込みと
取り出しの手順は、割り込みログ領域を対象とする点以
外は、_SAVE処理と_RESTORE処理と同じ手
順を使用する。The procedure for writing and retrieving data in the interrupt log area uses the same procedure as the _SAVE processing and _RESTORE processing except that the interrupt log area is targeted.
【0102】図26に示す_INTERRUPT_ST
ART処理は、順方向プログラム側の割り込みハンドラ
の先頭で呼び出される処理で、割り込みが発生したアド
レスをログに保存する(S2602)。また、図27に
示す_INTERRUPT_END処理は、順方向プロ
グラム側の割り込みハンドラの最後で呼び出される処理
で、割り込みハンドラがいつ終了したのかを記録する
(S2702)。これにはログ領域の先頭を指すポイン
タの情報を使用する。このポインタは関数の呼び出し
や、ループなど、一つのアドレスを何度も実行するうな
場合に、どの実行時に割り込みが起きたのかを特定する
のに使用する。逆方向プログラムの実行では、この情報
を基にデバッガが割り込みの発生を模擬することで割り
込み処理を逆方向に辿って溯ることが可能となる。_INTERRUPT_ST shown in FIG.
The ART process is a process called at the beginning of the interrupt handler on the forward program side, and saves the address at which the interrupt occurred in the log (S2602). The _INTERRUPT_END process shown in FIG. 27 is a process called at the end of the interrupt handler on the forward program side, and records when the interrupt handler has finished (S2702). For this, the information of the pointer that points to the beginning of the log area is used. This pointer is used to specify the execution time of the interrupt when a single address is executed many times, such as when calling a function or looping. When executing the backward program, the debugger can trace the interrupt process in the reverse direction by simulating the occurrence of the interrupt based on this information.
【0103】次に、障害解析手段(デバッガ)の処理手
順について説明する。障害解析手段は解析対象のデータ
の表示、書き換え、プログラムのロード、ブレークポイ
ントの設定と実行など、多様な機能を持つのが普通であ
るため、この発明の中心的課題である逆方向実行に関連
した部分のみ説明する。Next, the processing procedure of the failure analysis means (debugger) will be described. Since the failure analysis means usually has various functions such as displaying and rewriting data to be analyzed, loading a program, and setting and executing breakpoints, it is related to the backward execution, which is the central issue of the present invention. Only the part that has been done will be explained.
【0104】図29に逆方向実行時の処理手順を示す。
まず最初に、逆方向プログラムのどこから実行を始める
のかを決定するため、順方向プログラムが停止したアド
レスを取得し(S2902)、次にそのアドレスを対応
関係テーブル(図28)を用いて逆方向プログラム側の
アドレスに変換する(S2903)。FIG. 29 shows a processing procedure at the time of backward execution.
First, in order to determine where to start execution in the reverse direction program, the address at which the forward direction program stopped is acquired (S2902), and then that address is used for the reverse direction program using the correspondence table (FIG. 28). The address is converted to the side address (S2903).
【0105】次に、ユーザーに対して、ソースコードの
どの位置まで逆方向実行をするのかを指示してもらう
(S2906)。次に、ユーザーが指示したソースコー
ド上の位置を、対応関係テーブルを用いて逆方向プログ
ラム側のアドレスに変換し(S2908)、そのアドレ
スに対してブレーク・ポイントを設定する(S290
9)。次に、逆方向プログラムの実行を行なって(S2
910)、そのブレーク・ポイントの位置まで到達した
ら逆実行を終了して(S2911)、ユーザーからの次
の指示を待つ(S2906)。もしユーザーが終了を指
示した場合は逆方向実行を終了する(S2907,S2
912)。Then, the user is instructed as to which position in the source code the backward execution should be performed (S2906). Next, the position on the source code designated by the user is converted into an address on the backward program side using the correspondence table (S2908), and a break point is set for that address (S290).
9). Next, the backward program is executed (S2
910), when the position of the break point is reached, the reverse execution is ended (S2911), and the next instruction from the user is waited (S2906). If the user gives an instruction to end, the backward execution is ended (S2907, S2).
912).
【0106】ただし、このときデバッガは割り込みの発
生も模擬する必要がある。そのため逆方向プログラムの
実行を開始する前に割り込みログの内容を読み込み(S
2904)、全ての割り込み発生アドレスに対してブレ
ーク・ポイントを設定する(S2905)。これによっ
て割り込み発生アドレスを通過するたびに逆方向実行が
中断するため、割り込みが発生した時点まで溯ったかど
うかをログの先頭を指すポインタの値を比較して判定し
(S2913)、割り込み発生時点に到達したら、逆方
向プログラム側の割り込みハンドラを呼び出す処理を行
なう(S2914)。However, at this time, the debugger must also simulate the occurrence of an interrupt. Therefore, read the contents of the interrupt log before starting the execution of the backward program (S
2904), break points are set for all interrupt generation addresses (S2905). As a result, the backward execution is interrupted each time the interrupt generation address is passed, so it is determined whether the interrupt has occurred until the time when the interrupt occurred by comparing the value of the pointer that points to the beginning of the log (S2913). When it arrives, processing for calling the interrupt handler on the backward program side is performed (S2914).
【0107】上述したように、本実施の形態では、プロ
グラムの障害解析において、プログラムを逆順に実行し
て行くことによってプログラムの過去の状態を再現する
ことができるため、プログラムが障害に至るまでの全て
の過程を調べることが出来、プログラムの障害解析が容
易になるという効果が得られる。As described above, in the present embodiment, in the failure analysis of the program, the past state of the program can be reproduced by executing the program in the reverse order. All processes can be investigated, and the effect of facilitating program failure analysis is obtained.
【0108】また、ログ情報として、逆命令、アドレ
ス、サイズなどの情報がログに記録される従来の逆命令
ログ法に対して、本実施の形態では、逆方向プログラム
を実行することでこれらの情報が得られるため、ログに
記録する必要が無く、ログに必要なメモリ量が削減され
るため、同一メモリ量で逆方向実行が可能な範囲が拡大
されるという効果が得られる。Further, in contrast to the conventional reverse instruction log method in which information such as reverse instruction, address, size, etc. is recorded as log information in the log, in the present embodiment, these are executed by executing a backward program. Since the information is obtained, it is not necessary to record it in the log, and the amount of memory required for the log is reduced, so that the range in which the backward execution is possible with the same amount of memory is expanded.
【0109】さらに、逆方向プログラムを最適化するこ
とが可能であるため、逆命令ログ法と比較して高速に実
行できるという効果が得られる。Further, since the backward program can be optimized, there is an effect that it can be executed at a higher speed than the backward instruction log method.
【0110】[0110]
【発明の効果】以上のように、この発明によれば、命令
の種類の情報と、命令が操作するメモリのアドレス、お
よびデータ・サイズの情報を、逆方向プログラムの形で
ログから分離することで、ログの記録に必要なメモリの
量を削減し、同一メモリ量で逆方向実行が可能な範囲を
拡大することができるソフトウエア障害解析方法及び装
置を提供することができる。As described above, according to the present invention, the instruction type information, the memory address operated by the instruction, and the data size information are separated from the log in the form of a backward program. Thus, it is possible to provide a software failure analysis method and apparatus capable of reducing the amount of memory required for recording a log and expanding the range in which backward execution is possible with the same memory amount.
【図1】 この発明の実施の形態に係る障害解析時のハ
ードウェア構成とメモリ内部のソフトウェア構成を示す
図である。FIG. 1 is a diagram showing a hardware configuration at the time of failure analysis and a software configuration inside a memory according to an embodiment of the present invention.
【図2】 コンパイルの処理フロー図である。FIG. 2 is a processing flow chart of compilation.
【図3】 再生情報テーブルのデータ構造を示す図であ
る。FIG. 3 is a diagram showing a data structure of a reproduction information table.
【図4】 代入処理のコード生成手順を示すフローチャ
ートである。FIG. 4 is a flowchart showing a code generation procedure of substitution processing.
【図5】 再生可能性の判定手順を示すフローチャート
である。FIG. 5 is a flowchart showing a procedure of determining the reproducibility.
【図6】 参照可能性の判定手順を示すフローチャート
である。FIG. 6 is a flowchart showing a reference possibility determination procedure.
【図7】 再生コードの生成手順を示すフローチャート
である。FIG. 7 is a flowchart showing a reproduction code generation procedure.
【図8】 参照コードの生成手順を示すフローチャート
である。FIG. 8 is a flowchart showing a procedure for generating a reference code.
【図9】 自己破壊代入の回避処理生成手順を示すフロ
ーチャートである。FIG. 9 is a flowchart showing a self-destructive substitution avoidance process generation procedure.
【図10】 式のコード生成手順を示すフローチャート
である。FIG. 10 is a flowchart showing a code generation procedure of an expression.
【図11】 関数呼び出しのコード生成手順を示すフロ
ーチャートである。FIG. 11 is a flowchart showing a code generation procedure for calling a function.
【図12】 関数定義のコード生成手順を示すフローチ
ャートである。FIG. 12 is a flowchart showing a procedure for generating a code for function definition.
【図13】 条件分岐のコード生成手順を示すフローチ
ャートである。FIG. 13 is a flowchart showing a code generation procedure for conditional branching.
【図14】 無条件分岐のコード生成手順を示すフロー
チャートである。FIG. 14 is a flowchart showing a code generation procedure for an unconditional branch.
【図15】 ラベルのコード生成手順を示すフローチャ
ートである。FIG. 15 is a flowchart showing a label code generation procedure.
【図16】 再生情報テーブルのマージ手順を示すフロ
ーチャートである。FIG. 16 is a flowchart showing a procedure for merging reproduction information tables.
【図17】 繰り返し処理用の再生情報テーブル調整手
順を示すフローチャートである。FIG. 17 is a flowchart showing a reproduction information table adjustment procedure for repetitive processing.
【図18】 繰り返し処理のコード生成手順(ループ・
カウンタを使用する場合)を示すフローチャートであ
る。FIG. 18 is a code generation procedure for iteration processing (loop /
It is a flowchart which shows (when using a counter).
【図19】 繰り返し処理のコード生成手順(ループ・
ログを使用する場合)を示すフローチャートである。FIG. 19 shows a code generation procedure for iterative processing (loop
It is a flowchart which shows (when a log is used).
【図20】 プログラム列のコード生成手順を示すフロ
ーチャートである。FIG. 20 is a flowchart showing a code generation procedure for a program sequence.
【図21】 プログラム全体のコード生成手順を示すフ
ローチャートである。FIG. 21 is a flowchart showing the code generation procedure of the entire program.
【図22】 _SAVE処理の処理内容を示すフローチ
ャートである。FIG. 22 is a flowchart showing the processing contents of _SAVE processing.
【図23】 _RESTORE処理の処理内容を示すフ
ローチャートである。FIG. 23 is a flowchart showing the processing contents of _RESTORE processing.
【図24】 _PEEK処理の処理内容を示すフローチ
ャートである。FIG. 24 is a flowchart showing the processing contents of _PEEK processing.
【図25】 _INVALIDATE処理の処理内容を
示すフローチャートである。FIG. 25 is a flowchart showing the processing contents of _INVALIDATE processing.
【図26】 _INTERRUPT_START処理の
処理手順を示すフローチャートである。FIG. 26 is a flowchart illustrating a processing procedure of _INTERRUPT_START processing.
【図27】 _INTERRUPT_END処理の処理
手順を示すフローチャートである。FIG. 27 is a flowchart illustrating a processing procedure of _INTERRUPT_END processing.
【図28】 対応関係テーブルのデータ構造を示す図で
ある。FIG. 28 is a diagram showing a data structure of a correspondence table.
【図29】 障害解析手段(デバッガ)の処理手順を示
すフローチャートである。FIG. 29 is a flowchart showing the processing procedure of the failure analysis means (debugger).
0101 計算機全体、0102 中央処理装置(プロ
セッサ)、0103メモリ、0104 順方向プログラ
ム、0105 逆方向プログラム、0106障害解析手
段(デバッガ)、0107 データ領域、0108 ロ
グ領域、0109 割り込みログ領域、0110 制御
端末、0201 ソース・プログラム、0202 コン
パイラ全体、0203 ソース読み込み処理、0204
字句解析処理、0205 構文解析処理、0206
構文木最適化処理、0207順方向プログラムのコード
生成処理、0208 逆方向プログラムのコード生成処
理、0209 コード最適化処理、0210 コード出
力処理、0211対応関係テーブル出力処理、0212
コンパイル結果のファイル(実行プログラム)、02
13 順方向プログラム、0214 逆方向プログラ
ム、0215対応関係テーブル、2801 対応関係テ
ーブル、2802 ソース・プログラムの行の情報、2
803 順方向プログラムのアドレス、2804 逆方
向プログラムのアドレス。0101 central processing unit (processor), 0103 memory, 0104 forward program, 0105 backward program, 0106 failure analysis means (debugger), 0107 data area, 0108 log area, 0109 interrupt log area, 0110 control terminal, 0201 source program, 0202 whole compiler, 0203 source read processing, 0204
Lexical analysis processing, 0205 Syntax analysis processing, 0206
Syntax tree optimization processing, 0207 forward program code generation processing, 0208 backward program code generation processing, 0209 code optimization processing, 0210 code output processing, 0211 correspondence relation table output processing, 0212
Compile result file (execution program), 02
13 forward program, 0214 reverse program, 0215 correspondence table, 2801 correspondence table, 2802 source program row information, 2
803 Forward program address, 2804 Reverse program address.
Claims (2)
(コンパイル)時に、翻訳結果へのログ生成処理の埋め
込みと逆方向プログラムの生成を行い、 プログラムの実行時に生成されたログ情報を入力として
逆方向プログラムを実行することでプログラムを逆向き
に実行しプログラムの過去の状態を復元することを特徴
とするソフトウエア障害解析方法。1. When a source program (source code) is translated (compiled), a log generation process is embedded in a translation result and a backward direction program is generated, and the log information generated at the time of executing the program is used as an input in the backward direction. A software failure analysis method characterized by executing a program in the reverse direction to restore the past state of the program.
(コンパイル)時に、翻訳結果へのログ生成処理の埋め
込みと逆方向プログラムの生成を行うコンパイラと、 プログラムの実行時に生成されたログ情報を入力として
逆方向プログラムを実行することでプログラムを逆向き
に実行しプログラムの過去の状態を復元する障害解析手
段(デバッガ)とを備えたことを特徴とするソフトウエ
ア障害解析装置。2. A compiler that embeds a log generation process in a translation result and generates a backward program when a source program (source code) is translated (compiled), and a log information generated when the program is executed as input. A software failure analysis apparatus comprising: a failure analysis means (debugger) for executing a backward direction program to reversely execute the program and restore the past state of the program.
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2001314183A JP4107470B2 (en) | 2001-10-11 | 2001-10-11 | Software failure analysis method and apparatus |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2001314183A JP4107470B2 (en) | 2001-10-11 | 2001-10-11 | Software failure analysis method and apparatus |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2003122595A true JP2003122595A (en) | 2003-04-25 |
JP4107470B2 JP4107470B2 (en) | 2008-06-25 |
Family
ID=19132539
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2001314183A Expired - Fee Related JP4107470B2 (en) | 2001-10-11 | 2001-10-11 | Software failure analysis method and apparatus |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP4107470B2 (en) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2016173799A (en) * | 2015-03-18 | 2016-09-29 | 日本電気株式会社 | Debug support apparatus and debug support method |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0250228A (en) * | 1988-08-11 | 1990-02-20 | Fujitsu Ltd | Debug processor |
JPH04342038A (en) * | 1991-05-20 | 1992-11-27 | Nec Corp | Analyzing method for program abnormality |
JPH08320813A (en) * | 1995-05-26 | 1996-12-03 | Nec Corp | Program simulator device and program debugging method |
JPH096647A (en) * | 1995-06-21 | 1997-01-10 | Oki Electric Ind Co Ltd | Reverse execution debugging system |
JPH10222397A (en) * | 1997-02-04 | 1998-08-21 | Toshiba Corp | Simulation device, simulation method, and machine-readable recording medium recorded with simulation program reading |
JP2000250779A (en) * | 1999-02-25 | 2000-09-14 | Toshiba Corp | Programmable controller |
-
2001
- 2001-10-11 JP JP2001314183A patent/JP4107470B2/en not_active Expired - Fee Related
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0250228A (en) * | 1988-08-11 | 1990-02-20 | Fujitsu Ltd | Debug processor |
JPH04342038A (en) * | 1991-05-20 | 1992-11-27 | Nec Corp | Analyzing method for program abnormality |
JPH08320813A (en) * | 1995-05-26 | 1996-12-03 | Nec Corp | Program simulator device and program debugging method |
JPH096647A (en) * | 1995-06-21 | 1997-01-10 | Oki Electric Ind Co Ltd | Reverse execution debugging system |
JPH10222397A (en) * | 1997-02-04 | 1998-08-21 | Toshiba Corp | Simulation device, simulation method, and machine-readable recording medium recorded with simulation program reading |
JP2000250779A (en) * | 1999-02-25 | 2000-09-14 | Toshiba Corp | Programmable controller |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2016173799A (en) * | 2015-03-18 | 2016-09-29 | 日本電気株式会社 | Debug support apparatus and debug support method |
Also Published As
Publication number | Publication date |
---|---|
JP4107470B2 (en) | 2008-06-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Reps et al. | Speeding up slicing | |
JP4573189B2 (en) | Program code conversion method | |
EP3785124B1 (en) | Memory validity states in time-travel debugging | |
JP5129929B2 (en) | How to instrument code with restrictive calling conventions | |
US6077311A (en) | Method and apparatus for extraction of program region | |
West et al. | Automatic incremental state saving | |
US8448152B2 (en) | High-level language, architecture-independent probe program compiler | |
Wallace et al. | Multiple-view tracing for Haskell: a new Hat | |
US20040117760A1 (en) | Reality-based optimization | |
US20120131559A1 (en) | Automatic Program Partition For Targeted Replay | |
JPH0734178B2 (en) | Effective error reporting for executing conversion code | |
EP3921734B1 (en) | Using historic execution data to visualize tracepoints | |
Biswas et al. | Reverse execution of programs | |
Hoey et al. | Reversible imperative parallel programs and debugging | |
EP3278218A1 (en) | Field specialization systems and methods for improving program performance | |
Eisner et al. | Comparing symbolic and explicit model checking of a software system | |
US7086033B2 (en) | Software debugger having a monitor for monitoring conditional statements within a software program | |
US6691079B1 (en) | Method and system for analyzing test coverage | |
Akgul et al. | Assembly instruction level reverse execution for debugging | |
US5134705A (en) | System and method for concurrency simulation | |
JP4107470B2 (en) | Software failure analysis method and apparatus | |
JP2005338987A (en) | Exception test support program and device | |
Fairley | Ada debugging and testing support environments | |
JPH10320212A (en) | Cache optimizing method | |
JPH02176938A (en) | Machine language instruction optimizing system |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20040428 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20070130 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20070330 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20070612 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20070810 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20071113 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20080109 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20080226 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20080327 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110411 Year of fee payment: 3 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
LAPS | Cancellation because of no payment of annual fees |