(57)【特許請求の範囲】
【請求項１】
オブジェクト指向言語を使用したアプリケーションの開発のデバッグ作業を支援する装置において、ユーザが行った操作とアプリケーション内のオブジェクトの値の履歴とを取得する手段と、前記操作とオブジェクトの値の履歴とを関連付けて保存する手段と、同一の操作に対して取得した複数のオブジェクトの履歴同士を比較し差異を検出する手段と、履歴中のオブジェクトの状態の一覧を生成し、クラスごとに予め定義されたメンバ変数の定義域と、実際に取得された値とを比較し、定義域外に外れている状態を検出する手段と、前記関連付けて保持された操作とオブジェクトの値の履歴、オブジェクト履歴比較結果あるいはオブジェクト状態一覧を表示・出力する手段とを有することを特徴とするオブジェクト指向開発用デバッグ支援装置。
【請求項２】
請求項１記載のオブジェクト指向開発用デバッグ支援装置において、ユーザが行った操作の操作情報を記憶する手段と、前記記憶された操作情報に基づいてユーザの操作を再生してアプリケーションを操作する手段をさらに有し、最初にユーザが行った操作とまったく同一の操作で何回でもデバッグ実行を行い、オブジェクトの値を取得することを特徴とするオブジェクト指向開発用デバッグ支援装置。
【請求項３】
請求項１もしくは２記載のオブジェクト指向開発用デバッグ支援装置において、デバッグ対象アプリケーションのオリジナルソースコードを解析して、クラスのメソッドやメンバを認識し、メソッド呼び出し時点での、メソッドへの引数の値およびメンバ変数およびメソッド内で作成された自動変数の値を保存するためのコードを生成する手段と、前記生成されたコードを記憶する手段とをさらに有し、前記記憶されたコードによりデバッグ用アプリケーションを生成することを特徴とするオブジェクト指向開発用デバッグ支援装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、オブジェクト指向言語を使用したイベントドリブンなアプリケーションなどの開発でのデバッグ作業を支援するオブジェクト指向開発用デバッグ支援装置に関する。
【０００２】
【従来の技術】
プログラムの開発においてデバッグのための情報を得る従来からの技術としてトレーサがある。これはプログラムが実行した経路を記録しつつ、指定した変数の値を監視して、実行経路や変数の値を表示／出力するものであるが、オブジェクト指向言語を使用したアプリケーションなどにおけるオブジェクトの内容を保存する機能はない。
【０００３】
また、最近のオブジェクト指向言語を使用したアプリケーションのデバッグ支援環境では、ステップの実行をしながらオブジェクトのメンバ変数の値を表示する機能をもつものもあるが、履歴が残らないため、何度もデバッグ実行を繰り返す必要がある。
【０００４】
なお、ユーザがアプリケーションに対して行った操作を取得できる技術としては、例えば特開平１０−２７５０９３号公報「プログラムテスト支援装置」に記載の技術があるが、アプリケーションの内部の状態を確認できないため、デバッグ支援に適用するのは難しい。
【０００５】
【発明が解決しようとする課題】
近年、オブジェクト指向言語の普及により、アプリケーションが複数のオブジェクトやコンポーネント間のメッセージのやり取りで動作するようになってきている。そのため、デバッグの際には、問題のあるオブジェクトだけを取り出して振る舞いを調べることはできず、関連するオブジェクトも含めてデバッグを行う必要がある。
【０００６】
一般に多数のオブジェクトの相互作用で動作しているアプリケーションにおいては、アプリケーションの不具合は、あるオブジェクトが異常な値をとることによってその影響が伝播し、最終的に外部からわかる異常となって現れるものである場合が多く、このような場合、デバッグの際にはオブジェクト自身の値だけでなく、そのオブジェクトに関連する変数やオブジェクトの値も調べる必要がある。しかし、従来からのトレーサやステップ実行では、実行経路を監視したり、実行中に指定した変数の値を抽出することはできるが、実行経路に沿って、あるオブジェクトに関連する変数やオブジェクトの値、またはそのオブジェクト自身の値を一度に抽出することはできない。このような場合、従来のトレーサやデバッグ支援環境では、不具合が発生した個所の特定から不具合の原因を突き止めるまでに、その都度監視する対象を変えながら、何回もデバッグ実行を繰り返す必要がある。場合によっては、ステップ実行をおこなって目視でオブジェクトや変数の値の確認を行うという、長時間にわたって継続的な緊張をデバッグ担当者に強いる作業を何回も繰り返さなければならないという問題点があった。
【０００７】
また、ＧＵＩ（Ｇｒａｐｈｉｃａｌ  Ｕｓｅｒ  Ｉｎｔｅｒｆａｃｅ）ベースの所謂イベントドリブンなアプリケーションにおいては、処理の実行にはユーザの操作が必要であるため、バッチ処理のように同じ入力パラメータを与えて自動で実行させることができない。そのため、デバッグ中やデバッグ完了後のデグレードチェックも含めて、同一の操作を何回も正確に手動で繰り返し、アプリケーションの動作を確認しなくてはならないという問題もある。
【０００８】
本発明の目的は、オブジェクト指向言語を使用したイベントドリブンなアプリケーションなどの開発において、何度も同じ条件で実行しなければならない長時間の緊張を強いるデバッグ作業の実施回数の削減と、修正後のアプリケーションの動作が正しいか確認するデグレードチェック作業にかかる作業の労力の削減と、１回のデバッグ作業そのものにかかる労力の削減などを実現するオブジェクト指向開発用デバッグ支援装置を提供することにある。
【０００９】
【課題を解決するための手段】
本発明のオブジェクト指向開発用デバッグ支援装置は、ユーザが行った操作と、アプリケーション内のオブジェクトの値の履歴とを取得する手段、操作と値の履歴とを関連付けて保存する手段、同一の操作に対して取得した複数のオブジェクトの履歴同士を比較して差異を検出する手段、履歴中のオブジェクトの状態の一覧を生成し、クラスのメンバの値の仕様上の定義域と、実際に取得された値とを比較し、定義域外に外れている状態を検出する手段、オブジェクト履歴比較結果やオブジェクト状態一覧などを表示・出力する手段等を有することを特徴とする。
【００１０】
【発明の実施の形態】
以下に、本発明の一実施の形態を図面を参照して具体的に説明する。
図１は、本発明によるオブジェクト指向開発用デバッグ支援装置の一実施の形態の構成例を示すブロック図である。図１において、１１６は後述のスタートアップシステムや実行時システムおよびテスト、デバッグ対象のアプリケーションが動作するＯＳである。１１８はオリジナルソースコード、１１７はオリジナルソースコードをビルドして作られたテスト対象アプリケーション、１１５は後述のデバッグ情報取得用ソースコード記憶手段１１４に保存されたソースコードをビルドして作られるデバッグ用アプリケーションである。線１００で囲った部分が本発明を実施する部分であり、以下の構成からなる。
【００１１】
１０１はオリジナルソースコード１１８のクラスまたはモジュールのコードを解析して、データメンバまたはモジュールレベル変数またはオブジェクトを検出し、クラスまたはモジュールにそれらのデータメンバまたはモジュールレベル変数の値を保存するためのメンバ保存用メソッドを追加するメンバ保存用メソッド追加手段である。１０２はイベントプロシージャやメソッドを解析して、プロシージャ引数およびオブジェクトのデータメンバおよびモジュールレベル変数の値を保存するためのメンバ保存用メソッドを呼び出すコードを追加するプロシージャ内メンバ変数保存用コード追加手段である。１０３は実行時システムのオブジェクト値保存機能を呼び出すコードを追加するオブジェクト値保存機能呼び出しコード追加手段１０３である。１０４はメンバ保存用メソッド追加手段１０１がどのソースコードにどの名前のメンバ保存用メソッドを追加したかを記憶するメンバ保存用メソッド名テーブル１０４である。１１４はメンバ保存用メソッド追加手段１０１およびプロシージャ内変数保存用コード追加手段１０２およびオブジェクト値保存機能呼び出しコード追加手段１０３によって加工されたソースファイルを記憶しておくデバッグ情報取得用ソースコード記憶手段である。
【００１２】
１０５はユーザがアプリケーションに対して行った操作を取得するユーザ操作取得手段である。１０６はユーザ操作取得手段１０５によって取得された操作を記憶する操作情報記憶手段である。１０７は操作情報記憶１０６手段に格納された操作情報に基づいて、デバッグ用アプリケーション１１５に対しユーザの操作を再現するユーザ操作再生手段である。１０８はデバッグ用アプリケーション１１５から指定された変数またはオブジェクトの値を取得するオブジェクト値履歴取得手段である。１０９はオブジェクト値履歴取得手段１０８によって取得された変数またはオブジェクトの値を記憶するオブジェクト値履歴記憶手段である。１１０はオブジェクト値履歴記憶手段１０９の内容を用いて、二つあるいはそれ以上のオブジェクト値の履歴を比較するオブジェクト履歴比較手段である。１１１はあらかじめクラスごとに定義されたクラスのメンバの定義情報を格納したメンバ変数定義域情報テーブルである。１１２はオブジェクト値履歴記憶手段１０９の内容からあるクラスのすべてのオブジェクトがとった状態の一覧を作成し、メンバ変数定義域情報テーブル１１１内に格納されているメンバ変数の定義域と実際に取得したオブジェクトの値を比較し、不正な値が設定されている状態を検出するオブジェクト状態一覧作成手段である。１１３はオブジェクト履歴比較手段１１０とオブジェクト状態一覧作成手段１１２の出力を表示・出力したり、オブジェクト値履歴記憶手段１０９内の情報を検索、一覧表示・出力する、表示・出力手段である。
【００１３】
図１中、スタートアップシステムは、メンバ保存用メソッド追加手段１０１、、プロシージャ内変数保存用コード追加手段１０２、オブジェクト値保存機能呼び出しコード追加手段１０３、メンバ変数保存用メソッド名テーブル１０４、デバッグ情報取得用ソースコード記憶手段１１４から構成される。
【００１４】
実行時システムは、ユーザ操作取得手段１０５、操作情報記憶手段１０６、ユーザ操作再生手段１０７、オブジェクト値履歴取得手段１０８、オブジェクト値履歴記憶手段１０９、オブジェクト履歴比較手段１１０、メンバ変数定義域情報テーブル１１１、オブジェクト状態一覧作成手段１１２、表示・出力部１１３から構成される。
【００１５】
スタートアップシステムは、デバッグ開始時に一度だけ実行されて、ソースコードを加工し、実行時システムはデバッグ中に動作する。
【００１６】
図２は、スタートアップシステムに含まれる各手段と、実行時システムに含まれる各手段を用いてデバッグする際のおおまかなフローチャートを示したものである。まず、このフローチャートを用いて、図１の全体の処理の流れを説明する。
【００１７】
図２に示すように、まず、アプリケーション１１７のテストを行う際に、予め実行時システムのユーザ操作取得手段１０５により、ユーザがアプリケーション１１７に対して行った操作を取得し、操作情報記憶手段１０６に保存しておく（ステップ２０１）。テストで不具合が発生したら、スタートアップシステムのメンバ保存用メソッド追加手段１０１、プロシージャ内変数保存用コード追加手段１０２、オブジェクト値保存機能呼び出しコード追加手段１０３、メンバ変数保存用メソッド名テーブル１０４により、新しくデバッグ用のソースコードをデバッグ情報取得ソースコード記憶手段１１４に生成し、デバッグ用アプリケーション１１５をビルドする（ステップ２０２）。この間のスタートアップシステムの動作については後で詳細に説明する。
【００１８】
次に、実行時システムの操作情報記憶手段１０６から、不具合が確認された操作情報を取り出し、ユーザ操作再生手段１０７により、取り出された操作情報を再生し、デバッグ用アプリケーション１１５を操作する（ステップ２０３）。このとき、スタートアップシステムによって追加されたコードが実行され、オブジェクト値がオブジェクト値履歴取得手段１０８によってオブジェクト値履歴記憶手段１０９に保存される（ステップ２０４）。次に、オブジェクト値履歴記憶手段１０９の内容をオブジェクト履歴比較手段１１０、オブジェクト状態一覧作成手段１１２によって調査し、アプリケーションをデバッグする（ステップ２０５）。デバッグ後、アプリケーションに対して、操作情報をユーザ操作再生手段１０７によって再生してアプリケーションを実行し（ステップ２０６）、不具合が発生しないことを確認する。もしまだ不具合が発生するのであれば、再びオブジェクト値履歴記憶手段１０９の内容をオブジェクト履歴比較手段１１０、オブジェクト状態一覧作成手段１１２によって調べ、デバッグする（ステップ２０６に戻る）。
【００１９】
以上のようにして、図１に示す本システムはオブジェクト指向言語を使用したイベントドリブンなアプリケーションのデバッグ作業を支援する。
【００２０】
次に、スタートアップシステムについて詳細に説明する。図３はメンバ保存用メソッド追加手段１０１の動作を示すフローチャートである。図４はＪａｖａ言語で記述されたあるクラスについて、スタートアップシステムのメンバ保存用メソッド追加手段１０１を実行して得られる新しいソースコードの例である。
【００２１】
図４中、４０１がメンバ保存用メソッド追加手段１０１によって追加される有効なソースコードであり、４０２が変数またはオブジェクトのメンバ変数を保存するためのオブジェクト値履歴取得手段１０８の変数保存用インターフェースである。
【００２２】
図３に示すように、メンバ保存用メソッド追加手段１０１は、まず、対象となるすべてのソースファイルについて、バックアップを作成する（ステップ３０１）。次に対象ソースファイルに、そのソースファイルにある既存のメソッド名と重複しない名前で、空のメンバ保存用メソッドを追加する（ステップ３０２）。追加するごとにメンバ変数保存用メソッド名テーブル１０４に当該ソースファイル名と作成したメソッド名を記入する（ステップ３０３）。図５にメンバ変数保存用メソッド名テーブル１０４の構造を示す。
【００２３】
次に、メンバ保存用メソッド追加手段１０１は、おのおののソースファイル１１８について、そのソースファイルがクラスであるかモジュールであるか判断する（ステップ３０４）。クラスであった場合、クラスのメンバ変数を調べる（ステップ３０５）。基本データ型に属するデータメンバであれば、そのデータ型に応じたデータを保存するためにオブジェクト値保存機能呼び出しコード追加手段１０３を呼び出して、そのソースファイルのメンバ保存用メソッド内にそのメンバ変数の値を保存するためのコードを追加する（ステップ３０６）。クラスのメンバ変数があるクラスのオブジェクトであった場合は、メンバ変数保存用メソッド名テーブル１０４から、そのクラスのメンバ保存用メソッド名を特定し、メンバを保存するメソッドを呼び出すコードを追加する（ステップ３０７）。
【００２４】
以上のようにして、メンバ変数があるクラスのオブジェクトであっても再帰的にメンバ保存用メソッドを呼び出してデータメンバの値を保存する機能を実現する。
【００２５】
次に、メンバ保存用メソッド追加手段１０１は、ソースファイル１１８がモジュールであった場合、そのモジュール内のモジュールレベル変数を調べる（ステップ３０８）。基本データ型に属するモジュール変数であれば、そのデータ型に応じたデータを保存するためにオブジェクト値保存機能呼び出しコード追加手段１０３を呼び出して、メソッド内にそのメンバ変数の値を保存するためのコードを追加する（ステップ３０９）。モジュール変数が、あるクラスのオブジェクトであった場合は、そのクラスのメンバ保存用メソッドを呼び出すコードを追加する（ステップ３１０）。
【００２６】
以上のようにして、モジュール変数があるクラスのオブジェクトであっても再帰的にメンバ保存用メソッドを呼び出してデータメンバの値を保存する機能を実現する。
【００２７】
図６はプロシージャ内変数保存用コード追加手段の動作を示すフローチャートである。図７はＪａｖａ言語で記述されたあるクラスについて、スタートアップシステムを実行して得られる新しいソースファイルの例である。
【００２８】
図７中、７０１はイベントプロシージャ名とイベント名の保存および、そのオブジェクト自身のメンバ変数の値を保存するためにイベントプロシージャに追加されるコード、７０２はメソッドの開始およびメソッド引数保存開始を宣言するためのオブジェクト値履歴取得手段１０８のインターフェース、７０３はメソッド呼び出しの引数を保存するためのオブジェクト値履歴取得手段１０８のインターフェース、７０４はメソッド引数保存の終了を宣言するためのオブジェクト値履歴取得手段１０８のインターフェース、７０５はイベントプロシージャ呼び出しが発生したことをオブジェクト値履歴取得手段１０８に通知するためのオブジェクト値履歴取得手段１０８のインターフェース、７０６はメンバ保存用メソッド追加手段１０１によって追加されるメンバ変数保存コード、７０７はログカウンタ９０２の値を１増やすためのオブジェクト値履歴取得手段１０８のインターフェース、７０８はメンバ保存用メソッド追加手段１０１によって追加されるメンバ変数保存用メソッド呼び出しコード（自分自身のオブジェクトのメンバ変数を保存する）である。
【００２９】
図６に示すように、プロシージャ内変数保存用コード追加手段１０２は、メンバ保存用メソッド追加手段１０１からメンバ保存用メソッド追加済みソースコードを受けとり、対象となるソースコードそれぞれについて、公開メソッドとイベントプロシージャを検索する（ステップ６０１）。イベントプロシージャが見つかったら、図７に示すように、そのプロシージャ名とイベント名を保存するコードと、そのオブジェクトのメンバ変数の値を保存するコード７０１をイベントプロシージャに追加する（ステップ６０２）。公開メソッドが見つかったら、図７に示すように、まず、メソッド引数保存開始インターフェースを呼び出すコード７０２を記述する（ステップ６０３）。次に、メソッド呼び出しの引数を保存するコード７０３を追加する（ステップ６０４）。コード７０３は図４の４０２と同じである。引数が基本データ型であれば、そのまま引数の値を保存するためのコードを追加し、引数がオブジェクトであれば、そのオブジェクトのメンバ変数保存用メソッドを呼び出すコードを追加する。次にメソッド引数保存終了インターフェースを呼び出すコード７０４を追加する（ステップ６０５）。引数がなければ、メソッド引数保存開始インターフェース呼び出しコード７０２の直後にメソッド引数保存終了インターフェースを呼び出すコード７０４が追加される。次に、メソッド呼び出し時のオブジェクトの値を保存するコード７０６を追加する（ステップ６０６）。
【００３０】
プロシージャ内メンバ変数保存用コード追加手段１０２では、以上の処理をすべてのソースファイルのすべてのイベントプロシージャおよびメソッドに対して行う。
【００３１】
スタートアップシステムは、上記のようにメンバ保存用メソッド追加手段１０１とプロシージャ内変数保存用コード追加手段１０３により、オブジェクト値を保存するコードを順次追加することによって、オブジェクト値履歴取得手段１０８がデバッグに必要な情報を得るためのソースコードを埋め込んだ新しいソースコードを生成し、デバッグ情報取得用ソースコード記憶手段１１４に格納する。
【００３２】
次に、実行時システムについて説明する。実行時システムは、前記スタートアップシステムが生成したデバッグ情報取得用ソースコード記憶手段１１４に格納されているソースコードをコンパイルし、デバッグ用にビルドしたアプリケーション１１５を実行することで動作する。以下、図２のフローチャートを再度参照しながら、実行時システムについて説明する。
【００３３】
まず、アプリケーションを実際にテストするステップ２０１に関係するユーザ操作取得手段１０５、操作情報記憶手段１０６について説明する。ユーザ操作取得手段１０５は、ＯＳ１１６が提供するメッセージ取得用ＡＰＩを利用することで操作メッセージを取得する。記録すべき操作であるか否かは以下の基準によって判断する。すなわち、取得を開始してから最初に操作されたウインドウに関連するアプリケーションが操作を記録すべきアプリケーション１１７であるとみなし、最初に操作されたウインドウおよびそのウインドウ自身を親またはオーナーとするすべてのウインドウへ送られる操作メッセージを記録すべき操作であるとみなす。ユーザ操作取得手段１０５はそのようにして記録が必要であると判断したメッセージとそのメッセージに付随するパラメータを、操作を一意に識別する名前とともに操作情報記憶手段１０６に格納する。操作を一意に識別する名前はユーザが指定することができ、指定された名前が操作情報記憶手段１０６中に含まれていれば、ユーザ操作取得手段１０５は再度名前の指定をユーザに対して促す。
【００３４】
図８は操作情報記憶手段１０６内の操作情報記憶テーブルを示す。図８に示すように、操作情報記憶テーブル８０１は、操作を一意に識別するための操作名を記憶する操作名記憶領域８０２と、アプリケーションの操作中にユーザ操作取得手段１０５によって取得された操作メッセージを記憶する操作メッセージ情報記憶領域８０３から構成される。
【００３５】
ステップ２０２についてはスタートアップシステムで説明済みであるので、次に、ステップ２０３、２０４に関係するユーザ操作再生手段１０７、オブジェクト値履歴取得手段１０８、オブジェクト値履歴記憶手段１０９について説明する。
【００３６】
ユーザ操作再生手段１０７は、操作情報記憶手段１０６に格納された操作の再生と、操作対象アプリケーション１１５または１１７の終了メッセージを監視する機能を有する。ユーザ操作再生手段１０７は、ＯＳ１１６が提供するメッセージ送信用ＡＰＩを利用することによって操作を再生する。ユーザ操作再生手段１０７は、ユーザによって起動されると、ユーザに対して再生する操作の名前と操作によって記録される履歴の名前を問い合わせる。ユーザから操作名と履歴名を受け取ると、ユーザ操作再生手段１０７は、操作情報記憶手段１０６中の該当する名前をもつ操作情報を検索し、オブジェクト値履歴取得手段１０８に対して操作を開始する操作名および履歴名を通知し、デバッグ用アプリケーション１１５を起動する。次に、操作情報記憶手段１０６に格納されている指定された名前をもつ操作情報を時系列に順次読み出して、メッセージ送信用ＡＰＩに渡し、アプリケーション１１５を操作する。アプリケーション１１５への操作が再生されることにより、オブジェクト値保存機能呼び出しコード追加手段１０３によって追加されたコードが実行され、オブジェクト値履歴取得手段１０８が起動され、不具合を起こした操作を行ったときのアプリケーションの内部のオブジェクトの履歴がオブジェクト値履歴記憶手段１０９に保存される。
【００３７】
ユーザ操作再生手段１０７は、操作の再生を完了すると、アプリケーション１１５に対して終了メッセージが発行されるのを待つ。ユーザ操作再生手段１０７はアプリケーション１１５が終了メッセージを発行するか、操作再生終了から予め定められた待機時間を経過したのを検出すると、オブジェクト値履歴取得手段１０８に対して、アプリケーション１１５の操作の再生が完了したことを通知する。
【００３８】
次に、オブジェクト値履歴取得手段１０８について説明する。オブジェクト値履歴取得手段１０８は、デバッグ用アプリケーション１１５から独立した別プロセスの外部コンポーネントとして動作し、指定された型の変数またはオブジェクトを受け取ってその値とログ番号をオブジェクト値履歴記憶手段１０９に格納する。以下にオブジェクト値履歴取得手段１０８の詳細を説明する。
【００３９】
図９はオブジェクト値履歴取得手段１０８の構成図である。オブジェクト値履歴取得手段１０８は、オブジェクト値履歴取得処理を制御するオブジェクト値履歴取得部９０１と、次のログのログ番号を記憶しているログカウンタ９０２と、最後にメンバ変数や引数の値を記憶したクラスおよびそのメソッド名を記憶する最終セーブメソッド名レジスタ９０３と、型名とそのサイズを記憶している型サイズテーブル９０４と、現在再生されている操作の操作名を記憶する操作名レジスタ９１３、同じく履歴名を記憶する履歴名レジスタ９１４、オブジェクト値履歴記憶手段１０９に格納するデータを置くための出力レジスタ９０５から構成される。ログカウンタ９０２が保持するログ番号は実行順序順でのオブジェクトが取得された順番を示す。オブジェクトのメンバ変数値を保存する際にはすべてのメンバ変数履歴に同じログ番号が振られる。出力レジスタ９０５は、その変数がどの操作のどの履歴として取得されたデータであるかを示すための一意な操作名を記憶するための操作名部９１２および履歴名部９１５と、その変数が全体で何番目のログとして記録されたのかを格納するためのログ番号部９０６と、どのクラスのどのメソッドの実行によってオブジェクト値が保存されたのかを格納するためのクラスおよびメソッド名部９０７と、どのクラスの何のメンバ変数が保存されたのかを格納するためのクラスおよびメンバ名部９０８とそのメンバの型名を格納する型名部９０９とそのオブジェクトがメソッドの引数として保存されるのかどうかを格納する引数フラグ部９１０と実際のデータを格納するデータ部９１１と、その履歴がどの操作によって採取された履歴であるかを示す操作名部９１２からなる。
【００４０】
オブジェクト値履歴取得手段１０８は、インスタンス化と同時にログカウンタ９０２、最終セーブメソッド名レジスタ９０３、操作名レジスタ９１３、履歴名レジスタ９１４、出力レジスタ９０５をクリアする。次に、ユーザ操作再生手段１０７から操作名と履歴名の通知を受けると、操作名レジスタ９１３に操作名を、履歴名レジスタ９１４に履歴名を記録し、オブジェクト履歴記憶手段１０９に対して、指定された操作名と履歴名を持つテーブルを生成するように指示する。
【００４１】
次に、アプリケーション１１５への操作再生により、イベントが発生すると、スタートアップシステムによりイベントプロシージャに埋め込まれたコードが実行され、図７に示すオブジェクト値履歴取得手段１０８のイベント発生時用インターフェース７０５が呼び出される。イベント発生時用のインターフェース７０５が呼び出されると、オブジェクト値履歴取得手段１０８は、インターフェースの引数を解析し、どのメソッドが何のイベントに呼び出されたのかを把握する。次にクラス名およびメソッド名を最終セーブメソッド名レジスタ９０３に設定する。次にメンバ変数保存用メソッドである図７のＤｕｍｐメソッド７０６が実行されると、図４に示すようにオブジェクトのメンバ変数を保存するために変数値保存用インターフェース４０２が呼び出される。変数値保存用インターフェース４０２が呼び出されると、オブジェクト値履歴取得手段１０８は、そのインターフェースの引数から、どのクラスの何のメンバを何の型で保存するべきかを調べる。すなわち、型サイズテーブル９０４から、引数で渡される実際の値の持つサイズを取得し、引数で渡された値を指定の型のデータ値として解釈し、出力レジスタ９０５のクラスおよびメンバ名、型名、データに設定する。次に、最終セーブメソッド名レジスタ９０３からクラスおよびメソッド名を取り出し、出力レジスタ９０５に設定する。次に、ログカウンタ９０２から現在のログ番号を取り出して出力レジスタ９０５のログ番号部９０６に設定する。次に出力レジスタ９０５の引数フラグ部９１０をリセットし、出力レジスタ９０５の内容をオブジェクト値履歴記憶手段１０９に格納する。次に、ログカウンタ増加用インターフェース７０７が呼び出されると、オブジェクト値履歴取得手段１０８は、そのイベントプロシージャでのメンバ変数の保存が完了したとして出力レジスタ９０５と最終セーブメソッド名レジスタ９０３をクリアし、ログカウンタ９０２の値を１増やす。出力レジスタ９０５をクリアするときには、引数フラグ部９１０をリセットする。
【００４２】
以上のようにして、オブジェクト値履歴取得手段１０８はイベントプロシージャの実行とそのときのオブジェクトの値を保存する。
【００４３】
また、デバッグ用アプリケーション１１５の実行により、あるオブジェクトのメソッドが実行されると、スタートアップシステムにより、メソッドに埋め込まれたコード４０２が実行され、図７に示すオブジェクト値保存機能のメソッド実行時用インターフェース７０２が呼び出される。メソッド実行時用インターフェース７０２が呼び出されると、オブジェクト値履歴取得手段１０８は、インターフェース７０２の引数を解析し、どのメソッドが呼び出されたのかを把握する。次にクラス名およびメソッド名最終セーブメソッド名レジスタ９０３にメソッド名を設定し、出力レジスタ９０５の引数フラグ部９１０をセットする。図７に示すように基本データ型を保存するための変数値保存用インターフェース７０３が実行されると、オブジェクト値履歴取得手段１０８は、そのインターフェース７０３の引数から、メソッドの引数をどのクラスのオブジェクトとして保存するべきかを調べる。型サイズテーブル９０４から、引数で渡される実際の値の持つサイズを取得し、引数で渡された値を指定の型のデータ値として解釈し、出力レジスタ９０５のクラスおよびメンバ名、型名、データに設定する。次に、最終セーブメソッド名レジスタ９０３からクラスおよびメソッド名を取り出し、出力レジスタ９０５に設定する。次に、ログカウンタ９０２から現在のログ番号を取り出して出力レジスタ９０５のログ番号部９０６に設定し、出力レジスタ９０５の内容をオブジェクト値履歴記憶手段１０９に格納する。その際出力レジスタ９０５の引数フラグ部９１０はセットされたままになっており、そのオブジェクトのメンバ変数が引数として保存されたこと示すようにオブジェクト値履歴記憶手段１０９に保存される。もし、引数があるクラスのオブジェクトである場合は、図７に示すようにそのクラスのメンバ変数をダンプするコード７０８が埋め込まれており、そのコードの実行によって引数となっているオブジェクトのメンバ変数がオブジェクト値履歴記憶手段１０９に保存される。次に、メソッド引数保存終了インターフェースを呼び出すコード７０４が実行されると、オブジェクト値履歴取得手段１０８は出力レジスタ９０５の引数フラグ部９１０をリセットする。次にメンバ変数保存用メソッドである図７のＤｕｍｐメソッド７０８が実行されると、図４に示すようにオブジェクトのメンバ変数を保存するために変数値保存用インターフェース４０２が呼び出される。変数値保存用インターフェース４０２が呼び出されると、オブジェクト値履歴取得手段１０８は、そのインターフェース４０２の引数から、どのクラスの何のメンバを何の型で保存するべきかを調べる。型サイズテーブル９０４から、引数で渡される実際の値の持つサイズを取得し、引数で渡された値を指定の型のデータ値として解釈し、出力レジスタ９０５のクラスおよびメンバ名、型名、データに設定する。次に、最終セーブメソッド名レジスタ９０３からクラスおよびメソッド名を取り出し、出力レジスタ９０５に設定する。次に、ログカウンタ９０２から現在のログ番号を取り出して出力レジスタ９０５のログ番号部９０６に設定する。次に出力レジスタ９０５の引数フラグ部９１０をリセットし、出力レジスタ９０５の内容をオブジェクト値履歴記憶手段１０９に格納する。次に、ログカウンタ増加用インターフェースが呼び出されると、オブジェクト値履歴取得手段１０８は、そのメソッドでのメンバ変数の保存が完了したとして出力レジスタ９０５と最終セーブメソッド名レジスタ９０３をクリアし、ログカウンタ９０２の値を１増やす。出力レジスタ９０５をクリアするときには、引数フラグ部９１０をリセットする。
【００４４】
以上のようにして、オブジェクト値履歴取得手段１０８はメソッドの実行とそのときのオブジェクトの値を保存する。
【００４５】
オブジェクト値履歴取得手段１０８は、ユーザ操作再生手段１０７から操作の再生終了の通知を受けると、ログカウンタ９０２、最終セーブメソッド名レジスタ９０３、操作名レジスタ９１３、履歴名レジスタ９１４、出力レジスタ９０５をクリアする。
【００４６】
次に、オブジェクト値履歴記憶手段１０９について説明する。オブジェクト値履歴記憶１０９は、オブジェクト値履歴取得手段１０８内の出力レジスタ９０５を複数個含むテーブルを、操作名、履歴名ごとに含んでいる。オブジェクト値履歴記憶手段１０９は、オブジェクト値履歴取得手段１０８から、指定された操作名および履歴名のテーブル作成の指示を受けると、指定された操作名および履歴名で識別される、オブジェクト値履歴取得手段１０８内の出力レジスタ９０５の構造を１要素とする可変個の要素を格納可能なテーブルを用意する。次にオブジェクト値履歴取得手段１０８から出力レジスタ９０５の内容の格納指示を受けると、出力レジスタ９０５内の操作名部９１２と履歴名部９１５の内容から格納すべきテーブルを特定し、出力レジスタ９０５の内容を新しい要素としてテーブルの最後に追加する。
【００４７】
次に、オブジェクト値履歴比較手段１１０、オブジェクト状態一覧取得手段１１２について説明する。オブジェクト値履歴比較手段１１０では、オブジェクト値履歴記憶手段１０９に記憶されている複数のオブジェクト値履歴を比較する。比較は二つの履歴中の同じログ番号同士のデータを突き合わせることで行い、違いを検出した部分のログ番号、クラスおよびメソッド名、メンバ変数名を表示・出力手段１１３に出力する。これにより、アプリケーション１１５に修正を加えた場合にどこの何時の状態が変化したかを、また、何らの変化もおきていないことを確認できる。
【００４８】
図１０にオブジェクト値履歴比較手段１１０の比較結果を表示・出力手段１１３によって出力した例を示す。結果欄の記号ＮＭは値が一致していないことを表し、記号ＷＲは実行順序が変わってしまい、対応するログがないことを示す。オブジェクト値履歴比較手段１１０は、対応するログがなくなった場合、値以外の情報が一致するログを比較先履歴から検索し、その間の履歴については実行順序が変わったとみなして記号ＷＲを結果欄に出力するよう表示・出力手段１１３に指示する。このようにすることで、デグレードチェックなどで、ユーザがプログラムの実行経路が変化したり値が変わったりしていないか確認することを容易にする。
【００４９】
次に、オブジェクト状態一覧取得手段１１２について説明する。オブジェクト状態一覧取得手段１１２は、オブジェクト値履歴記憶手段１０９に記憶されているある履歴中に含まれる、あるクラスのオブジェクトが履歴取得時点でとったすべての状態の一覧を作成する。まず、オブジェクト値履歴記憶手段１０９中のある履歴中に含まれるログで、特定のクラス名を持つものを列挙する。次にメンバ変数定義情報テーブル１１１からその定義域を調べ、列挙したオブジェクト値のうちで、定義域から外れたものを列挙する。
【００５０】
図１１にオブジェクト状態一覧取得手段１１２による状態一覧を表示・出力手段１１３によって出力した例を示す。結果欄の記号ＯＲは値が正当な範囲に入っていないことを示す。
【００５１】
次に正当な値にあるかどうか判断するのに使用するメンバ変数定義情報テーブル１１１について説明する。メンバ変数定義情報テーブル１１１はクラスのメンバ変数ごとに、型名とその仕様上正当な値の範囲をリストにして保持している。履歴中の値が正当かどうかを判断するときは、仕様上正当な値の範囲のリストの各要素について、その要素が示す値の範囲内に履歴中の値が含むかどうかを判定する。数値に基づく変数は数値比較によって範囲内にあるか判定し、文字列であれば辞書順比較で判定する。上記のようにして、不良の原因となりうる、不正なオブジェクトの値を検出し、デバッグ作業を支援する。
【００５２】
次に表示・出力手段１１３について説明する。表示・出力手段１１３は前記オブジェクト値履歴比較手段１１０やオブジェクト状態一覧取得手段１１２の出力を整形して表示・出力したり、オブジェクト値履歴記憶手段１０９中のデータを検索して表示出力したり、そのまま表示出力したりする。表示形式はオブジェクト値履歴取得手段１０８から出力レジスタ９０５の構造でオブジェクト値履歴記憶手段１０９の内容を列挙したものである。
【００５３】
【発明の効果】
以上の説明から明らかなように、本発明によれば次のような効果が得られる。
(１)  不具合が起きたときのユーザの操作を正確に記録し、デバッグの際に再生することで、不具合が発生したときの操作を正確に再現できる。これにより、不具合を確認するための操作の誤解を防止し、何度も同じ操作を正確に繰り返すことによる労力を軽減できる。
(２)  不具合の発生した操作を正確に再現し、それによって動作している最中のアプリケーションの状態をイベント発生時やメソッド実行時に履歴として記録するため、その履歴を閲覧することにより、何の操作が行われたときにどのような不良が発現して不具合となったのかの原因の見当をつけることを容易にできる。
(３)  クラスのメンバ変数が仕様上取りうる定義域と実際に記録されたオブジェクトのメンバ変数の値とを比較することで、異常な値が何の操作またはどのタイミングで発生しているかを知ることができる。これもまたデバッグの際の原因究明作業にかかる労力を軽減できる。
【図面の簡単な説明】
【図１】本発明によるオブジェクト指向開発用デバッグ支援装置の一実施形態のブロック図である。
【図２】図１の全体的動作を示す大まかなフローチャートである。
【図３】図１のメンバ保存用メソッド追加手段の動作を示すフローチャートである。
【図４】メンバ保存用メソッド追加手段が行うソースの加工例を示す図である。
【図５】図１のメンバ変数保存用メソッド名テーブルの構造図である。
【図６】図１のプロシージャ内変数保存用コード追加手段の動作を示すフローチャートである。
【図７】プロシージャ内変数保存用コード追加手段が行うソースの加工例を示す図である。
【図８】図１の操作情報記憶の構造図である。
【図９】図１のオブジェクト値履歴取得手段の構成図である。
【図１０】図１のオブジェクト履歴比較手段の出力例を示す図である。
【図１１】図１のオブジェクト状態一覧作成手段の出力例を示す図である。
【符号の説明】
１０１  メンバ保存用メソッド追加手段
１０２  プロシージャ内変数保存用コード追加手段
１０３  オブジェクト値保存機能呼び出しコード追加手段
１０４  メンバ変数保存用メソッド各テーブル
１０５  ユーザ操作取得手段
１０６  操作情報記憶手段
１０７  ユーザ操作再生手段
１０８  オブジェクト値履歴取得手段
１０９  オブジェクト値履歴記憶手段
１１０  オブジェクト履歴比較手段
１１１  メンバ変数定義域情報テーブル
１１２  オブジェクト状態一覧作成手段
１１３  表示、出力する手段
１１４  デバッグ情報取得用ソースコード記憶手段
１１５  デバッグ用アプリケーション
１１７  テスト対象アプリケーション
１１８  オリジナルソースコード
【図１】
0003698974.tif 000002
【図２】
0003698974.tif 000003
【図３】
0003698974.tif 000004
【図４】
0003698974.tif 000005
【図５】
0003698974.tif 000006
【図６】
0003698974.tif 000007
【図７】
0003698974.tif 000008
【図８】
0003698974.tif 000009
【図９】
0003698974.tif 000010
【図１０】
0003698974.tif 000011
【図１１】
0003698974.tif 000012