(57)【特許請求の範囲】
【請求項１】
異常終了時のメモリダンプに基いて異常終了箇所から処理を逆方向に遡って変数の値を復元する復元命令を、ソースプログラムに基いて生成する、復元命令生成部と、
異常終了時に前記復元命令を実行することで前記変数の値を復元する、変数値算出部と、
前記ソースプログラムを、復元された前記変数の値と共に表示する画面表示部と、
を備え、
前記画面表示部は、更に、前記ソースプログラムを、前記変数の復元の可否と共に表示する、
デバッグ支援装置。
【請求項２】
請求項１に記載のデバッグ支援装置であって、
前記復元命令は、遡る処理が可逆の場合にその処理とは逆の処理を実行することで前記変数の値を復元する逆方向命令を含む、
デバッグ支援装置。
【請求項３】
請求項１又は２に記載のデバッグ支援装置であって、
前記復元命令は、復元対象である前記変数の値を演算した際に用いた演算を再度実行することで前記変数の値を復元する再生命令を含む、
デバッグ支援装置。
【請求項４】
異常終了時のメモリダンプに基いて異常終了箇所から処理を逆方向に遡って変数の値を復元する復元命令を、ソースプログラムに基いて生成するステップと、
異常終了時に前記復元命令を実行することで前記変数の値を復元するステップと、
前記ソースプログラムを、復元された前記変数の値と共に表示するステップと、
を含み、
前記ソースプログラムを、復元された前記変数の値と共に表示するステップでは、更に、前記ソースプログラムを、前記変数の復元の可否と共に表示する、
デバッグ支援方法。
【請求項５】
請求項４に記載のデバッグ支援方法であって、
前記復元命令は、遡る処理が可逆の場合にその処理とは逆の処理を実行することで前記変数の値を復元する逆方向命令を含む、
デバッグ支援方法。
【請求項６】
請求項４又は５に記載のデバッグ支援方法であって、
前記復元命令は、復元対象である前記変数の値を演算した際に用いた演算を再度実行することで前記変数の値を復元する再生命令を含む、
デバッグ支援方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、デバッグ支援装置及びデバッグ支援方法に関する。
【背景技術】
【０００２】
特許文献１及び２は、プログラムが異常終了した際の走行経路を推定するデバッグ支援装置を開示している。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特許第3062266号明細書
【特許文献２】特許第4107470号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ところで、プログラムが異常終了した場合、その原因を推定する方法として、例えば、以下のような方法が知られている。即ち、第１に、異常終了した時点でのメモリの記憶内容を詳しく調べる。第２に、異常終了した時点で自動的に生成されたメモリダンプを取得し、そのメモリダンプの内容を調べる。
【０００５】
また、プログラム内で異常終了が発生しそうな箇所にトレースを埋込み、このトレースによって生成されたトレース情報に基いて、異常終了の原因を推定することも考えられる。しかし、プログラム内にトレースを埋め込むことによって異常終了の原因を推定するようにすると、第１に、そもそもトレースを埋め込んでいない箇所で異常終了が発生した場合はトレース情報を何ら取得することができず、第２に、トレースを埋め込むとシステムの性能低下を招くという問題がある。
【０００６】
一方で、前述のメモリダンプを取得し、そのメモリダンプの内容を調べる方法は、システムの性能低下を招かないので、異常終了の原因を推定するのに広く活用されている。メモリダンプの内容を参照すれば、複数の変数間の関係（ある変数を演算する際に、どの変数が参照されたか、といった関係）を調べながら、複数の変数の値の妥当性を確認したり、プログラムの走行経路を推定することで、どの部分で異常終了が発生したかを推定することができる。
【０００７】
しかしながら、メモリダンプを利用して異常終了の原因を調べる方法は、あくまで手作業によるものであるから、異常終了の原因を特定するのに多大なる時間と労力を要する。
【０００８】
ここで、図２１を参照し、上記特許文献１について詳しく説明する。上記特許文献１では、異常終了時の変数の値に基いて、プログラム中の式（分岐命令における条件式や代入）のうち成立している部分にアンダーラインを付すことで、トレース情報がなくとも利用者がプログラムの走行経路を推定できるようになっている。しかし、この方法では、異常終了時の変数の値に基づいているため、それよりも前に実行された式では、変数の値が異なっている場合もあることから、アンダーラインを付した式が実際には走行経路ではない場合もあり、利用者が誤解する場合がある。
【０００９】
即ち、上記特許文献１では、例えば、図２１のソースプログラムの29行目で異常終了した場合の変数ｂの値が1であった場合、ｂを使用している15行目の条件式が成立している（真である）とみなし、そこにアンダーラインを付している。しかし、異常終了時の変数ｂの値は、19行目のｂ＝ｂ＋１を実行した結果の値に他ならず、19行目を実行した後の変数ｂの値は確かに1であるが、15行目の時点では変数ｂの値は0である。従って、15行目の条件式は実際には成立していない（真ではない）にもかかわらず、アンダーラインが付されることとなる。
【００１０】
また、特許文献２は、通常のプログラムのコンパイルに加え、逆方向プログラムを生成し、異常終了した時点でのメモリダンプを用いて逆方向プログラムを実行している。しかしながら、上記特許文献２の方法では、通常のプログラム実行中は常に、逆方向プログラムを実行するのに必要となるメモリの内容をログとして採取する必要がある。このことは、システムの性能低下を招き、現実的ではない。
【００１１】
本発明の目的は、システムの性能低下を招くことなく、プログラムの異常終了の原因を利用者が判断し易くするための技術を提供することにある。
【課題を解決するための手段】
【００１２】
本願発明の第１の観点によれば、異常終了時のメモリダンプに基いて異常終了箇所から処理を逆方向に遡って変数の値を復元する復元命令を、ソースプログラムに基いて生成する、復元命令生成部と、異常終了時に前記復元命令を実行することで前記変数の値を復元する、変数値算出部と、を備えた、デバッグ支援装置が提供される。
本願発明の第２の観点によれば、異常終了時のメモリダンプに基いて異常終了箇所から処理を逆方向に遡って変数の値を復元する復元命令を、ソースプログラムに基いて生成するステップと、異常終了時に前記復元命令を実行することで前記変数の値を復元するステップと、を含む、デバッグ支援方法が提供される。
【発明の効果】
【００１３】
本発明によれば、システムの性能低下を招くことなく、プログラムの異常終了の原因を利用者が判断し易くすることができる。
【図面の簡単な説明】
【００１４】
【図１】デバッグ支援装置の機能ブロック図である。（第１実施形態）
【図２】デバッグ支援装置の機能ブロック図である。（第２実施形態）
【図３】トークン列の構造を示す図である。（第２実施形態）
【図４】解析木の構造を示す図である。（第２実施形態）
【図５】解析木・プログラム位置対応表情報の構造を示す図である。（第２実施形態）
【図６】変数アドレス対応表の構造を示す図である。（第２実施形態）
【図７】参照関係の構造を示す図である。（第２実施形態）
【図８】再生命令の構造を示す図である。（第２実施形態）
【図９】再生命令に使用する関数の一覧を示す図である。（第２実施形態）
【図１０】逆方向命令の構造を示す図である。（第２実施形態）
【図１１】逆方向命令生成の動作を示すフローチャートである。（第２実施形態）
【図１２】異常終了箇所特定部の動作を示すフローチャートである。（第２実施形態）
【図１３】変数アドレス対応表の構造を示す図である。（第２実施形態）
【図１４】再生確認リストを示す図である。（第２実施形態）
【図１５】変数値算出部の動作を示すフローチャートである。（第２実施形態）
【図１６】逆方向処理部の動作を示すフローチャートである。（第２実施形態）
【図１７】再生処理部の動作を示すフローチャートである。（第２実施形態）
【図１８】条件式判定部の動作を示すフローチャートである。（第２実施形態）
【図１９】参照変数特定部の動作を示すフローチャートである。（第２実施形態）
【図２０】変数値取得部の動作の説明図である。（第２実施形態）
【図２１】特許文献１の説明図である。
【図２２】デバッガの画面表示の一例を示す図である。（第２実施形態）
【図２３】デバッガの画面表示の一例を示す図である。（第２実施形態）
【図２４】画面表示部の動作を示すフローチャートである。（第２実施形態）
【発明を実施するための形態】
【００１５】
（第１実施形態）
図１を参照して、第１実施形態を説明する。
【００１６】
デバッグ支援装置１は、異常終了時のメモリダンプに基いて異常終了箇所から処理を逆方向に遡って変数の値を復元する復元命令をソースプログラムに基いて生成する復元命令生成部２と、異常終了時に復元命令を実行することで変数の値を復元する変数値算出部３と、を備える。以上の構成によれば、異常終了時に、異常終了箇所から処理を逆方向に遡って変数の値を復元できるので、システムの性能低下を招くことなく、プログラムの異常終了の原因を利用者が判断し易くすることができる。
【００１７】
（第２実施形態）
以下、図面を参照して、第２実施形態を説明する。
【００１８】
先ず、第２実施形態の概要を説明する。第２実施形態の目的は、プログラムの処理から可能な限り変数の値を、処理の逆方向に逆方向命令または再生命令を実行することにより復元し、条件分岐を正しく判断し、プログラムの走行経路の推定の確実性を向上させること、及び、プログラムが異常終了する原因となった変数が、どの変数により設定及び導出されているかの情報を画面に表示されるソースプログラム上に利用者が識別できるように表示することで、異常終了の原因調査を効率化する技術を提供することにある。
【００１９】
そこで、第２実施形態では、異常終了時のメモリダンプのみから、異常終了した場所から処理を逆方向に遡り、復元可能な場合にその時点での変数の値を算出及び表示し、また、プログラムの走行経路を表示する。さらには、異常終了の直接の原因となった変数に関係する変数（導出や演算のもとにした変数など）をソース中に識別表示することで、異常終了の原因究明の作業に貢献する。
【００２０】
図２２には、第２実施形態のデバッガの画面表示の一例を示している。異常終了した場所を二重の矢印（⇒）で表示し（この例では29行目）、その関数を呼び出している場場所を矢印（→）で表示し（この例では20行目）、走行した経路の行を下線で表示する。また、異常終了の直接の原因となった変数に関係する変数（導出や演算のもとにした変数や参照している変数）には、ハッチングをつけて表示する。図２２に示すように、デバッガは、変数の値を表示することができる。即ち、デバッガは、19行目で左辺の変数ｂの値（“１”）や、右辺の変数ｂの値（“０”）を表示することができる。
【００２１】
第２実施形態は、変数の値を復元することができない場合があるため、そのことを利用者に示すこともできる。図２３のプログラムソースは、19行目の処理が図２２のプログラムソースと異なる。この場合、15行目での変数ｂの値は復元できないため、bの値を表示すると不確定と表示される。また、変数ｂの値が不確定であるため、15行目のif文の条件式の真偽がわからず、真の処理を通過したかどうかを判断できないため、真であった場合に通過する走行経路には点線下線が付されている。このように、変数ｂの値が不確定の場合は、利用者にそのことがわかるようにしている。
【００２２】
メモリダンプのみから、処理を逆方向に遡り変数の値を復元できるのは、（１）未初期化変数を初期設定する場合、（２）初期化済み変数の内容を上書きする場合、（３）初期化済みメモリを解放する場合、のうちの（１）及び（２）である。
【００２３】
（１）
この場合、未初期化の値に戻すのではなく、未初期化状態に戻ったことをデバッガに通知すればよい。
【００２４】
（２）
（２）のうち、処理を逆方向に遡り変数の値を復元できるのは、（２−１）可逆性演算である場合、及び、（２−２）上書きにより失われるデータを再度計算して再生できる場合、である。
【００２５】
（２−１）
例えば、変数の値を１だけ増やす演算は、可逆性演算である。なぜなら、その演算後の変数の値から１減らす演算を行うことにより、変数の値を演算前の状態に復元することができるからである。
【００２６】
（２−２）
上書きにより失われたデータを計算する時に使用したデータがまだ変更されずに残っている場合、上書きにより失われたデータを再度計算して再生することができる。例えば、A ＝ B ＋ C（変数Aに変数Bと変数Cの和を代入する）という演算に関して言えば、変数Aの値が失われても、変数Bと変数Cの値がまだ残っているならば、変数Bと変数Cの和を再度計算することにより失われたデータを復元することができる。
【００２７】
上記（２−１）に従って、コンパイラは、可逆性演算の場合はデバッガで逆の演算を実行できるように逆方向命令を生成する。
【００２８】
また、上記（２−２）に従って、コンパイラは、可逆性の有無にかかわらず、デバッガで同一命令を再度実行できるように再生命令を生成し、この再生命令を解析木のノードに登録する。
【００２９】
デバッガは、異常終了した処理の場所（アドレス）から、利用者が指定したソースの行まで、通常プログラムが処理される順とは逆に遡り、コンパイラが出力した解析木をたどり、変数値算出部により変数の値を復元する。変数を復元できた場合は、解析木のノードの評価結果に“確定”（復元済み）と復元した変数の値を格納し、復元できない場合は、“不確定”（復元不可）であることを格納する。
【００３０】
処理を逆に遡る際の条件式の判定は、条件式判定部が行う。まず、変数の値を復元し、再生命令に必要な変数が全て復元できている場合は、再生命令を実行する。再生命令の結果により真偽が明らかになると、if文の真偽のどちらの処理を通過したかも判明する。再生命令に必要な変数のうち、1個でも不確定の変数が存在する場合は、条件式の判定結果も不確定となる。
【００３１】
異常終了した箇所を行単位ではなく、その行に書かれている変数、式のレベルで特定するために、コード生成部は、解析木をもとにマシン命令を生成するとともに、ソース行−解析木のアドレス−プログラム位置（該当するソース行をマシン命令にした場合の先頭位置）の対応表（解析木・プログラム位置対応表）を出力する。さらに、解析木のノードに、１行又は複数行のマシン命令から構成される場合があるため、各ノードに対応するプログラム位置を解析木のノードに格納する。
【００３２】
デバッガは、異常終了したアドレス（プログラム位置）から、まずは、解析木・プログラム位置対応表を参照して、ソース行の位置、および、解析木のノードのアドレスを求める。デバッガは、その解析木のノードを基点に配下のノードのアドレスを参照し、異常終了したアドレスと一致するノードを探し、変数、式のレベルで異常終了した場所を特定する。
【００３３】
変数の導出や演算のもとにした変数の参照関係を示すために、コンパイラの参照関係生成部は、解析木を参照し、左辺の変数（被参照変数）と右辺の変数（参照変数）を関連付けて参照関係として出力する。デバッガの参照変数特定部は、ある変数が、どの変数から導出されているかを調べるために、この参照関係から被参照変数を検索し、被参照変数に関連付けられている参照変数を求める。求めた参照変数を今度は被参照変数から検索し、この被参照変数に関連付けられている参照変数を求める。デバッガは、これを繰り返すことにより順次、参照変数を得ていく。
【００３４】
図２に示すように、デバッグ支援装置２００は、ソースプログラム１２０を翻訳しオブジェクトコードであるプログラム１３１を生成するコンパイラ１００と、生成したプログラム１３１による処理の流れやプログラム１３１で使用している変数の値を確認するデバッガ１５０と、を備える。
【００３５】
コンパイラ１００は、ソース読み込み部１０２と、字句解析部１０３と、構文解析部１０４と、意味解析部１０５と、参照関係生成部１０６と、コード生成部１０７と、コード出力部１０８と、制御部１０１と、を有する。
【００３６】
ソース読み込み部１０２は、ソースプログラム１２０を読み込む。
【００３７】
字句解析部１０３は、ソース読み込み部１０２が読み込んだソースプログラム１２０を、プログラミング言語の構成単位である字句に分解し、その字句をリスト化したトークン列情報１２１を生成する。
【００３８】
構文解析部１０４は、トークン列情報１２１をもとに文法の解析を行い、木構造のデータ構造として解析木情報１２２（解析木）を作成する。
【００３９】
意味解析部１０５は、解析木情報１２２をもとに、ソースプログラム１２０に記述されている文や変数の型がプログラミング言語の文法に合致しているかどうかをチェックする。
【００４０】
参照関係生成部１０６は、変数の代入の際に参照している変数は何か、関数呼び出しの際に呼び出された関数へ引数として渡される変数は何か、の関係を示す参照関係情報１２８を生成する。
【００４１】
コード生成部１０７は、解析木情報１２２をもとにオブジェクトコードを生成する。コード生成部１０７は、復元命令生成部１０９と、解析木・プログラム位置対応表生成部１１３と、変数アドレス対応関係生成部１１４と、を有する。
【００４２】
復元命令生成部１０９は、異常終了時のメモリダンプ１７０から処理を遡り、変数の値を復元するための命令（復元命令）及び情報を出力する。
【００４３】
解析木・プログラム位置対応表生成部１１３は、ソースプログラムの行がプログラムのどの位置に配置されたのか、さらに解析木のどのノードに該当するのかの対応関係を示す解析木・プログラム位置対応表情報１２９を出力し、解析木のノードに該当する部分がプログラムのどの位置に配置されたのかを解析木のノードのプログラム位置情報１２６に出力する。
【００４４】
変数アドレス対応関係生成部１１４は、プログラムで使用される変数の型とサイズとアドレスとをもつ変数アドレス対応表情報１３０を出力し、解析木の変数のノードに変数アドレス対応表の該当する番号を変数アドレス対応表番号情報１２７に出力する。
【００４５】
コード出力部１０８は、コード生成部１０７が生成したオブジェクトコードをプログラム１３１として出力する。
【００４６】
制御部１０１は、ソース読み込み部１０２と字句解析部１０３と構文解析部１０４と意味解析部１０５と参照関係生成部１０６とコード生成部１０７とコード出力部１０８を制御する。
【００４７】
復元命令生成部１０９は、逆方向命令生成１１０（逆方向命令生成部）と、再生命令生成１１１（逆方向命令生成部）と、を有する。復元命令は、逆方向命令と再生命令を含む。
【００４８】
逆方向命令生成１１０は、解析木のノードの処理が可逆の場合に、その処理とは逆の処理をそのノードの逆方向命令情報１２３に格納する。
【００４９】
再生命令生成１１１は、解析木のノードと同じ処理をそのノードの再生命令情報１２４に格納する。
【００５０】
復元命令生成部１０９が第２実施形態の特徴的な一つの部分である。通常のコンパイラでは、順方向の命令のみを生成し、プログラムに出力するだけであるのに対し、本第２実施形態のコンパイラでは、順方向の命令をプログラムに出力することに加えて、順方向の命令、逆方向の命令を解析木のノードに出力する。これらの出力情報は、本第２実施形態のデバッガを使用して、異常終了時のメモリダンプから処理を遡り変数の値を復元するために使用される。詳細については後述する。
【００５１】
また、参照関係生成部１０６も本第２実施形態の特徴的な一つの部分である。通常のコンパイラでは参照関係は出力しない。出力した参照関係は、本第２実施形態のデバッガで、直接の原因となった処理が参照している変数をデバッガで表示しているソースプログラム上で利用者が識別できるような印をつけて表示するために使用される。
【００５２】
さらには、解析木・プログラム位置対応表生成部１１３や変数アドレス対応関係生成部１１４も本第２実施形態の特徴的な部分であり、それらが出力する解析木・プログラム位置対応表情報１２９、プログラム位置情報１２６、変数アドレス対応表番号情報１２７は、本第２実施形態のデバッガで、異常終了箇所の処理を特定し、処理を遡るために使用される。
【００５３】
デバッガ１５０は、ソース読み込み部１５２と、コンパイラ出力情報読み込み部１５３と、データアクセス部１５４と、異常終了箇所特定部１６３と、条件式判定部１５５と、変数値算出部１５６と、変数値取得部１６４と、参照変数特定部１５９と、ソースプログラム編集部１６０と、画面表示部１６１と、利用者コマンド入力・解析部１６２と、制御部１５１と、を有する。
【００５４】
ソース読み込み部１５２は、デバッグの対象とするソースプログラム１２０を読み込む。
【００５５】
コンパイラ出力情報読み込み部１５３は、コンパイラ１００が出力したトークン列情報１２１と解析木情報１２２と参照関係情報１２８と解析木・プログラム位置対応表情報１２９と変数アドレス対応表情報１３０とプログラム１３１を読み込む。
【００５６】
データアクセス部１５４は、異常終了時に生成されたメモリダンプ１７０を読み込む。
【００５７】
異常終了箇所特定部１６３は、異常終了した場所を特定する。
【００５８】
条件式判定部１５５は、異常が発生した場所から処理を遡り、条件分岐する処理で、条件式に使用されている変数の値を復元し、条件式の真偽の判定を行う。
【００５９】
変数値算出部１５６は、逆方向処理部１５７と、再生処理部１５８と、を有する。変数値算出部１５６は、復元命令を実行することで、変数の値を復元する。復元命令は、逆方向命令と再生命令を含む。
【００６０】
逆方向処理部１５７は、参照したい変数がある処理の場所で、その変数の値が逆方向命令で復元できるかどうかを判断し、復元できる場合は逆方向命令を実行する。
【００６１】
再生処理部１５８は、逆方向処理部１５７で変数の値を復元できない場合に、その変数の値が再生命令で復元できるかどうかを判断し、復元できる場合は再生命令を実行する。
【００６２】
変数値算出部１５６は、復元した変数の値を解析木に格納する。
【００６３】
データ領域情報１７２は、メモリダンプ１７０からデータ領域部分だけを複写したデータ領域の情報であり、変数値算出部１５６と条件式判定部１５５により、処理を遡りながら変数の値を参照または変更される。
【００６４】
変数値取得部１６４は、変数値算出部１５６により復元された変数の値を解析木から取得する。
【００６５】
参照変数特定部１５９は、参照関係情報１２８をもとに、異常終了の直接の原因となった処理が参照している変数を特定する。
【００６６】
ソースプログラム編集部１６０は、条件式判定部１５５の真偽の判定結果によりどの処理を通過したのか、および、参照変数特定部１５９により特定された変数を、画面に表示されるソースプログラム上に利用者が識別できる方法でソースプログラムの文字の表示属性を編集する。
【００６７】
画面表示部１６１は、ソースプログラム１２０をソースプログラム編集部１６０により指定された表示属性に基いて表示する。画面表示部１６１は、復元された変数の値をソースプログラム１２０と共に表示する。
【００６８】
利用者コマンド入力・解析部１６２は、キーボードやマウス等の入力装置からデバッガ１５０への指示を解析する。
【００６９】
制御部１５１は、ソース読み込み部１５２とコンパイラ出力情報読み込み部１５３とデータアクセス部１５４と異常終了箇所特定部１６３と条件式判定部１５５と変数値算出部１５６と変数値取得部１６４と参照変数特定部１５９とソースプログラム編集部１６０と画面表示部１６１と利用者コマンド入力・解析部１６２とを制御する。
【００７０】
参照関係生成部１０６と復元命令生成部１０９と解析木・プログラム位置対応表生成部１１３は、通常のコンパイラにはない。
【００７１】
また、異常終了箇所特定部１６３と条件式判定部１５５と変数値算出部１５６と逆方向処理部１５７と再生処理部１５８と参照変数特定部１５９は、通常のデバッガにはない。
【００７２】
以下、参照関係生成部１０６、復元命令生成部１０９、解析木・プログラム位置対応表生成部１１３、トークン列情報１２１、解析木情報１２２を詳細に説明する。
【００７３】
図３を参照するとトークン列の構造を示している。字句解析部１０３が出力するトークン列の中には、
（ａ）予約語、数値、識別子等の文法規則を番号としてあらわしたトークンｉｄ
（ｂ）ソースプログラム中の行位置
（ｃ）行中の文字位置
（ｄ）トークンの長さ
（ｅ）トークン
を格納する。このひとかたまりが、リスト化されて連なっている。
【００７４】
図４を参照すると解析木の構造を示している。まず、図４の左上の図を参照すると、例として、“ｂ  ＞  ０”の比較式の解析木を示している。構文を表している解析木に、プログラムの生成、さらには本実施形態の特徴である異常終了時のメモリダンプから、停止した処理から逆に遡って条件の判定や変数の値を復元するための情報を加え持つ解析木のノードは、図４の左下の図に示す構造を持つ。解析木のノードは、
（ａ）構文（構文の種類をあらわす）
（ｂ）トークン列アドレス（このノードに該当するトークン列の部分の先頭のアドレス）
（ｃ）トークン列数
（ｄ）逆方向命令
（ｅ）再生命令
（ｆ）評価結果格納アドレス
（g）プログラムの位置
（h）子ノードの個数
（i）子ノードのアドレス
を格納し、末端が定数や変数の場合には、
（j）型
（k）変数アドレス対応表のNo.
（l）定数の値
を格納する。
【００７５】
図４の右下の図は、“ｂ  ＞  ０”の比較式の解析木の構造を示している。
【００７６】
構文解析部１０４は（ａ）（ｂ）（ｃ）（h）（i）（l）を設定し、復元命令生成部１０９は（ｄ）（ｅ）を設定し、解析木・プログラム位置対応表生成部１１３が（g）を設定し、条件式判定部１５５と変数値算出部１５６とが（ｆ）を設定する。意味解析１０５が（j）を設定し、変数アドレス対応関係生成部１１４が（k）を設定する。
【００７７】
図５を参照すると、解析木・プログラム位置対応表生成部１１３が出力する解析木・プログラム位置対応表情報１２９の構造を示している。解析木・プログラム位置対応表情報１２９には、ソースプログラムの行に対応する解析木のノードのアドレスとプログラムの位置を相対アドレスで示したものの対応を格納する。コード生成部１０７は、解析木を参照し、コードを生成しながら、ソースプログラムの１行毎にその行の最初の解析木のノードのアドレスとプログラム位置を解析木・プログラム位置対応表生成部１１３に渡し、解析木・プログラム位置対応表生成部１１３は、解析木のノードのアドレスとプログラム位置をソースプログラムの行位置とともに、解析木・プログラム位置対応表に出力する。また、コード生成部１０７は、解析木のノード毎に生成したプログラムの位置と解析木のノードのアドレスを解析木・プログラム位置対応表生成部１１３に渡し、解析木・プログラム位置対応表生成部１１３は、その解析木のノードのプログラム位置１２６にプログラム位置を出力する。
【００７８】
これにより、異常終了したプログラムのアドレスから、１行中のどの処理、あるいはどの変数参照で異常が発生したかを詳細に特定することができる。
【００７９】
図６を参照すると、変数アドレス対応関係生成部１１４が出力する変数アドレス対応表１３０の構造を示している。変数アドレス対応表１３０には、変数名、変数の型、変数のサイズ、データ領域内で変数が割り付けられる相対アドレスを格納する。コード生成部１０７は、解析木を参照し、コードを生成しながら、変数のある解析木のノードのアドレスを変数アドレス対応関係生成部１１４に渡し、変数アドレス対応関係生成部１１４は、当該変数のデータ領域内に割り付けるための相対アドレスを算出し、変数名と型とサイズとともに、変数アドレス対応表に出力する。また、変数アドレス対応関係生成部１１４は、受け取った解析木のノードの変数アドレス対応表Ｎｏ．１２７に、変数アドレス対応表のＮｏ．を出力する。
【００８０】
これにより、変数値算出部１５６は、解析木のノードからデータ領域１７２の変数の値を参照することができる。
【００８１】
図７を参照すると、参照関係生成部１０６が出力する参照関係１２８の構造を示している。参照関係１２８には、主に代入式の左辺の変数である被参照変数の情報と主に代入式の右辺の変数である参照変数の情報が格納される。関数の引数として、呼び出された関数に渡される場合は、仮引数が被参照変数、実引数が参照変数である。被参照変数と参照変数の情報はともにソースファイル名、関数名、変数名、ソースプログラム内の行番号、トークン列の該当するトークン列のアドレス、変数名をあらわしているトークン列の数から構成される。図７内のトークン列アドレスは、実際には当該変数のトークン列のアドレスであるが、便宜上、該当するトークンの文字列で示す。参照関係生成部１０６は、解析木を参照し、左辺の変数を被参照変数の情報として出力する。その後、解析木を探索し、右辺の情報を参照変数として出力する。参照変数が複数ある場合、変数名を格納する場所に、複数の変数名を格納する。関数の引数の場合も同様である。
【００８２】
図８を参照すると、再生命令生成１１１で作成される再生命令１２４の構造を示している。再生命令１２４は、解析木のノード内の再生命令へのポインタから指し示す。再生命令は関数（ｘ，ｙ）で表し、関数の種類を表す関数Ｎｏ．とｘパラメータを表す解析木中のｘのノードアドレスとｙパラメータを表す解析木中のｙのノードアドレスから構成される。図９に再生命令に使用する関数の一覧を示す。それぞれの関数のＮｏ．が割り付けられている。例えば、ｘ＋ｙのような加算の場合は、ａｄｄ（ｘ，ｙ）関数で同等な加算を実現する。また、図８を参照すると、例えば、ｂ＝ｂ＋１の再生命令の例を示している。ｂ＋１は加算であるため、図９の関数一覧のａｄｄ（ｘ，ｙ）が同等な関数であり、ａｄｄ（ｂ，１）と表すことができる。再生命令の関数Ｎｏ．には、該当するadd関数のＮｏ．１を格納する。ｘのノードアドレスには、ｂ＋1のｂのノードアドレスを格納する。ｙのノードアドレスには、ｂ＋１の1のノードアドレスを格納する。
【００８３】
図１０を参照すると、逆方向命令生成１１０で作成される逆方向命令１２３の構造を示している。逆方向命令１２３は、解析木のノード内の逆方向命令へのポインタから指し示す。逆方向命令は関数（ｘ，ｙ）で表し、関数の種類を表す関数Ｎｏ．とｘパラメータを表す解析木中のｘのノードアドレスとｙパラメータを表す解析木中のｙのノードアドレスから構成される。逆方向命令に使用する関数の一覧は、再生命令の時と同じであり、図９に示す。例えば、ｂ＝ｂ＋１における逆方向命令は、ｂ＝ｂ−１である。ここで、ｂ−１のｂは、ソースプログラムのｂ＝ｂ＋１の左辺のｂである。ｂ−１は減算であるため、図９の関数一覧のｓｕｂ（ｘ，ｙ）が同等な関数であり、ｓｕｂ（ｂ，１）と表すことができる。逆方向命令の関数Ｎｏ．には、該当するｓｕｂ関数のＮｏ．２を格納する。ｘのノードアドレスには、ｂ＝ｂ＋1の左辺のｂのノードアドレスを格納する。ｙのノードアドレスには、ｂ＋１の1のノードアドレスを格納する。
【００８４】
図１１は、逆方向命令生成１１０の動作を示すフローチャートである。
【００８５】
逆方向命令生成１１０は、当該処理が可逆かどうかを判定する（Ｓ１３０１）。代入式の左辺の変数が右辺にもある場合可逆であると判定する。当該処理の逆の処理に該当する関数を求め、解析木のノード内の逆方向命令の関数No.と関数のパラメータを示す解析木中のノードアドレスを設定し（Ｓ１３０２）、逆方向命令のノードにその関数が使用する変数を設定する（Ｓ１３０３）。可逆でない場合は、逆方向命令にNULL、すなわち、逆方向命令なしを設定する（Ｓ１３０４）
【００８６】
次に、一般的なデバッガに条件式判定部１５５と変数値算出部１５６と逆方向処理部１５７、再生処理部１５８と参照変数特定部１５９とを新たに追加し、異常終了箇所特定部１６３を改良した点が本実施形態の特徴である。これらの処理の流れの実施例について説明する。
【００８７】
図１２は、異常終了箇所特定部１６３の動作を示すフローチャートである。
【００８８】
解析木・プログラム位置対応表を参照し、異常終了したアドレスから、ソースプログラムの行と対応する解析木のノードのアドレスを取得する（Ｓ２００１）。
【００８９】
取得した解析木のノードアドレスが示すノードを基点とし配下にあるノードから、ノード内のプログラムの位置を参照し、異常終了したアドレスと一致するノードを探す（Ｓ２００２）。
【００９０】
見つけた解析木のノードのトークンをたどり、ソースプログラム上の該当する変数名のソースプログラム上の行中の文字位置、長さを求め、ソースプログラム上の行番号とともにソースプログラム編集部１６０に通知する（Ｓ２００３）。
【００９１】
図１３は、条件式判定部１５５と変数値算出部１５６と逆方向処理部１５７、再生処理部１５８で使用する変数アドレス対応表の構造をあらわしている。図１３の変数アドレス対応表は、図６の変数アドレス対応表に変数算出可能性、左辺変更場所、保留発生場所を追加している。変数算出可能性は、処理を逆方向に実行していく際に、データ領域１７２の変数の値をそのまま使えるかどうかを示すものであり、使える場合は“可能”、使えない場合は“保留”が設定される。“保留”は、代入式の左辺の変数が上書きされる場合、上書きされる前の値を再生処理により直ちに求めることができない時に設定される。左辺変更場所は、算出可能性が“保留”の場合に、処理を逆方向にたどり、左辺と同一変数を変更している処理がある場合、その解析木のノードのアドレスが格納される。保留発生場所は、“保留”となった処理の解析木のノードのアドレスが格納される。
【００９２】
図１４は、図１３の変数アドレス対応表の算出可能性が“保留”となった時に、その変数の変数アドレス対応表でのNo.を登録するための再生確認リストである。変数のNo.を覚えておき、処理を逆方向に処理していく時に、再生確認リストにある変数のNo.に対して、再生処理により、変数の値を復元する際に使用される。
【００９３】
図１５は、変数値算出部１５６の動作を示すフローチャートである。
【００９４】
変数値算出部１５６は、制御部１５１から、処理を逆方向に遡っていく際、ソースの１行毎にソースの行、すなわち、該当する解析木のノードを指定して、呼び出される。
【００９５】
変数値算出部１５６は、まず、再生確認リストに登録されている変数すべてについて、再生処理を実行し（Ｓ１６０１）、算出可能性が“保留”となっている変数を再生処理により復元することが可能な場合、復元する。再生処理の動作については、後述する。
【００９６】
次に、変数アドレス対応表で、指定された処理の左辺の変数の算出可能性が“可能”であるかどうか確認する（Ｓ１６０２）。“可能”である場合、データ領域１７２の当該変数の値がそのまま利用できる状態であるため、左辺の変数の解析木のノードの評価結果の状態に“確定”を設定し、評価結果の値にデータ領域１７２の当該変数の値を設定する（Ｓ１６０３）。“可能”でない場合、左辺の変数の解析木のノードの評価結果の状態に“不確定” を設定する（Ｓ１６０４）。
【００９７】
次に、指定された処理の右辺の変数のうち左辺と同じ変数を除く全ての変数について、Ｓ１６０６〜Ｓ１６０８のステップを実行する（Ｓ１６０５、Ｓ１６０９）。変数アドレス対応表で、当該変数の算出可能性が“可能”であるか確認する（Ｓ１６０６）。“可能”である場合、データ領域１７２の当該変数の値がそのまま利用できる状態であるため、当該変数の解析木のノードの評価結果の状態に“確定”を設定し、評価結果の値にデータ領域１７２の当該変数の値を設定する（Ｓ１６０７）。“可能”でない場合、当該変数の解析木のノードの評価結果の状態に“不確定” を設定する（Ｓ１６０８）。
【００９８】
続けて、逆方向処理を実行し（Ｓ１６１０）、可逆性のある演算の場合に、逆方向処理により変数を復元する。逆方向処理の動作については、後述する。逆方向処理で左辺の変数の算出可能性が“保留”になったかを確認する（Ｓ１６１１）。“保留”になった場合は、左辺の変数について、再び、再生処理を実行し（Ｓ１６１２）、左辺の変数の算出可能性が“保留”にならなかった場合は、終了する。この再生処理で、左辺の変数の算出可能性が“可能”になったかを確認する（ＳＳ１６１３）。“可能“になった場合は、再び、逆方向処理を実行し（Ｓ１６１４）、”可能”にならなかった場合は、終了する。
【００９９】
図１６は、逆方向処理部１５７の動作を示すフローチャートである。
【０１００】
まず、解析木のノードに逆方向命令があるかどうかを確認する（Ｓ１７０１）。逆方向命令がある場合は、その逆方向命令で入力となる全ての変数について、変数アドレス対応表の算出可能性が“可能”であるかを確認する（Ｓ１７０２）。全てが“可能”である場合は、逆方向命令を実行し（Ｓ１７０３）、その結果をデータ領域１７２内の左辺と同じ右辺の変数の場所に設定する（Ｓ１７０４）。続けて、左辺と同じ右辺の変数の解析木のノードの評価結果の状態に“確定”を設定し、評価結果の値にデータ領域１７２の当該変数の値を設定し、終了する（Ｓ１７０５）。
【０１０１】
Ｓ１７０１で、逆方向命令がない場合、または、Ｓ１７０２で少なくとも何れかが“可能”でなかった場合は、左辺と同じ右辺の変数の解析木のノードの評価結果の状態に“不確定”を設定する（Ｓ１７０６）。続けて、処理を逆方向に解析木をたどり、左辺と同一変数を変更している解析木のノードを探す（Ｓ１７０７）。これは、左辺と同一変数を変更している解析木のノードの情報から、再生処理により、変数の値を復元するためである。
【０１０２】
同一変数を変更している解析木のノードが見つかった場合、変数アドレス対応表の左辺の変数の算出可能性に“保留”を設定し、左辺変更場所に見つけた解析木のノードのアドレスを設定する（Ｓ１７０９）。変数アドレス対応表の左辺の変数の保留発生場所に、現在のソースの行、すなわち逆方向命令を実行しようとした解析木のノードのアドレスを登録する（Ｓ１７１０）。保留発生場所を登録しておくことで、あとで、再生処理が成功した際に、保留発生場所が示す解析木のノードの評価結果に、復元した変数の値を設定することができる。次に、再生確認リストに、変数アドレス対応表の当該変数のNo.を登録する（Ｓ１７１１）。再生確認リストに登録することにより、変数値算出部１５６の最初の処理再生処理を実行するが、この時の対象の変数を容易に把握できるようにする。
【０１０３】
Ｓ１７０７で解析木のノードが見つからなかった場合、変更している場所がないため、これより前の変数の状態は未初期化状態であるため、変数アドレス対応表の左辺の変数の算出可能性に“未初期化”を設定する（Ｓ１７１２）。
【０１０４】
図１７は、再生処理部１５８の動作を示すフローチャートである。
【０１０５】
まず、再生処理部１５８は、再生確認リストに格納されている変数Ｎｏ．全てについて、または、指定された変数Ｎｏ．について、Ｓ１８０２〜Ｓ１８１１のステップを実行する（Ｓ１８０１、Ｓ１８１２）。
【０１０６】
再生確認リストに格納されている変数No.または指定された変数No.をもとに、変数アドレス対応表を参照し（Ｓ１８０２）、その左辺変更格納場所が示す解析木のノードを参照する（Ｓ１８０３）。次に、その解析木のノードの右辺の全ての変数について、その解析木のノードから現在の行までの間に変更しているところがないかを確認する（Ｓ１８０４）。
【０１０７】
変更しているところがない場合、その解析木のノードの右辺の全ての変数について、変数アドレス対応表の算出可能性は“可能”であるかを確認し（Ｓ１８０５）。全て可能である場合は、その解析木のノードの再生命令を実行する（Ｓ１８０６）。
【０１０８】
次に、再生命令の実行結果を、データ領域１７２内の左辺と同じ右辺の変数の場所に設定する（Ｓ１８０７）。その後、左辺と同じ右辺の変数の解析木のノードの評価結果の状態に“確定”を設定し、評価結果の値にデータ領域１７２の当該変数の値を設定する（Ｓ１８０８）。
【０１０９】
今度は、左辺と同じ右辺の変数が復元できたので、保留発生場所の解析木のノードの評価結果の状態に“確定”、評価結果の値にデータ領域１７２の当該変数の値を設定する（Ｓ１８０９）。
【０１１０】
最後に、変数アドレス対応表の算出可能性に“可能”を設定し、左辺変更場所と保留発生場所を削除して（Ｓ１８１０）、再生確認リストから当該変数のＮｏ．を削除する（Ｓ１８１１）。
【０１１１】
尚、Ｓ１８０４で、変更しているところがあった場合（Ｎｏの場合）は、再生命令を実行できないので、終了する。また、Ｓ１８０５で、変数1個でも算出可能性が“可能”でない場合（Ｎｏの場合）も、再生命令が実行できないので、終了する。
【０１１２】
図１８は、条件式判定部１５５の動作を示すフローチャートである。
【０１１３】
条件式判定部１５５も、変数値算出部１５６同様に変数の値を復元する。このため、まず、再生確認リストに登録されている変数すべてについて、再生処理を実行し、（Ｓ１９０１）、算出可能性が“保留”となっている変数を再生処理により復元することが可能な場合、復元する。
【０１１４】
次に、条件式の解析木のノードを参照し、そのノード配下にある変数全てについて、Ｓ１９０３〜Ｓ１９０５のステップを実行する（Ｓ１９０２、Ｓ１９０６）
【０１１５】
変数アドレス対応表で、当該変数の算出可能性は“可能”であるか確認する（Ｓ１９０３）。“可能”である場合、当該変数の解析木のノードの評価結果の状態に“確定”、評価結果の値にデータ領域の当該変数の値を設定する（Ｓ１９０４）。算出可能性が“可能”でない場合は、当該変数の解析木のノードの評価結果の状態に“不確定”を設定する（Ｓ１９０５）。
【０１１６】
次に、求めた変数の評価結果の状態は、全て“確定”であるか確認する（Ｓ１９０７）。全て“確定”である場合は、解析木のノード内の再生命令を実行し、評価結果の状態に“確定”を設定し、評価結果の値に再生命令を実行した結果（真または偽）を設定する（Ｓ１９０８）。真または偽の結果から、通過するソースプログラムの行を、解析木のノードをたどり、さらに、解析木のノードからトークン列をたどり求める。トークン列から行位置、行中位置、長さを取得し、ソースプログラム編集部１６０に通知する。
【０１１７】
確定でないものがあった場合は、条件式の評価結果の状態に“不確定”を設定する（Ｓ１９１０）。
【０１１８】
図１９は、参照変数特定部１５９の動作を示すフローチャートである。
【０１１９】
異常終了箇所特定部１６３が特定したソース行番号と変数を、参照関係の被参照変数から探す（Ｓ２１０１）。
【０１２０】
見つけた被参照変数に対応する参照変数のソースファイル名、関数名、変数名、ソース行番号、トークン列アドレス、トークン列数を取得し、ソースプログラム編集部１６０に通知する（Ｓ２１０２）。
【０１２１】
取得したソースファイル名、関数名、変数名を、参照関係の被参照変数から探す（Ｓ２１０３）。
【０１２２】
見つかった場合は、見つけた被参照変数のソースファイル名、関数名、変数名、ソース行番号、トークン列アドレス、トークン列数を取得し、トークン列アドレスが示すトークン列から行位置、行中の文字位置、トークンの長さを取得し、ソースプログラム編集部１６０に通知する（Ｓ２１０５）。Ｓ２１０２へ飛び処理を繰り返す。Ｓ２１０４で、見つからなかった場合は、終了する。
【０１２３】
図２０を参照し、変数値取得部１６４の動作を説明する。図２０の上部は、”b = b + 1”を例にした変数の値を画面に表示しているイメージ例である。図２０の下部は、”b = b + 1”を例とした解析木の構造である。
【０１２４】
解析木を参照すると、変数値算出部１５６により、変数の値が復元されている状態である。解析木のノード２２０１は、”b = b + 1”の左辺の変数ｂを示すノードであり、評価結果格納アドレスで示される評価結果に、状態として“確定”、値として1が設定されている。解析木のノード２２０２は、”b = b + 1”の右辺の変数ｂを示すノードであり、評価結果格納アドレスで示される評価結果に、状態として“確定”、値として0が設定されている。
【０１２５】
変数値取得部１６４は、取得を指示された変数の解析木のノードを探し、変数の状態と値を取得する。例えば、”b = b + 1”の左辺の変数ｂを指定された場合は、解析木のノード２２０１を参照する。”b = b + 1”の右辺の変数ｂを指定された場合は、解析木のノード２２０２を参照する。
【０１２６】
変数値取得部１６４は、変数名、値、状態（確定または不確定）を、画面表示部１６１に渡し、画面表示部１６１は、図２０の上部のように、ソースプログラム１２０と共に、変数名、値、状態を画面に表示する。即ち、画面表示部１６１は、図２４に示すように、ソースプログラム１２０を、復元された変数の値と共に画面に表示するステップ（Ｓ３０００）を更に含む。
【０１２７】
以上、第２実施形態を説明した。上記第２実施形態は、以下のように構成される。
【０１２８】
デバッグ支援装置２００は、異常終了時のメモリダンプに基いて異常終了箇所から処理を逆方向に遡って変数の値を復元する復元命令を、ソースプログラムに基いて生成する、復元命令生成部１０９と、異常終了時に復元命令を実行することで変数の値を復元する、変数値算出部１５６と、を備える。以上の構成によれば、システムの性能低下を招くことなく、プログラムの異常終了の原因を利用者が判断し易くすることができる。
【０１２９】
復元命令は、遡る処理が可逆の場合にその処理とは逆の処理を実行することで変数の値を復元する逆方向命令を含む。
【０１３０】
復元命令は、復元対象である変数の値を演算した際に用いた演算を再度実行することで変数の値を復元する再生命令を含む。
【０１３１】
デバッグ支援装置２００は、ソースプログラムを、復元された変数の値と共に表示する画面表示部１６１を更に備える。
【０１３２】
デバッグ支援方法は、異常終了時のメモリダンプに基いて異常終了箇所から処理を逆方向に遡って変数の値を復元する復元命令を、ソースプログラムに基いて生成するステップ（Ｓ１３０２）と、異常終了時に復元命令を実行することで変数の値を復元するステップ（Ｓ１６０１、Ｓ１６１０）と、を含む。
【０１３３】
デバッグ支援方法は、ソースプログラム１２０を、復元された変数の値と共に表示するステップ（Ｓ３０００）を更に含む。
【０１３４】
上記実施形態によれば、以下の（１）〜（３）の効果が発揮される。
【０１３５】
（１）プログラムが異常終了した際に、メモリダンブ情報から、直接の原因となった変数が即座に特定でき、また、処理を逆方向に遡り、その時点での変数の値を復元し表示し、通過経路も表示できるため、原因究明にかかる時間を短縮することができる。
（２）原因となった変数がどこの処理のどの変数を参照して導出されたものなのかを表示できるため、原因究明の手助けとなる。
（３）トレースやデバッグ用の情報を埋め込んだプログラムは本番運用しているシステムに適用することは難しいが、本発明は、それらがなくとも、異常終了した時のメモリダンプ情報のみからデバッグを実施できる。
【０１３６】
上述の例において、プログラムは、様々なタイプの非一時的なコンピュータ可読媒体（non-transitory computer readable medium）を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（tangible storage medium）を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Read Only Memory）、ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Programmable ROM）、ＥＰＲＯＭ（Erasable PROM）、フラッシュＲＯＭ、ＲＡＭ（random access memory））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（transitory computer readable medium）によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【符号の説明】
【０１３７】
１  デバッグ支援装置
２  復元命令生成部
３  変数値算出部
【図１】
0006471556.tif 000002
【図２】
0006471556.tif 000003
【図３】
0006471556.tif 000004
【図４】
0006471556.tif 000005
【図５】
0006471556.tif 000006
【図６】
0006471556.tif 000007
【図７】
0006471556.tif 000008
【図８】
0006471556.tif 000009
【図９】
0006471556.tif 000010
【図１０】
0006471556.tif 000011
【図１１】
0006471556.tif 000012
【図１２】
0006471556.tif 000013
【図１３】
0006471556.tif 000014
【図１４】
0006471556.tif 000015
【図１５】
0006471556.tif 000016
【図１６】
0006471556.tif 000017
【図１７】
0006471556.tif 000018
【図１８】
0006471556.tif 000019
【図１９】
0006471556.tif 000020
【図２０】
0006471556.tif 000021
【図２１】
0006471556.tif 000022
【図２２】
0006471556.tif 000023
【図２３】
0006471556.tif 000024
【図２４】
0006471556.tif 000025