(57)【要約】  【課題】  ソフトウェアデバッグ能力の高いデバッグ装置を提供する。  【解決手段】  レジスタ内のデータを含むプロセッサレジスタ情報が記録されるレジスタ履歴メモリ１４、実行中のソースプログラムの行番号を含むソースプログラム情報が記録されるソース行履歴メモリ１５、および変数の値を含む変数情報が記録される変数履歴メモリ１６に記録された情報に基づいて、任意の前記変数の変更履歴を表示する変更履歴表示部とを有することにより、プログラム開始時からのプロセッサレジスタ情報、変数情報、ソースプログラム情報などを詳細に確認することで、より効率的なデバッグ処理を行うことが可能である。【選択図】  図１
2007034825.tif 000002
【特許請求の範囲】
【請求項１】
プログラムのデバッグを実施するデバッグ装置であって、
プロセッサの起動および停止を行うプロセッサ制御部と、
前記プログラム上に記述された任意の変数に対する代入を監視する変数監視部と、
前記プロセッサ制御部からの通知に応じて、レジスタ内のデータを含むプロセッサレジスタ情報が記録されるレジスタ履歴メモリと、
前記プロセッサ制御部からの通知に応じて、実行中のソースプログラムの行番号を含むソースプログラム情報が記録されるソース行履歴メモリと、
前記変数監視部からの通知に応じて、前記変数の値を含む変数情報が記録される変数履歴メモリと、
前記レジスタ履歴メモリ、前記ソース行履歴メモリおよび前記変数履歴メモリに記録された情報に基づいて、任意の前記変数の変更履歴を表示する変更履歴表示部と
を有するデバッグ装置。
【請求項２】
請求項１に記載のデバッグ装置であって、前記変更履歴表示部は、
前記ソース行履歴メモリに記録された前記ソースプログラム情報を時間的に逆順に表示するソースプログラム情報逆順表示部と、
前記レジスタ履歴メモリに記録された前記プロセッサレジスタ情報を時間的に逆順に表示するプロセッサレジスタ情報逆順表示部と、
前記変数履歴メモリに記録された前記変数情報を時間的に逆順に表示する変数情報逆順表示部と
を有するデバッグ装置。
【請求項３】
プログラムのデバッグを実施するデバッグ方法であって、
プロセッサの起動および停止が行われるプロセッサ制御ステップと、
前記プログラム上に記述された任意の変数に対する代入が監視される変数監視ステップと、
前記プロセッサ制御ステップにおける通知に応じて、レジスタ内のデータを含むプロセッサレジスタ情報が記録されるレジスタ情報記録ステップと、
前記プロセッサ制御ステップにおける通知に応じて、実行中のソースプログラムの行番号を含むソースプログラム情報が記録されるソース情報記録ステップと、
前記変数監視ステップにおける通知に応じて、前記変数の値を含む変数情報が記録される変数情報記録ステップと、
前記レジスタ情報記録ステップ、前記ソース情報記録ステップおよび前記変数情報記録ステップにおいて記録された情報に基づいて、任意の前記変数の変更履歴が表示されるステップと
を有するデバッグ方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｃ言語等の高級言語で記述されたソースプログラムのデバッグ作業で使用されるソフトウェアデバッグ装置に関する。
【背景技術】
【０００２】
従来のソフトウェアデバッグ装置として、例えばマイクロソフト社のＶｉｓｕａｌＳｔｕｄｉｏ（登録商標）といった製品が有名である。このような製品では、Ｃ言語等によるソースプログラムの任意の行にブレークポイントを設定し、プログラムがブレークポイントで停止したら、その時点でのプロセッサレジスタの情報や変数値等を表示させて、プログラムのデバッグを進めて行く。
【０００３】
しかしこれらのデバッグ装置では、変数の値はプログラムが停止している時の値しか表示されない。１つ前あるいはもっと前の変数の値がどうなっていたか、確認する事ができないという事情があった。これを解決するため、変数の表示に関し、現在の変数値に加え、1つ前の変数値を表示してデバッグ効率を向上させる方法が提案されている（例えば、特許文献１参照）。
【０００４】
また別の問題として、一般的なデバッグ装置ではプログラムを１行単位でのステップトレースが可能であるが、一度実行通過してしまった部分を再現するには、もう一度最初からプログラムを実行し直さなければならないので、効率的ではなかった。この様な状況は、デバッグ時に頻繁に起こる。これは、プログラムのバグが誤動作として表面に現れるのが、バグ箇所を通過してから一定時間経過してからの場合が多いからである。この場合、誤動作した時点から少しずつ前の状況を把握していくために何度もブレークポイントをかけ直して、プログラムを最初から再実行する必要があった。
【０００５】
これを解決するため、逆方向デバッグの方法が提案されている。この方法は、ソースプログラム中の各書き込み命令の実行時の直前の記憶手段内のデータを退避するための退避命令を書き込み命令の直前に追加したトレース用プログラムを生成し、更にこのトレース用プログラム中の各読み込み命令を書き込み命令に変換し、また書き込み命令を読み込み命令に変換する（例えば、特許文献２参照）。
【特許文献１】特許第３２９８５５４号公報
【特許文献２】特許第３３７９６７５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、特許文献１の変数の表示では、１つ前から現在の値に変更された変数値はその時だけ変更されたのか、複数回変更されたのか、あるいはプログラムのどこで変更されたのか等のより詳細な情報は表示されないため、デバッグ効率が十分に向上しているとはいえないという事情があった。
【０００７】
また特許文献２の逆方向デバッグでは、本来のデバッグするプログラムに変更を加えているためプログラムの実行ステップが増えてしまう。ステップ数が増加のため、デバッグ時にシステムの性能評価を正確に行う事ができない上、トレースプログラムを生成するという余分な時間も必要となってしまうと事情があった。
【０００８】
本発明は、上記の事情を鑑みてなされたものであって、Ｃ言語等の高級言語で記述されたソースプログラムのデバッグを行うにあたり、変数の更新履歴に関するより詳細なデバッグ情報を提示し、かつトレースプログラムを生成することなく効率的なデバッグを行うことができるデバッグ装置を提供することを目的とする。
【課題を解決するための手段】
【０００９】
上記目的を達成するために、本発明の第１のデバッグ装置は、プログラムのデバッグを実施するデバッグ装置であって、プロセッサの起動および停止を行うプロセッサ制御部と、前記プログラム上に記述された任意の変数に対する代入を監視する変数監視部と、前記プロセッサ制御部からの通知に応じて、レジスタ内のデータを含むプロセッサレジスタ情報が記録されるレジスタ履歴メモリと、前記プロセッサ制御部からの通知に応じて、実行中のソースプログラムの行番号を含むソースプログラム情報が記録されるソース行履歴メモリと、前記変数監視部からの通知に応じて、前記変数の値を含む変数情報が記録される変数履歴メモリと、前記レジスタ履歴メモリ、前記ソース行履歴メモリおよび変数履歴メモリに記録された情報に基づいて、任意の前記変数の変更履歴を表示する変更履歴表示部とを有する構成としている。
【００１０】
この構成により、プログラム開始時からのプロセッサレジスタ情報、変数情報、ソースプログラム情報などを詳細に確認することで、変数が何回変更されたのか、あるいはプログラムのどの箇所で変数が変更されたのかなどを知ることができ、より効率的なデバッグ処理を行うことが可能である。
【００１１】
また、本発明の第２のデバッグ装置は、前記変更履歴表示部が、前記ソース行履歴メモリに記録された前記ソースプログラム情報を時間的に逆順に表示するソースプログラム情報逆順表示部と、前記レジスタ履歴メモリに記録された前記プロセッサレジスタ情報を時間的に逆順に表示するプロセッサレジスタ情報逆順表示部と、前記変数履歴メモリに記録された前記変数情報を時間的に逆順に表示する変数情報逆順表示部とを有する構成としている。
【００１２】
この構成により、プログラム開始後のプロセッサレジスタ情報、変数情報、ソースプログラム情報などの変更履歴を、デバッグ用のプログラムを実行せずに確認することができるため、トレースプログラムを作成することなく、より効率的なデバッグ処理を行うことが可能である。
【００１３】
また、本発明の第１のデバッグ方法は、プログラムのデバッグを実施するデバッグ方法であって、プロセッサの起動および停止が行われるプロセッサ制御ステップと、前記プログラム上に記述された任意の変数に対する代入が監視される変数監視ステップと、前記プロセッサ制御ステップによる通知に応じて、レジスタ内のデータを含むプロセッサレジスタ情報が記録されるレジスタ情報記録ステップと、前記プロセッサ制御ステップによる通知に応じて、実行中のソースプログラムの行番号を含むソースプログラム情報が記録されるソース情報記録ステップと、前記変数監視ステップによる通知に応じて、前記変数の値を含む変数情報が記録される変数情報記録ステップと、前記レジスタ情報記録ステップ、前記ソース情報記録ステップおよび前記変数情報記録ステップにて記録された情報に基づいて、任意の前記変数の変更履歴が表示されるステップとを有する方法としている。
【００１４】
この方法により、プログラム開始時からのプロセッサレジスタ情報、変数情報、ソースプログラム情報などを詳細に確認することで、変数が何回変更されたのか、あるいはプログラムのどの箇所で変数が変更されたのかなどを知ることができ、より効率的なデバッグ処理を行うことが可能である。
【発明の効果】
【００１５】
以上のように本発明によれば、変数の変更履歴を表示することにより変数の変更箇所が容易に見つけられる。また、逆方向のデバッグトレース表示を表示する事により、処理アルゴリズムの誤り等も容易に見つけられるようになる。これらによりソフトウェアの開発において、従来以上に効率の良いデバッグが可能となる。
【発明を実施するための最良の形態】
【００１６】
以下、本発明の実施形態のデバッグ装置について、図面を用いて説明する。
（第１の実施形態）
図１は本発明の実施形態におけるデバッグ装置１０の構成図である。
デバッグ装置１０は、ロードモジュール１１、プロセッサ制御部１２、変数監視部１３、レジスタ履歴メモリ１４、ソース行履歴メモリ１５、変数履歴メモリ１６、レジスタ表示部１７、プログラム表示部１８および変数表示部１９を有する。
【００１７】
ロードモジュール１１は、デバッグ対象プログラムである。またプロセッサ制御部１２は、ホストマシンのプロセッサをアセンブリ言語レベルで１ステップずつ起動停止を行う。また変数監視部１３は、プログラム上の任意の変数に対する代入を監視する。またレジスタ履歴メモリ１４は、プロセッサ制御部１２からの通知に応じてプロセッサレジスタの情報を記録する。またソース行履歴メモリ１５は、プロセッサ制御部１２からの通知に応じて実行中のソースプログラム行を記録する。また変数履歴メモリ１６は、変数監視部１３からの通知に応じて変数情報を記録する。またレジスタ表示部１７は、プロセッサレジスタの情報を表示する。またプログラム表示部１８は、ソースプログラムの実行行を表示する。また変数表示部１９は、変数情報を表示する。
【００１８】
次に、プロセッサ制御部１２の動作に関して説明する。図２は本発明の実施形態におけるプロセッサ制御部１２の動作フロー図である。
【００１９】
プログラムのデバッグを開始すると、プロセッサ制御部１２はホストプロセッサのアセンブラレベルの命令をフェッチ・実行し（ステップＳ２０１）、その命令がＣ言語ソースプログラム1行の先頭の命令に相当するかどうかを調べる（ステップＳ２０２）。先頭の命令に相当した場合には、プロセッサ制御部１２はレジスタ履歴メモリ１４へその時点でのプロセッサレジスタの内容を記録するよう通知し（ステップＳ２０３）、続けてソース行履歴メモリ１５へＣ言語ソースプログラムの１行の行番号を記録するよう通知する（ステップＳ２０４）。そして、プロセッサ制御部１２は変数監視部１３を起動する（ステップＳ２０５）。また、命令がＣ言語ソースプログラム1行の先頭の命令に相当しない場合（ステップＳ２０２）、プロセッサ制御部１３は命令フェッチからの処理を繰り返す。
【００２０】
次に、変数監視部１３の動作に関して説明する。図３は本発明の変数監視部１３の動作フロー図である。
【００２１】
変数監視部１３は、現在のアセンブラレベルの命令が、まずＣソースは代入文か否か（ステップＳ３０１）、アセンブラレベルの命令にメモリ書き込みをするストア命令があるか否かを判定する（ステップＳ３０２）。ステップＳ３０１、Ｓ３０２のうち、いずれか一方の条件が成立した場合には、変数監視部１３は変数履歴メモリ１６へ記録通知を行う（ステップＳ３０３）。そして、変数監視部１３はプロセッサ制御部１２へ制御を戻す（ステップＳ３０４）。
【００２２】
次に、Ｃ言語によるソースプログラムおよびアセンブラプログラムの命令コードに関して説明する。図４は本発明の実施形態におけるＣ言語によるソースプログラムである。また、図５は本発明の実施形態におけるＣ言語によるソースプログラムおよびアセンブラレベルの命令コードの対応図である。図４におけるＣ言語ソースプログラム1行の先頭の命令とは、図５で先頭欄に矢印がついた命令を示す。
【００２３】
次に、レジスタ履歴メモリ１４へのプロセッサレジスタ情報の記録方法を説明する。図６は本発明の実施形態におけるレジスタ履歴メモリ１４へのプロセッサレジスタ情報の記録方法を示した図である。ここでは、プロセッサにはＰｅｎｔｉｕｍ（登録商標）プロセッサを一例として用いている。また本実施形態においては、レジスタ履歴メモリ１４、ソース行履歴メモリ１５、変数履歴メモリへの記録の動作主体は、プロセッサ制御部１２である。
【００２４】
プロセッサ制御部１２からの記録通知が行われると、レジスタの履歴メモリ各行の先頭にプログラムカウンタ（ＥＩＰ）が記録され、以降内部レジスタが順に記録される。例えば、ＥＡＸ、ＥＢＸ、ＥＣＸ、ＥＤＸ、・・・のような順である。レジスタ値に変化が無い場合には、変化が生じるまで値が記録されない。
【００２５】
次に、ソース行履歴メモリ１５へのソースプログラム行の記録方法を説明する。図７は本発明の実施形態におけるソース行履歴メモリ１５へのソースプログラム行の記録方法を示す図である。プロセッサ制御部１２から記録通知が行われると、ソース行履歴メモリ各行の先頭にプロセッサレジスタ内のプログラムカウンタ（ＥＩＰ）が記録され、以降実行中のソースプログラムの行番号が記録される。
【００２６】
次に、変数履歴メモリ１６への変数情報の記録方法を説明する。図８は本発明の実施形態における変数履歴メモリ１６への変数情報の記録方法を示す図である。変数監視部１３から記録通知が行われると、プロセッサレジスタ内のプログラムカウンタ（ＥＩＰ）が記録され、以降、変数名、その値が順に記録される。この場合も値に変化が無い場合には、値に変化が生じるまでは値が記録されない。
【００２７】
本発明の実施形態におけるデバッグ装置１０は、プログラムのデバッグを開始すると、ブレークポイント位置まで図２と図３のフローを実行していく。ブレークポイントでプログラムの実行が停止すると、ユーザーからの指示で変数履歴の表示、または逆方向デバッグを実行する。
【００２８】
ユーザから変数履歴表示を指示された場合には、変数表示部１９は、図９のフローチャートに従い変数履歴を表示する。図９は本発明の実施形態における変数履歴表示を行うためのフロー図である。図４のソースプログラム中の変数ａとｉの値をプログラム実行当初から、現在の最新の値まで表示する例を以下に示す。
【００２９】
まず変数履歴メモリ１５の各行を示す変数ｉｎｄｅｘが０に初期化される（ステップＳ９０１）。これで変数履歴メモリ１５の一番最初の行が選択される。続いてｉｎｄｅｘが最新行と等しいか否かが判定され（ステップＳ９０２）、等しい場合には変数データが表示され（ステップＳ９０６）、等しくない場合には変数履歴メモリ１４からｉｎｄｅｘの指す行のＥＩＰレジスタ値および変数データが読み出される（ステップＳ９０３）。続いてソース行履歴メモリ１５からＥＩＰレジスタ値の等しいソース行番号が読み出される（ステップＳ９０４）。そしてｉｎｄｅｘが１インクリメントされる（ステップＳ９０５）。
【００３０】
次に、変数履歴表示例を示す。図１０は本発明の実施形態における第１の変数履歴表示例である。図４の変数ａとｉの値が全て表示されている例である。この表示例は、変数が右に行くに従って最新の値であり、変数ａの場合は最初１０であり、その時のソースプログラム行番号が１０行目、アセンブラレベルのプログラムカウンタのアドレスが００４１１ＣＢＥ（１６進）であることを示している。以後、変数ａが１１→１３→１６と変化していることがわかる。また、その値を変更したソースプログラムの行が全て表示されているので、変数が予期しない値になったとしても、その原因箇所が一目でわかるようになる。
【００３１】
また、図１１は本発明の実施形態における第２の変数履歴表示例である。この表示例は、変数の変更された順番を明確にすることにより、相互関係が分かるように表示した例である。各値の上をマウスカーソルを乗せると、その時のソースプログラム行番号、プログラムカウンタのアドレスがポップアップ表示される。
【００３２】
次に、ユーザから逆方向デバッグが指示された場合の例を示す。レジスタ表示部１７、プログラム表示部１８および変数表示部１９は、図１２のフローチャートに従って逆方向デバッグ結果の表示を行う。図１２は本発明の実施形態における逆方向デバッグを行うためのフロー図である。また本実施形態においては、逆方向デバッグを行う動作主体はプロセッサ制御部１２である。
【００３３】
まずアドレスポインタに最新の実行アドレスが代入される（ステップＳ１２０１）。続いて逆ステップ実行が実施されるか否かが判定される（ステップＳ１２０２）。ステップＳ１２０２が真の場合には、ソース行履歴メモリ１５からアドレスポインタの指すソースプログラム行が取り出され（ステップＳ１２０３）、プログラム表示部１８はそのソースプログラム行をハイライト表示する（ステップＳ１２０４）。続いてレジスタ履歴メモリ１４からアドレスポインタの指す位置のレジスタデータが取り出され（ステップＳ１２０５）、レジスタ表示部１７はレジスタデータを表示する（ステップＳ１２０６）。
【００３４】
続いて変数履歴メモリ１６からアドレスポインタの指す位置の変数データが取り出され（ステップＳ１２０７）、変数表示部１９は変数データを表示する（ステップＳ１２０８）。続いてアドレスポインタが１デクリメントされる（ステップＳ１２０９）。またステップＳ１２０２が偽の場合には、処理は終了する。ユーザからの逆方向デバッグの指示があった場合には、このフローが繰り返し実行される。以上のようなフローにより、プログラムが実行してきた箇所を逆方向にソースコードをハイライトしつつ、その時点でのレジスタの値、変数の値を確認できる。
【００３５】
このような本発明の実施形態におけるデバッグ装置１０によれば、プログラムのデバッグを実施するデバッグ装置であって、プロセッサの起動および停止を行うプロセッサ制御部１２と、前記プログラム上に記述された任意の変数に対する代入を監視する変数監視部１３と、前記プロセッサ制御部１２からの通知に応じて、レジスタ内のデータを含むプロセッサレジスタ情報が記録されるレジスタ履歴メモリ１４と、前記プロセッサ制御部１２からの通知に応じて、実行中のソースプログラムの行番号を含むソースプログラム情報が記録されるソース行履歴メモリ１５と、前記変数監視部１３からの通知に応じて、前記変数の値を含む変数情報が記録される変数履歴メモリ１６と、前記レジスタ履歴メモリ１４、前記ソース行履歴メモリ１５および変数履歴メモリ１６に記録された情報に基づいて、任意の前記変数の変更履歴を表示する変更履歴表示部とを有することにより、プログラム開始時からのプロセッサレジスタ情報、変数情報、ソースプログラム情報などを詳細に確認することで、変数が何回変更されたのか、あるいはプログラムのどの箇所で変数が変更されたのかなどを知ることができ、より効率的なデバッグ処理を行うことが可能である。
【００３６】
また、前記変更履歴表示部が、前記ソース行履歴メモリ１５に記録された前記ソースプログラム情報を時間的に逆順に表示するソースプログラム情報逆順表示部１８と、前記レジスタ履歴メモリ１４に記録された前記プロセッサレジスタ情報を時間的に逆順に表示するプロセッサレジスタ情報逆順表示部１７と、前記変数履歴メモリ１６に記録された前記変数情報を時間的に逆順に表示する変数情報逆順表示部１９とを有することにより、プログラム開始後のプロセッサレジスタ情報、変数情報、ソースプログラム情報などの変更履歴を、デバッグ用のプログラムを実行せずに確認することができるため、トレースプログラムを作成することなく、より効率的なデバッグ処理を行うことが可能である。
【産業上の利用可能性】
【００３７】
本発明は、Ｃ言語等の高級言語で記述されたソースプログラムのデバッグを行うにあたり、変数の更新履歴に関するより詳細なデバッグ情報を提示し、かつトレースプログラムを生成することなく効率的なデバッグを行うことができるデバッグ装置等に有用である。
【図面の簡単な説明】
【００３８】
【図１】本発明の実施形態におけるデバッグ装置の構成図
【図２】本発明の実施形態におけるプロセッサ制御部の動作フロー図
【図３】本発明の実施形態における変数監視部の動作フロー図
【図４】本発明の実施形態におけるＣ言語によるソースプログラム
【図５】本発明の実施形態におけるＣ言語によるソースプログラムおよびアセンブラレベルの命令コードの対応図
【図６】本発明の実施形態におけるレジスタ履歴メモリへのプロセッサレジスタ情報の記録方法を示した図
【図７】本発明の実施形態におけるソース行履歴メモリへのソースプログラム行の記録方法を示す図
【図８】本発明の実施形態における変数履歴メモリへの変数情報の記録方法を示す図
【図９】本発明の実施形態における変数履歴表示を行うためのフロー図
【図１０】本発明の実施形態における第１の変数履歴表示例
【図１１】本発明の実施形態における第２の変数履歴表示例
【図１２】本発明の実施形態における逆方向デバッグを行うためのフロー図
【符号の説明】
【００３９】
１０  デバッグ装置
１１  ロードモジュール
１２  プロセッサ制御部
１３  変数監視部
１４  レジスタ履歴メモリ
１５  ソース行履歴メモリ
１６  変数履歴メモリ
１７  レジスタ表示部
１８  プログラム表示部
１９  変数表示部
【図１】
2007034825.tif 000003
【図２】
2007034825.tif 000004
【図３】
2007034825.tif 000005
【図４】
2007034825.tif 000006
【図５】
2007034825.tif 000007
【図６】
2007034825.tif 000008
【図７】
2007034825.tif 000009
【図８】
2007034825.tif 000010
【図９】
2007034825.tif 000011
【図１０】
2007034825.tif 000012
【図１１】
2007034825.tif 000013
【図１２】
2007034825.tif 000014