トップ :: G 物理学 :: G06 計算;計数




【発明の名称】 オブジェクト指向開発用デバッグ支援装置
【発明者】 【氏名】渡邊 浩樹

【要約】 【課題】オブジェクト指向言語を使用したイベントドリブンなアプリケーションのデバッグ作業の労力を軽減する。

【解決手段】ユーザが行った操作とアプリケーション内のオブジェクトの値の履歴とを取得する手段108、操作と値の履歴とを関連付けて保存する手段109、同一の操作に対して取得した複数のオブジェクトの履歴同士を比較して差異を検出する手段110、履歴中のオブジェクトの状態の一覧を生成し、クラスのメンバの値の仕様上の定義域と、実際に取得された値とを比較し、定義域外に外れている状態を検出する手段110などを備える。
【特許請求の範囲】
【請求項1】 オブジェクト指向言語を使用したアプリケーションの開発のデバッグ作業を支援する装置において、ユーザが行った操作とアプリケーション内のオブジェクトの値の履歴とを取得する手段と、前記操作とオブジェクトの値の履歴とを関連付けて保存する手段と、前記関連付けて保持された操作とオブジェクトの値の履歴を表示・出力する手段とを有することを特徴とするオブジェクト指向開発用デバッグ支援装置。
【請求項2】 請求項1記載のオブジェクト指向開発用デバッグ支援装置において、ユーザが行った操作の操作情報を記憶する手段と、前記記憶された操作情報に基づいてユーザの操作を再生してアプリケーションを操作する手段を有し、最初にユーザが行った操作とまったく同一の操作で何回でもデバッグ実行を行い、オブジェクトの値を取得することを特徴とするオブジェクト指向開発用デバッグ支援装置。
【請求項3】 請求項1、2記載のオブジェクト指向開発用デバッグ支援装置において、同一の操作に対して取得した複数のオブジェクトの履歴同士を比較し差異を検出する手段と、履歴中のオブジェクトの状態の一覧を生成し、クラスごとに予め定義されたメンバ変数の定義域と、実際に取得された値とを比較し、定義域外に外れている状態を検出する手段とを有することを特徴とするオブジェクト指向開発用デバッグ支援装置。
【請求項4】 請求項1、2、3記載のオブジェクト指向開発用デバッグ支援装置において、クラスのメンバを認識し、そのメンバの値を取り出すためのアクセサを自動生成する手段と、クラスのメソッドを認識し、メソッド呼び出し時点での、メソッドへの引数の値およびメンバ変数およびメソッド内で作成された自動変数の値を保存するためのコードを生成する手段と、前記生成されたコードを記憶する手段とを有し、前記記憶されたコードによりデバッグ用アプリケーションを生成することを特徴とするオブジェクト指向開発用デバッグ支援装置。
【発明の詳細な説明】【0001】
【発明の属する技術分野】本発明は、オブジェクト指向言語を使用したイベントドリブンなアプリケーションなどの開発でのデバッグ作業を支援するオブジェクト指向開発用デバッグ支援装置に関する。
【0002】
【従来の技術】プログラムの開発においてデバッグのための情報を得る従来からの技術としてトレーサがある。これはプログラムが実行した経路を記録しつつ、指定した変数の値を監視して、実行経路や変数の値を表示/出力するものであるが、オブジェクト指向言語を使用したアプリケーションなどにおけるオブジェクトの内容を保存する機能はない。
【0003】また、最近のオブジェクト指向言語を使用したアプリケーションのデバッグ支援環境では、ステップの実行をしながらオブジェクトのメンバ変数の値を表示する機能をもつものもあるが、履歴が残らないため、何度もデバッグ実行を繰り返す必要がある。
【0004】なお、ユーザがアプリケーションに対して行った操作を取得できる技術としては、例えば特開平10−275093号公報「プログラムテスト支援装置」に記載の技術があるが、アプリケーションの内部の状態を確認できないため、デバッグ支援に適用するのは難しい。
【0005】
【発明が解決しようとする課題】近年、オブジェクト指向言語の普及により、アプリケーションが複数のオブジェクトやコンポーネント間のメッセージのやり取りで動作するようになってきている。そのため、デバッグの際には、問題のあるオブジェクトだけを取り出して振る舞いを調べることはできず、関連するオブジェクトも含めてデバッグを行う必要がある。
【0006】一般に多数のオブジェクトの相互作用で動作しているアプリケーションにおいては、アプリケーションの不具合は、あるオブジェクトが異常な値をとることによってその影響が伝播し、最終的に外部からわかる異常となって現れるものである場合が多く、このような場合、デバッグの際にはオブジェクト自身の値だけでなく、そのオブジェクトに関連する変数やオブジェクトの値も調べる必要がある。しかし、従来からのトレーサやステップ実行では、実行経路を監視したり、実行中に指定した変数の値を抽出することはできるが、実行経路に沿って、あるオブジェクトに関連する変数やオブジェクトの値、またはそのオブジェクト自身の値を一度に抽出することはできない。このような場合、従来のトレーサやデバッグ支援環境では、不具合が発生した個所の特定から不具合の原因を突き止めるまでに、その都度監視する対象を変えながら、何回もデバッグ実行を繰り返す必要がある。場合によっては、ステップ実行をおこなって目視でオブジェクトや変数の値の確認を行うという、長時間にわたって継続的な緊張をデバッグ担当者に強いる作業を何回も繰り返さなければならないという問題点があった。
【0007】また、GUI(Graphical User Interface)ベースの所謂イベントドリブンなアプリケーションにおいては、処理の実行にはユーザの操作が必要であるため、バッチ処理のように同じ入力パラメータを与えて自動で実行させることができない。そのため、デバッグ中やデバッグ完了後のデグレードチェックも含めて、同一の操作を何回も正確に手動で繰り返し、アプリケーションの動作を確認しなくてはならないという問題もある。
【0008】本発明の目的は、オブジェクト指向言語を使用したイベントドリブンなアプリケーションなどの開発において、何度も同じ条件で実行しなければならない長時間の緊張を強いるデバッグ作業の実施回数の削減と、修正後のアプリケーションの動作が正しいか確認するデグレードチェック作業にかかる作業の労力の削減と、1回のデバッグ作業そのものにかかる労力の削減などを実現するオブジェクト指向開発用デバッグ支援装置を提供することにある。
【0009】
【課題を解決するための手段】本発明のオブジェクト指向開発用デバッグ支援装置は、ユーザが行った操作と、アプリケーション内のオブジェクトの値の履歴とを取得する手段、操作と値の履歴とを関連付けて保存する手段、同一の操作に対して取得した複数のオブジェクトの履歴同士を比較して差異を検出する手段、履歴中のオブジェクトの状態の一覧を生成し、クラスのメンバの値の仕様上の定義域と、実際に取得された値とを比較し、定義域外に外れている状態を検出する手段、オブジェクト履歴比較結果やオブジェクト状態一覧などを表示・出力する手段等を有することを特徴とする。
【0010】
【発明の実施の形態】以下に、本発明の一実施の形態を図面を参照して具体的に説明する。図1は、本発明によるオブジェクト指向開発用デバッグ支援装置の一実施の形態の構成例を示すブロック図である。図1において、116は後述のスタートアップシステムや実行時システムおよびテスト、デバッグ対象のアプリケーションが動作するOSである。118はオリジナルソースコード、117はオリジナルソースコードをビルドして作られたテスト対象アプリケーション、115は後述のデバッグ情報取得用ソースコード記憶手段114に保存されたソースコードをビルドして作られるデバッグ用アプリケーションである。線100で囲った部分が本発明を実施する部分であり、以下の構成からなる。
【0011】101はオリジナルソースコード118のクラスまたはモジュールのコードを解析して、データメンバまたはモジュールレベル変数またはオブジェクトを検出し、クラスまたはモジュールにそれらのデータメンバまたはモジュールレベル変数の値を保存するためのメンバ保存用メソッドを追加するメンバ保存用メソッド追加手段である。102はイベントプロシージャやメソッドを解析して、プロシージャ引数およびオブジェクトのデータメンバおよびモジュールレベル変数の値を保存するためのメンバ保存用メソッドを呼び出すコードを追加するプロシージャ内メンバ変数保存用コード追加手段である。103は実行時システムのオブジェクト値保存機能を呼び出すコードを追加するオブジェクト値保存機能呼び出しコード追加手段103である。104はメンバ保存用メソッド追加手段101がどのソースコードにどの名前のメンバ保存用メソッドを追加したかを記憶するメンバ保存用メソッド名テーブル104である。114はメンバ保存用メソッド追加手段101およびプロシージャ内変数保存用コード追加手段102およびオブジェクト値保存機能呼び出しコード追加手段103によって加工されたソースファイルを記憶しておくデバッグ情報取得用ソースコード記憶手段である。
【0012】105はユーザがアプリケーションに対して行った操作を取得するユーザ操作取得手段である。106はユーザ操作取得手段105によって取得された操作を記憶する操作情報記憶手段である。107は操作情報記憶106手段に格納された操作情報に基づいて、デバッグ用アプリケーション115に対しユーザの操作を再現するユーザ操作再生手段である。108はデバッグ用アプリケーション115から指定された変数またはオブジェクトの値を取得するオブジェクト値履歴取得手段である。109はオブジェクト値履歴取得手段108によって取得された変数またはオブジェクトの値を記憶するオブジェクト値履歴記憶手段である。110はオブジェクト値履歴記憶手段109の内容を用いて、二つあるいはそれ以上のオブジェクト値の履歴を比較するオブジェクト履歴比較手段である。111はあらかじめクラスごとに定義されたクラスのメンバの定義情報を格納したメンバ変数定義域情報テーブルである。112はオブジェクト値履歴記憶手段109の内容からあるクラスのすべてのオブジェクトがとった状態の一覧を作成し、メンバ変数定義域情報テーブル111内に格納されているメンバ変数の定義域と実際に取得したオブジェクトの値を比較し、不正な値が設定されている状態を検出するオブジェクト状態一覧作成手段である。113はオブジェクト履歴比較手段110とオブジェクト状態一覧作成手段112の出力を表示・出力したり、オブジェクト値履歴記憶手段109内の情報を検索、一覧表示・出力する、表示・出力手段である。
【0013】図1中、スタートアップシステムは、メンバ保存用メソッド追加手段101、、プロシージャ内変数保存用コード追加手段102、オブジェクト値保存機能呼び出しコード追加手段103、メンバ変数保存用メソッド名テーブル104、デバッグ情報取得用ソースコード記憶手段114から構成される。
【0014】実行時システムは、ユーザ操作取得手段105、操作情報記憶手段106、ユーザ操作再生手段107、オブジェクト値履歴取得手段108、オブジェクト値履歴記憶手段109、オブジェクト履歴比較手段110、メンバ変数定義域情報テーブル111、オブジェクト状態一覧作成手段112、表示・出力部113から構成される。
【0015】スタートアップシステムは、デバッグ開始時に一度だけ実行されて、ソースコードを加工し、実行時システムはデバッグ中に動作する。
【0016】図2は、スタートアップシステムに含まれる各手段と、実行時システムに含まれる各手段を用いてデバッグする際のおおまかなフローチャートを示したものである。まず、このフローチャートを用いて、図1の全体の処理の流れを説明する。
【0017】図2に示すように、まず、アプリケーション117のテストを行う際に、予め実行時システムのユーザ操作取得手段105により、ユーザがアプリケーション117に対して行った操作を取得し、操作情報記憶手段106に保存しておく(ステップ201)。テストで不具合が発生したら、スタートアップシステムのメンバ保存用メソッド追加手段101、プロシージャ内変数保存用コード追加手段102、オブジェクト値保存機能呼び出しコード追加手段103、メンバ変数保存用メソッド名テーブル104により、新しくデバッグ用のソースコードをデバッグ情報取得ソースコード記憶手段114に生成し、デバッグ用アプリケーション115をビルドする(ステップ202)。この間のスタートアップシステムの動作については後で詳細に説明する。
【0018】次に、実行時システムの操作情報記憶手段106から、不具合が確認された操作情報を取り出し、ユーザ操作再生手段107により、取り出された操作情報を再生し、デバッグ用アプリケーション115を操作する(ステップ203)。このとき、スタートアップシステムによって追加されたコードが実行され、オブジェクト値がオブジェクト値履歴取得手段108によってオブジェクト値履歴記憶手段109に保存される(ステップ204)。次に、オブジェクト値履歴記憶手段109の内容をオブジェクト履歴比較手段110、オブジェクト状態一覧作成手段112によって調査し、アプリケーションをデバッグする(ステップ205)。デバッグ後、アプリケーションに対して、操作情報をユーザ操作再生手段107によって再生してアプリケーションを実行し(ステップ206)、不具合が発生しないことを確認する。もしまだ不具合が発生するのであれば、再びオブジェクト値履歴記憶手段109の内容をオブジェクト履歴比較手段110、オブジェクト状態一覧作成手段112によって調べ、デバッグする(ステップ206に戻る)。
【0019】以上のようにして、図1に示す本システムはオブジェクト指向言語を使用したイベントドリブンなアプリケーションのデバッグ作業を支援する。
【0020】次に、スタートアップシステムについて詳細に説明する。図3はメンバ保存用メソッド追加手段101の動作を示すフローチャートである。図4はJava言語で記述されたあるクラスについて、スタートアップシステムのメンバ保存用メソッド追加手段101を実行して得られる新しいソースコードの例である。
【0021】図4中、401がメンバ保存用メソッド追加手段101によって追加される有効なソースコードであり、402が変数またはオブジェクトのメンバ変数を保存するためのオブジェクト値履歴取得手段108の変数保存用インターフェースである。
【0022】図3に示すように、メンバ保存用メソッド追加手段101は、まず、対象となるすべてのソースファイルについて、バックアップを作成する(ステップ301)。次に対象ソースファイルに、そのソースファイルにある既存のメソッド名と重複しない名前で、空のメンバ保存用メソッドを追加する(ステップ302)。追加するごとにメンバ変数保存用メソッド名テーブル104に当該ソースファイル名と作成したメソッド名を記入する(ステップ303)。図5にメンバ変数保存用メソッド名テーブル104の構造を示す。
【0023】次に、メンバ保存用メソッド追加手段101は、おのおののソースファイル118について、そのソースファイルがクラスであるかモジュールであるか判断する(ステップ304)。クラスであった場合、クラスのメンバ変数を調べる(ステップ305)。基本データ型に属するデータメンバであれば、そのデータ型に応じたデータを保存するためにオブジェクト値保存機能呼び出しコード追加手段103を呼び出して、そのソースファイルのメンバ保存用メソッド内にそのメンバ変数の値を保存するためのコードを追加する(ステップ306)。クラスのメンバ変数があるクラスのオブジェクトであった場合は、メンバ変数保存用メソッド名テーブル104から、そのクラスのメンバ保存用メソッド名を特定し、メンバを保存するメソッドを呼び出すコードを追加する(ステップ307)。
【0024】以上のようにして、メンバ変数があるクラスのオブジェクトであっても再帰的にメンバ保存用メソッドを呼び出してデータメンバの値を保存する機能を実現する。
【0025】次に、メンバ保存用メソッド追加手段101は、ソースファイル118がモジュールであった場合、そのモジュール内のモジュールレベル変数を調べる(ステップ308)。基本データ型に属するモジュール変数であれば、そのデータ型に応じたデータを保存するためにオブジェクト値保存機能呼び出しコード追加手段103を呼び出して、メソッド内にそのメンバ変数の値を保存するためのコードを追加する(ステップ309)。モジュール変数が、あるクラスのオブジェクトであった場合は、そのクラスのメンバ保存用メソッドを呼び出すコードを追加する(ステップ310)。
【0026】以上のようにして、モジュール変数があるクラスのオブジェクトであっても再帰的にメンバ保存用メソッドを呼び出してデータメンバの値を保存する機能を実現する。
【0027】図6はプロシージャ内変数保存用コード追加手段の動作を示すフローチャートである。図7はJava言語で記述されたあるクラスについて、スタートアップシステムを実行して得られる新しいソースファイルの例である。
【0028】図7中、701はイベントプロシージャ名とイベント名の保存および、そのオブジェクト自身のメンバ変数の値を保存するためにイベントプロシージャに追加されるコード、702はメソッドの開始およびメソッド引数保存開始を宣言するためのオブジェクト値履歴取得手段108のインターフェース、703はメソッド呼び出しの引数を保存するためのオブジェクト値履歴取得手段108のインターフェース、704はメソッド引数保存の終了を宣言するためのオブジェクト値履歴取得手段108のインターフェース、705はイベントプロシージャ呼び出しが発生したことをオブジェクト値履歴取得手段108に通知するためのオブジェクト値履歴取得手段108のインターフェース、706はメンバ保存用メソッド追加手段101によって追加されるメンバ変数保存コード、707はログカウンタ902の値を1増やすためのオブジェクト値履歴取得手段108のインターフェース、708はメンバ保存用メソッド追加手段101によって追加されるメンバ変数保存用メソッド呼び出しコード(自分自身のオブジェクトのメンバ変数を保存する)である。
【0029】図6に示すように、プロシージャ内変数保存用コード追加手段102は、メンバ保存用メソッド追加手段101からメンバ保存用メソッド追加済みソースコードを受けとり、対象となるソースコードそれぞれについて、公開メソッドとイベントプロシージャを検索する(ステップ601)。イベントプロシージャが見つかったら、図7に示すように、そのプロシージャ名とイベント名を保存するコードと、そのオブジェクトのメンバ変数の値を保存するコード701をイベントプロシージャに追加する(ステップ602)。公開メソッドが見つかったら、図7に示すように、まず、メソッド引数保存開始インターフェースを呼び出すコード702を記述する(ステップ603)。次に、メソッド呼び出しの引数を保存するコード703を追加する(ステップ604)。コード703は図4の402と同じである。引数が基本データ型であれば、そのまま引数の値を保存するためのコードを追加し、引数がオブジェクトであれば、そのオブジェクトのメンバ変数保存用メソッドを呼び出すコードを追加する。次にメソッド引数保存終了インターフェースを呼び出すコード704を追加する(ステップ605)。引数がなければ、メソッド引数保存開始インターフェース呼び出しコード702の直後にメソッド引数保存終了インターフェースを呼び出すコード704が追加される。次に、メソッド呼び出し時のオブジェクトの値を保存するコード706を追加する(ステップ606)。
【0030】プロシージャ内メンバ変数保存用コード追加手段102では、以上の処理をすべてのソースファイルのすべてのイベントプロシージャおよびメソッドに対して行う。
【0031】スタートアップシステムは、上記のようにメンバ保存用メソッド追加手段101とプロシージャ内変数保存用コード追加手段103により、オブジェクト値を保存するコードを順次追加することによって、オブジェクト値履歴取得手段108がデバッグに必要な情報を得るためのソースコードを埋め込んだ新しいソースコードを生成し、デバッグ情報取得用ソースコード記憶手段114に格納する。
【0032】次に、実行時システムについて説明する。実行時システムは、前記スタートアップシステムが生成したデバッグ情報取得用ソースコード記憶手段114に格納されているソースコードをコンパイルし、デバッグ用にビルドしたアプリケーション115を実行することで動作する。以下、図2のフローチャートを再度参照しながら、実行時システムについて説明する。
【0033】まず、アプリケーションを実際にテストするステップ201に関係するユーザ操作取得手段105、操作情報記憶手段106について説明する。ユーザ操作取得手段105は、OS116が提供するメッセージ取得用APIを利用することで操作メッセージを取得する。記録すべき操作であるか否かは以下の基準によって判断する。すなわち、取得を開始してから最初に操作されたウインドウに関連するアプリケーションが操作を記録すべきアプリケーション117であるとみなし、最初に操作されたウインドウおよびそのウインドウ自身を親またはオーナーとするすべてのウインドウへ送られる操作メッセージを記録すべき操作であるとみなす。ユーザ操作取得手段105はそのようにして記録が必要であると判断したメッセージとそのメッセージに付随するパラメータを、操作を一意に識別する名前とともに操作情報記憶手段106に格納する。操作を一意に識別する名前はユーザが指定することができ、指定された名前が操作情報記憶手段106中に含まれていれば、ユーザ操作取得手段105は再度名前の指定をユーザに対して促す。
【0034】図8は操作情報記憶手段106内の操作情報記憶テーブルを示す。図8に示すように、操作情報記憶テーブル801は、操作を一意に識別するための操作名を記憶する操作名記憶領域802と、アプリケーションの操作中にユーザ操作取得手段105によって取得された操作メッセージを記憶する操作メッセージ情報記憶領域803から構成される。
【0035】ステップ202についてはスタートアップシステムで説明済みであるので、次に、ステップ203、204に関係するユーザ操作再生手段107、オブジェクト値履歴取得手段108、オブジェクト値履歴記憶手段109について説明する。
【0036】ユーザ操作再生手段107は、操作情報記憶手段106に格納された操作の再生と、操作対象アプリケーション115または117の終了メッセージを監視する機能を有する。ユーザ操作再生手段107は、OS116が提供するメッセージ送信用APIを利用することによって操作を再生する。ユーザ操作再生手段107は、ユーザによって起動されると、ユーザに対して再生する操作の名前と操作によって記録される履歴の名前を問い合わせる。ユーザから操作名と履歴名を受け取ると、ユーザ操作再生手段107は、操作情報記憶手段106中の該当する名前をもつ操作情報を検索し、オブジェクト値履歴取得手段108に対して操作を開始する操作名および履歴名を通知し、デバッグ用アプリケーション115を起動する。次に、操作情報記憶手段106に格納されている指定された名前をもつ操作情報を時系列に順次読み出して、メッセージ送信用APIに渡し、アプリケーション115を操作する。アプリケーション115への操作が再生されることにより、オブジェクト値保存機能呼び出しコード追加手段103によって追加されたコードが実行され、オブジェクト値履歴取得手段108が起動され、不具合を起こした操作を行ったときのアプリケーションの内部のオブジェクトの履歴がオブジェクト値履歴記憶手段109に保存される。
【0037】ユーザ操作再生手段107は、操作の再生を完了すると、アプリケーション115に対して終了メッセージが発行されるのを待つ。ユーザ操作再生手段107はアプリケーション115が終了メッセージを発行するか、操作再生終了から予め定められた待機時間を経過したのを検出すると、オブジェクト値履歴取得手段108に対して、アプリケーション115の操作の再生が完了したことを通知する。
【0038】次に、オブジェクト値履歴取得手段108について説明する。オブジェクト値履歴取得手段108は、デバッグ用アプリケーション115から独立した別プロセスの外部コンポーネントとして動作し、指定された型の変数またはオブジェクトを受け取ってその値とログ番号をオブジェクト値履歴記憶手段109に格納する。以下にオブジェクト値履歴取得手段108の詳細を説明する。
【0039】図9はオブジェクト値履歴取得手段108の構成図である。オブジェクト値履歴取得手段108は、オブジェクト値履歴取得処理を制御するオブジェクト値履歴取得部901と、次のログのログ番号を記憶しているログカウンタ902と、最後にメンバ変数や引数の値を記憶したクラスおよびそのメソッド名を記憶する最終セーブメソッド名レジスタ903と、型名とそのサイズを記憶している型サイズテーブル904と、現在再生されている操作の操作名を記憶する操作名レジスタ913、同じく履歴名を記憶する履歴名レジスタ914、オブジェクト値履歴記憶手段109に格納するデータを置くための出力レジスタ905から構成される。ログカウンタ902が保持するログ番号は実行順序順でのオブジェクトが取得された順番を示す。オブジェクトのメンバ変数値を保存する際にはすべてのメンバ変数履歴に同じログ番号が振られる。出力レジスタ905は、その変数がどの操作のどの履歴として取得されたデータであるかを示すための一意な操作名を記憶するための操作名部912および履歴名部915と、その変数が全体で何番目のログとして記録されたのかを格納するためのログ番号部906と、どのクラスのどのメソッドの実行によってオブジェクト値が保存されたのかを格納するためのクラスおよびメソッド名部907と、どのクラスの何のメンバ変数が保存されたのかを格納するためのクラスおよびメンバ名部908とそのメンバの型名を格納する型名部909とそのオブジェクトがメソッドの引数として保存されるのかどうかを格納する引数フラグ部910と実際のデータを格納するデータ部911と、その履歴がどの操作によって採取された履歴であるかを示す操作名部912からなる。
【0040】オブジェクト値履歴取得手段108は、インスタンス化と同時にログカウンタ902、最終セーブメソッド名レジスタ903、操作名レジスタ913、履歴名レジスタ914、出力レジスタ905をクリアする。次に、ユーザ操作再生手段107から操作名と履歴名の通知を受けると、操作名レジスタ913に操作名を、履歴名レジスタ914に履歴名を記録し、オブジェクト履歴記憶手段109に対して、指定された操作名と履歴名を持つテーブルを生成するように指示する。
【0041】次に、アプリケーション115への操作再生により、イベントが発生すると、スタートアップシステムによりイベントプロシージャに埋め込まれたコードが実行され、図7に示すオブジェクト値履歴取得手段108のイベント発生時用インターフェース705が呼び出される。イベント発生時用のインターフェース705が呼び出されると、オブジェクト値履歴取得手段108は、インターフェースの引数を解析し、どのメソッドが何のイベントに呼び出されたのかを把握する。次にクラス名およびメソッド名を最終セーブメソッド名レジスタ903に設定する。次にメンバ変数保存用メソッドである図7のDumpメソッド706が実行されると、図4に示すようにオブジェクトのメンバ変数を保存するために変数値保存用インターフェース402が呼び出される。変数値保存用インターフェース402が呼び出されると、オブジェクト値履歴取得手段108は、そのインターフェースの引数から、どのクラスの何のメンバを何の型で保存するべきかを調べる。すなわち、型サイズテーブル904から、引数で渡される実際の値の持つサイズを取得し、引数で渡された値を指定の型のデータ値として解釈し、出力レジスタ905のクラスおよびメンバ名、型名、データに設定する。次に、最終セーブメソッド名レジスタ903からクラスおよびメソッド名を取り出し、出力レジスタ905に設定する。次に、ログカウンタ902から現在のログ番号を取り出して出力レジスタ905のログ番号部906に設定する。次に出力レジスタ905の引数フラグ部910をリセットし、出力レジスタ905の内容をオブジェクト値履歴記憶手段109に格納する。次に、ログカウンタ増加用インターフェース707が呼び出されると、オブジェクト値履歴取得手段108は、そのイベントプロシージャでのメンバ変数の保存が完了したとして出力レジスタ905と最終セーブメソッド名レジスタ903をクリアし、ログカウンタ902の値を1増やす。出力レジスタ905をクリアするときには、引数フラグ部910をリセットする。
【0042】以上のようにして、オブジェクト値履歴取得手段108はイベントプロシージャの実行とそのときのオブジェクトの値を保存する。
【0043】また、デバッグ用アプリケーション115の実行により、あるオブジェクトのメソッドが実行されると、スタートアップシステムにより、メソッドに埋め込まれたコード402が実行され、図7に示すオブジェクト値保存機能のメソッド実行時用インターフェース702が呼び出される。メソッド実行時用インターフェース702が呼び出されると、オブジェクト値履歴取得手段108は、インターフェース702の引数を解析し、どのメソッドが呼び出されたのかを把握する。次にクラス名およびメソッド名最終セーブメソッド名レジスタ903にメソッド名を設定し、出力レジスタ905の引数フラグ部910をセットする。図7に示すように基本データ型を保存するための変数値保存用インターフェース703が実行されると、オブジェクト値履歴取得手段108は、そのインターフェース703の引数から、メソッドの引数をどのクラスのオブジェクトとして保存するべきかを調べる。型サイズテーブル904から、引数で渡される実際の値の持つサイズを取得し、引数で渡された値を指定の型のデータ値として解釈し、出力レジスタ905のクラスおよびメンバ名、型名、データに設定する。次に、最終セーブメソッド名レジスタ903からクラスおよびメソッド名を取り出し、出力レジスタ905に設定する。次に、ログカウンタ902から現在のログ番号を取り出して出力レジスタ905のログ番号部906に設定し、出力レジスタ905の内容をオブジェクト値履歴記憶手段109に格納する。その際出力レジスタ905の引数フラグ部910はセットされたままになっており、そのオブジェクトのメンバ変数が引数として保存されたこと示すようにオブジェクト値履歴記憶手段109に保存される。もし、引数があるクラスのオブジェクトである場合は、図7に示すようにそのクラスのメンバ変数をダンプするコード708が埋め込まれており、そのコードの実行によって引数となっているオブジェクトのメンバ変数がオブジェクト値履歴記憶手段109に保存される。次に、メソッド引数保存終了インターフェースを呼び出すコード704が実行されると、オブジェクト値履歴取得手段108は出力レジスタ905の引数フラグ部910をリセットする。次にメンバ変数保存用メソッドである図7のDumpメソッド708が実行されると、図4に示すようにオブジェクトのメンバ変数を保存するために変数値保存用インターフェース402が呼び出される。変数値保存用インターフェース402が呼び出されると、オブジェクト値履歴取得手段108は、そのインターフェース402の引数から、どのクラスの何のメンバを何の型で保存するべきかを調べる。型サイズテーブル904から、引数で渡される実際の値の持つサイズを取得し、引数で渡された値を指定の型のデータ値として解釈し、出力レジスタ905のクラスおよびメンバ名、型名、データに設定する。次に、最終セーブメソッド名レジスタ903からクラスおよびメソッド名を取り出し、出力レジスタ905に設定する。次に、ログカウンタ902から現在のログ番号を取り出して出力レジスタ905のログ番号部906に設定する。次に出力レジスタ905の引数フラグ部910をリセットし、出力レジスタ905の内容をオブジェクト値履歴記憶手段109に格納する。次に、ログカウンタ増加用インターフェースが呼び出されると、オブジェクト値履歴取得手段108は、そのメソッドでのメンバ変数の保存が完了したとして出力レジスタ905と最終セーブメソッド名レジスタ903をクリアし、ログカウンタ902の値を1増やす。出力レジスタ905をクリアするときには、引数フラグ部910をリセットする。
【0044】以上のようにして、オブジェクト値履歴取得手段108はメソッドの実行とそのときのオブジェクトの値を保存する。
【0045】オブジェクト値履歴取得手段108は、ユーザ操作再生手段107から操作の再生終了の通知を受けると、ログカウンタ902、最終セーブメソッド名レジスタ903、操作名レジスタ913、履歴名レジスタ914、出力レジスタ905をクリアする。
【0046】次に、オブジェクト値履歴記憶手段109について説明する。オブジェクト値履歴記憶109は、オブジェクト値履歴取得手段108内の出力レジスタ905を複数個含むテーブルを、操作名、履歴名ごとに含んでいる。オブジェクト値履歴記憶手段109は、オブジェクト値履歴取得手段108から、指定された操作名および履歴名のテーブル作成の指示を受けると、指定された操作名および履歴名で識別される、オブジェクト値履歴取得手段108内の出力レジスタ905の構造を1要素とする可変個の要素を格納可能なテーブルを用意する。次にオブジェクト値履歴取得手段108から出力レジスタ905の内容の格納指示を受けると、出力レジスタ905内の操作名部912と履歴名部915の内容から格納すべきテーブルを特定し、出力レジスタ905の内容を新しい要素としてテーブルの最後に追加する。
【0047】次に、オブジェクト値履歴比較手段110、オブジェクト状態一覧取得手段112について説明する。オブジェクト値履歴比較手段110では、オブジェクト値履歴記憶手段109に記憶されている複数のオブジェクト値履歴を比較する。比較は二つの履歴中の同じログ番号同士のデータを突き合わせることで行い、違いを検出した部分のログ番号、クラスおよびメソッド名、メンバ変数名を表示・出力手段113に出力する。これにより、アプリケーション115に修正を加えた場合にどこの何時の状態が変化したかを、また、何らの変化もおきていないことを確認できる。
【0048】図10にオブジェクト値履歴比較手段110の比較結果を表示・出力手段113によって出力した例を示す。結果欄の記号NMは値が一致していないことを表し、記号WRは実行順序が変わってしまい、対応するログがないことを示す。オブジェクト値履歴比較手段110は、対応するログがなくなった場合、値以外の情報が一致するログを比較先履歴から検索し、その間の履歴については実行順序が変わったとみなして記号WRを結果欄に出力するよう表示・出力手段113に指示する。このようにすることで、デグレードチェックなどで、ユーザがプログラムの実行経路が変化したり値が変わったりしていないか確認することを容易にする。
【0049】次に、オブジェクト状態一覧取得手段112について説明する。オブジェクト状態一覧取得手段112は、オブジェクト値履歴記憶手段109に記憶されているある履歴中に含まれる、あるクラスのオブジェクトが履歴取得時点でとったすべての状態の一覧を作成する。まず、オブジェクト値履歴記憶手段109中のある履歴中に含まれるログで、特定のクラス名を持つものを列挙する。次にメンバ変数定義情報テーブル111からその定義域を調べ、列挙したオブジェクト値のうちで、定義域から外れたものを列挙する。
【0050】図11にオブジェクト状態一覧取得手段112による状態一覧を表示・出力手段113によって出力した例を示す。結果欄の記号ORは値が正当な範囲に入っていないことを示す。
【0051】次に正当な値にあるかどうか判断するのに使用するメンバ変数定義情報テーブル111について説明する。メンバ変数定義情報テーブル111はクラスのメンバ変数ごとに、型名とその仕様上正当な値の範囲をリストにして保持している。履歴中の値が正当かどうかを判断するときは、仕様上正当な値の範囲のリストの各要素について、その要素が示す値の範囲内に履歴中の値が含むかどうかを判定する。数値に基づく変数は数値比較によって範囲内にあるか判定し、文字列であれば辞書順比較で判定する。上記のようにして、不良の原因となりうる、不正なオブジェクトの値を検出し、デバッグ作業を支援する。
【0052】次に表示・出力手段113について説明する。表示・出力手段113は前記オブジェクト値履歴比較手段110やオブジェクト状態一覧取得手段112の出力を整形して表示・出力したり、オブジェクト値履歴記憶手段109中のデータを検索して表示出力したり、そのまま表示出力したりする。表示形式はオブジェクト値履歴取得手段108から出力レジスタ905の構造でオブジェクト値履歴記憶手段109の内容を列挙したものである。
【0053】
【発明の効果】以上の説明から明らかなように、本発明によれば次のような効果が得られる。
(1) 不具合が起きたときのユーザの操作を正確に記録し、デバッグの際に再生することで、不具合が発生したときの操作を正確に再現できる。これにより、不具合を確認するための操作の誤解を防止し、何度も同じ操作を正確に繰り返すことによる労力を軽減できる。
(2) 不具合の発生した操作を正確に再現し、それによって動作している最中のアプリケーションの状態をイベント発生時やメソッド実行時に履歴として記録するため、その履歴を閲覧することにより、何の操作が行われたときにどのような不良が発現して不具合となったのかの原因の見当をつけることを容易にできる。
(3) クラスのメンバ変数が仕様上取りうる定義域と実際に記録されたオブジェクトのメンバ変数の値とを比較することで、異常な値が何の操作またはどのタイミングで発生しているかを知ることができる。これもまたデバッグの際の原因究明作業にかかる労力を軽減できる。
【出願人】 【識別番号】000233055
【氏名又は名称】日立ソフトウエアエンジニアリング株式会社
【出願日】 平成12年9月27日(2000.9.27)
【代理人】 【識別番号】100073760
【弁理士】
【氏名又は名称】鈴木 誠
【公開番号】 特開2002−108651(P2002−108651A)
【公開日】 平成14年4月12日(2002.4.12)
【出願番号】 特願2000−293398(P2000−293398)