(57)【要約】  【課題】アプリケーションデバッグ用の機能をもたない仮想マシンに対しても、仮想マシン上でアプリケーションを実行させることにより仮想マシンのデバッグを可能とさせる。  【解決手段】  仮想マシン上で実行されるアプリケーションのデバッグのための情報、仮想マシンのインタープリターのアドレスを含む仮想マシン実行監視のための情報を取得すると共に記憶手段に格納し、仮想マシン実行監視のための情報に基づき仮想マシンのインタープリターの実行を監視し、仮想マシンのインタープリターが次に処理するアプリケーションのコードのアドレスをアプリケーションのデバッグのための情報と比較し、アプリケーションのデバッグのための情報に基づいてアプリケーションのデバッグ処理を実行する【選択図】図１
2008191907.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
仮想マシン上で実行されるアプリケーションのデバッグのための情報、及び少なくとも仮想マシンのビルド時に生成される仮想マシンのインタープリターのアドレスを含む仮想マシン実行監視のための情報を取得するとともに記憶手段に格納するデバッグ情報入力ステップと、
前記仮想マシン実行監視のための情報に基づき少なくとも仮想マシンのインタープリターの実行を監視する監視アドレス判定ステップと、
前記仮想マシンのインタープリターが次に処理するアプリケーションのコードのアドレスを前記アプリケーションのデバッグのための情報と比較するデバッグ処理判定ステップと、
前記アプリケーションのデバッグのための情報に基づいて前記アプリケーションのデバッグ処理を実行する監視対象処理ステップと
を実行させる仮想マシン監視プログラム。
【請求項２】
前記デバッグ情報入力ステップはさらに仮想マシンがアプリケーションをロードする処理のアドレスを入力とし、前記監視アドレス判定ステップはアプリケーションのロード先アドレスを監視することを特徴とする請求項１記載の仮想マシン監視プログラム。
【請求項３】
前記デバッグ情報入力ステップはさらに仮想マシンがアプリケーションのオブジェクトのメモリ領域を確保する処理のアドレスを入力とし、前記監視アドレス判定ステップはアプリケーションのオブジェクトのメモリ領域に対する書き込み処理を監視することを特徴とする請求項１記載の仮想マシン監視プログラム。
【請求項４】
仮想マシン上で実行されるアプリケーションのデバッグのための情報、及び少なくとも仮想マシンのビルド時に生成される仮想マシンのインタープリターのアドレスを含む仮想マシン実行監視のための情報を取得するとともに記憶手段に格納するデバッグ情報入力手段と、
前記仮想マシン実行監視のための情報に基づき少なくとも仮想マシンのインタープリターの実行を監視する監視アドレス判定手段と、
前記仮想マシンのインタープリターが次に処理するアプリケーションのコードのアドレスを前記アプリケーションのデバッグのための情報と比較するデバッグ処理判定手段と、
前記アプリケーションのデバッグのための情報に基づいて前記アプリケーションのデバッグ処理を実行する監視対象処理手段と
を有することを特徴とする仮想マシンデバッグ装置。
【請求項５】
前記デバッグ情報入力手段はさらに仮想マシンがアプリケーションをロードする処理のアドレスを入力し、前記監視アドレス判定手段はアプリケーションのロード先アドレスを監視することを特徴とする請求項４記載の仮想マシンデバッグ装置。
【請求項６】
前記デバッグ情報入力手段はさらに仮想マシンがアプリケーションのオブジェクトのメモリ領域を確保する処理のアドレスを入力し、前記監視アドレス判定手段はアプリケーションのオブジェクトのメモリ領域に対する書き込み処理を監視することを特徴とする請求項４記載の仮想マシンデバッグ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は仮想マシンのデバッグに関し、特にアプリケーションデバッグ用の機能をもたない仮想マシンに対しても、仮想マシン上でテストアプリケーションを実行させることにより仮想マシンのデバッグを可能とする技術に関する。
【背景技術】
【０００２】
仮想マシンが仕様を満たしていることを確認するためには、仮想マシンにテストプログラムを実行させて結果を確認する手法が一般的に用いられる。例えば、Ｊａｖａ（登録商標）ＶＭ（Virtual Machine）の実装が仕様に準拠しているかどうかを確認するためには米Sun Microsystems社などから提供されるテストプログラムやツール類から構成された、ＴＣＫ（Technology Compatibility Kit）と呼ばれるテクノロジ互換性キットが用いられる。テストプログラムの実行結果が仕様から期待される結果と異なっていた場合、その仮想マシンにはバグが含まれていると判定する。
【０００３】
バグの原因を調べる方法としては、仮想マシンに対してブレイクポイントを張って変数の値を参照したり、プリント文を記述してデバッグメッセージを出力したりする方法が考えられる。バグの原因を調べる他の方法として、仮想マシン上で実行されるテストプログラムに対してブレイクポイントを張り、変数の値を参照したりステップ実行を適用したりする方法を考えることもできる。
【０００４】
テストアプリケーションが期待通りの出力を返さなかった場合、どの時点までは期待通りの値で、どの時点から期待と異なる値になったかを調べることでバグの発生箇所を絞り込むことができる。このとき、仮想マシンのソースコードにブレイクポイントを張ってステップ実行させる前に、仮想マシンによって処理されるアプリケーションのソースコードにブレイクポイントを張ってステップ実行させることができるとバグ発生箇所を効率的に探すことができる。仮想マシンのソースコードのレベルでは共通のコードとして扱われるアプリケーションのコードが、アプリケーションのソースコードのレベルでは全く異なった処理を表している場合があるためである。
【０００５】
仮想マシンが実行するアプリケーションに対してブレイクポイントを張るには、ブレイクポイントを張る機能の追加がアプリケーション実行環境に対して必要となる。これを実現する一つの方法として、テストプログラムにブレイクポイントを張る機能を仮想マシンのコードに追加することが行われている。しかしながら、この手法を用いた場合、仮想マシンのコードが運用時に使用したいコードとは異なるものとなってしまう。
【０００６】
関連する技術として、シミュレーション実行されるコードの実行を監視・制御する方法として、機械語命令によるループ部分のスキップ機能を提供する方法が開示されている（例えば、特許文献１参照）。また、仮想マシンによって実行されるアプリケーションに対してデバッグ情報を組み込まない方法についても開示されている（例えば、特許文献２参照）。
【特許文献１】特開平０５−２４１８８９号公報  （第２−３頁）
【特許文献２】特開２００２−０５５８４８号公報  （第２−３頁）
【発明の開示】
【発明が解決しようとする課題】
【０００７】
図３１に仮想マシンの一般的なデバッグ手順の例を示す。初めに仮想マシンをコンパイルし、コンパイルされた仮想マシンのオブジェクトコードをシミュレータ上で実行させる（Ｓ３１０１）。次に、シミュレータ上で実行される仮想マシンにテストアプリケーションをロードし（Ｓ３１０２）、テストアプリケーションを実行させ、テストアプリケーションの実行結果に問題があるどうかを判定する（Ｓ３１０３）。問題がなければ仮想マシンのデバッグを終了し、問題があれば以下の手順で仮想マシンのバグを絞り込む。
【０００８】
先ず、仮想マシン上で実行されるテストアプリケーションの動作がどこまでは仕様通りで、どこから仕様と異なる動作をとるようになったかを調べる（Ｓ３１０４）。このとき仮想マシン上で実行されるアプリケーションのソースコードにブレイクポイントを張って仮想マシンの実行を一時停止させ、ステップ実行を適用したりインスタンスフィールドの値を参照したりすることができると仮想マシンのデバッグを効率的に進めることができる。
【０００９】
次に、アプリケーションの振る舞いが仕様からはずれた箇所に関連する仮想マシンのコードを調べ、仮想マシンのバグを特定する（Ｓ３１０５）。特定された仮想マシンのバグを修正して再コンパイルし（Ｓ３１０６）、Ｓ３１０１に戻り再コンパイルされた仮想マシンのオブジェクトコードをシミュレータ上で実行させ、テストアプリケーションをロードし直してテストアプリケーションを再実行する。
【００１０】
しかしながら、仮想マシン上で実行されるアプリケーションのソースコードにブレイクポイントを張ってステップ実行を適用したりインスタンスフィールドの値を参照したりする機能がデバッグ対象となる仮想マシンになければ、上記のデバッグ手法をとることはできない。
【００１１】
利用可能なリソースが限られた、例えばＩＣカードの組み込みソフトウェアとして動作する仮想マシンの場合などでは、アプリケーションデバッグ用のコードは省くことが望ましい。一方、組み込み向けの仮想マシンであっても、利用可能なリソースが限られていない環境においては、仮想マシンのコードにアプリケーションデバッグ用のコードを埋め込むことで上記のデバッグ手法をとることは可能である。しかしながら、この方法をとった場合、運用時には埋め込んだコードを外すことになり、テストアプリケーション実行用の仮想マシンのコードと運用時のコードは異なるものとなってしまう。テストアプリケーションの実行によるデバッグは、実運用環境にできるだけ近い状態で実行することが望まれる。
【００１２】
本発明は上記の問題点を解決するためになされたものであり、アプリケーションデバッグ用の機能をもたない仮想マシンに対しても、仮想マシンのコードを変更することなく、仮想マシン上でテストアプリケーションを実行させることにより仮想マシンのデバッグを可能とすることを目的としている。
【課題を解決するための手段】
【００１３】
図１は、本発明における実施例の全体構成図が示してある。本発明の仮想マシン監視プログラム１００は、仮想マシンデバッグ装置１として振る舞うコンピュータ上で動作するプログラムであり、仮想マシン１１を仮想マシンデバッグ装置上で動作させるシミュレータ１０に対して仮想マシンの監視機能を実現させるものである。先ず、デバッグ情報入力手段１１（請求項１におけるデバッグ情報入力ステップを実行する。）は、仮想マシン上で実行されるアプリケーションのデバッグのための情報、及び少なくとも仮想マシンのビルド時に生成される仮想マシンのインタープリターのアドレスを含む仮想マシン実行監視のための情報を取得すると共に記憶手段に格納する。
【００１４】
監視アドレス判定手段１０２（請求項１における監視アドレス判定ステップを実行する。）は、前記仮想マシン実行監視のための情報に基づき少なくとも仮想マシンのインタープリターの実行を監視し、デバッグ処理判定信手段１０3（請求項１におけるデバッグ処理判定ステップを実行する。）は、前記仮想マシンのインタープリターが次に処理するアプリケーションのコードのアドレスを前記アプリケーションのデバッグのための情報と比較し、監視対象処理手段１０４（請求項１における監視対象処理ステップを実行する。）は、前記アプリケーションのデバッグのための情報に基づいて前記アプリケーションのデバッグ処理を実行することにより、アプリケーションデバッグ用の機能をもたない仮想マシンに対しても、仮想マシンのコードを変更することなく、仮想マシン上で実行されるアプリケーションのソースコードにブレイクポイントを張って仮想マシンの実行を一時停止させ、ステップ実行を適用することが可能となり、その結果として仮想マシンのデバッグが可能となる。
【００１５】
また、前記デバッグ情報入力ステップはさらに仮想マシンがアプリケーションをロードする処理のアドレスを入力し、前記監視アドレス判定ステップはアプリケーションのロード先アドレスを監視することにより、アプリケーションが実行時に問題が発生したソースプログラム上のアドレスを知ることができ、仮想マシンのデバッグ効率をより高めることが可能となる。
【００１６】
また、前記デバッグ情報入力ステップはさらに仮想マシンがアプリケーションのオブジェクトのメモリ領域を確保する処理のアドレスを入力し、前記監視アドレス判定ステップはアプリケーションのオブジェクトのメモリ領域に対する書き込み処理を監視することによりスタティックフィールドやインスタンスフィールドの値を表示することが可能となり、仮想マシンのデバッグ効率をより高めることが可能となる。
【発明の効果】
【００１７】
アプリケーションデバッグ用の機能をもたない仮想マシンに対しても、仮想マシンのコードを変更することなく、仮想マシン上でテストアプリケーションを実行させることにより仮想マシンのデバッグが可能となる。
【発明を実施するための最良の形態】
【００１８】
(実施例)
図１は、本発明における実施例の全体構成図が示してある。仮想マシンデバッグ装置１には、仮想マシン１１をデバッグするために実行させるテストプログラムとしてのアプリケーション１２のデバッグ情報ファイル２１、監視情報ファイル２２を格納する外部記憶装置２が接続されている。デバッグ情報ファイル２１は、図５、図６、図８、図１０、図１９から図２３で示してあるアプリケーションのデバッグ情報管理テーブルなどから構成され、また、監視情報ファイル２２は、図２及び図３で示してある監視用の設定データから構成されている。なお、前記のデバッグ情報や監視情報はハードディスクなどの外部記憶装置上ではなくメモリ上に展開しても構わない。
【００１９】
仮想マシン監視プログラム１００は仮想マシンデバッグ装置１として振る舞うコンピュータ上で動作するプログラムであり、仮想マシン１１を仮想マシンデバッグ装置上で動作させるシミュレータ１０に対して仮想マシンの監視機能を実現させるものである。デバッグ情報入力手段１０１は、仮想マシン上で実行されるアプリケーションプログラムのデバッグのための情報、及び仮想マシンのビルド時に生成される仮想マシンのインタープリターのアドレス、仮想マシンがアプリケーションをロードする処理のアドレス、及び仮想マシンがアプリケーションのオブジェクトのメモリ領域を確保する処理のアドレスを含む仮想マシン実行監視のための情報を取得すると共に外部記憶装置２上にあるデバッグ情報ファイル２１、監視情報ファイル２２に格納する。
【００２０】
監視アドレス判定手段１０２は、前記仮想マシン実行監視のための情報に基づき仮想マシンのインタープリターの実行、アプリケーションをロードする処理、及びアプリケーションのオブジェクトのメモリ領域に対する書き込み処理を監視し、デバッグ処理判定信手段１０３は、前記仮想マシンのインタープリターが次に処理するアプリケーションのコードのアドレスを前記アプリケーションのデバッグのための情報と比較し、監視対象処理手段１０４は、前記アプリケーションのデバッグのための情報に基づいて前記アプリケーションのデバッグ処理を実行することにより、アプリケーションデバッグ用の機能をもたない仮想マシンに対しても、仮想マシンのコードを変更することなく仮想マシンのデバッグが可能となる。
【００２１】
この方法では、仮想マシンにはアプリケーションをデバッグする機能は含まれていない。仮想マシンをシミュレーション実行し、仮想マシンの実行を監視・制御するシミュレータによって仮想マシンをデバッグする機能が実現されている。アプリケーションのデバッグ情報は、シミュレータまたはシミュレータの一部である仮想マシン監視プログラムによって処理される。(図１には記載しなかったが、ユーザ・インタフェースを提供するモジュールと監視プログラムを関連付けるプログラムがデバッグ情報を処理する構成であってもよい。)
図２は、本発明に係る実行監視用の設定データ例が示してある。監視関数名の項には本発明に係る監視プログラムが監視すべき関数名が、監視アドレスの項には監視すべき関数が仮想マシンデバッグ装置の主記憶領域上にローディングされたときの先頭アドレスが格納されている。実行アクセス監視用の設定データは、利用者が設定ファイルに記述する関数名と仮想マシンをビルドするときに生成される関数のアドレス情報から構築される。なお、監視アドレスの項に記述されたアドレスの先頭２文字が“０Ｘ”となっているが、これは続く文字列が１６進数で表されていることを示している。以降に示してある図においてもアドレスの先頭２文字“０Ｘ”は続く文字列が１６進数で表されていることを示している。
【００２２】
図３には、本発明に係る書き込み監視用の設定データ例が示してある。メモリ領域名の項には仮想マシン監視プログラムが監視すべきStatic Field用メモリ領域名が、監視アドレスの項には監視すべきメモリ領域の先頭及び最終アドレスが格納されている。書き込み監視領域全体を指定する設定データは、仮想マシンの特性に合わせて利用者が設定ファイルに記述する。この例ではスタティックフィールドとインスタンスフィールドの領域が分けられているが、本発明はこのようなメモリ領域を前提にしたものではない。仮想マシンの実装に合わせて利用者が監視領域を指定する。
【００２３】
図４には、本発明に係るアプリケーションのコード領域例が示してある。例えばアプリケーションExample.javaに対応したコードは、仮想マシンデバッグ装置の主記憶領域上のc0000000番地からc0000437番地までにローディングされていることを示している。
【００２４】
図５には、本発明に係るアプリケーションのデバッグ情報管理テーブル例１が示してある。このテーブルは、仮想マシン監視プログラム（デバッグ情報入力手段）がアプリケーションをデバッグオプション付きでコンパイルすることによって生成されたオブジェクト情報(ソースコードとオブジェクトコードの関係情報)を読み取る際に作成される。以下、図６、図８、図１０、及び図１９から図２３についても同様に作成される。本テーブルは仮想マシン監視プログラムが設定されたブレイクポイントを参照するために利用するものであり、ソースコード行の項にはテストアプリケーションのプログラム名とソース行が、相対アドレスの項には、ソースコード行に対応した開始・終了のプログラム内相対アドレスが格納されている。
【００２５】
図６には、本発明に係るアプリケーションのデバッグ情報管理テーブル例２が示してある。このテーブルは仮想マシン監視プログラムがテストアプリケーションの使用するメソッド名を参照するために利用するものであり、メソッド名の項にはメソッドの名前が、相対アドレスの項には図４で示したコード領域内の相対アドレスが格納される。
【００２６】
図７には、本発明に係るアプリケーションのスタティックフィールドのローディング例が示してある。例えば、クラスExampleＡに対応したスタティックフィールドは、仮想マシンが管理するメモリ領域の60000000番地から60000231番地にローディングされることを表している。
【００２７】
図８には、本発明に係るアプリケーションのデバッグ情報管理テーブル例３が示してある。このテーブルは仮想マシン監視プログラムがテストアプリケーションのスタティックフィールドを参照するために利用するものであり、スタティックフィールド名の項にはクラス名の項で示されたクラスに対応するにはスタティックフィールドの名前が、オフセット、サイズの項にはそれぞれスタティックフィールドのオフセットと大きさがバイト単位で格納される。
【００２８】
図９には、本発明に係るアプリケーションのインスタンスフィールドの割当例が示してある。例えば、仮想マシンがインスタント生成処理時にクラスExampleＡに対応したインスタンスフィールド内のインスタンスＸは仮想マシンが管理するメモリ領域の80000000番地から80000131番地に、インスタンスＹは仮想マシンが管理するメモリ領域の80000132番地から80000263番地に割り当てたことを表している。
【００２９】
図１０には、本発明に係るアプリケーションのデバッグ情報管理テーブル例が示してある。このテーブルは仮想マシン監視プログラムがテストアプリケーションのインスタンスフィールドを参照するために利用するものであり、インスタンスフィールド名の項にはクラス名の項で示されたクラスに対応するにはインスタンスフィールドの名前が、オフセット、サイズの項にはそれぞれインスタンスフィールドのオフセットと大きさがバイト単位で格納される。
【００３０】
図１１には、本発明に係るブレイクポイント設定の説明図が示してある。利用者はユーザ・インタフェースを提供するアプリケーションを介して、テストアプリケーションのソースコードのある行にブレイクポイントを設定する。設定されたブレイクポイントの情報は、ソースファイル名とブレイクポイント設定行番号のペアとして、仮想マシン監視プログラムに渡される。仮想マシン監視プログラムは図５で示したデバッグ情報管理テーブル例１を参照し、指定されたソースコードの行に対応する相対アドレスを取得する。ここで取得した相対アドレスを後述する図２５の処理(Ｓ２５０４)で登録した各アプリケーションのコードのロード先アドレス（図４参照）に加えることで、ブレイクポイントとして指定した行に対応するアドレスの範囲を取得することが可能となる。
【００３１】
図１２には、本発明に係るブレイクポイント監視用テーブル例が示してある。図１１で説明したブレイクポイントとして指定した行に対応するアドレスの範囲は、仮想マシン監視プログラムによって開始アドレス及び終了アドレスの項に格納される。この際、仮想マシン監視プログラムは、ブレイクポイントに対してブレイクポイントＩＤ （ブレイクポイント識別子）を割り振り、ブレイクポイントＩＤの項に格納する。また、ブレイクポイントごとに有効／無効の設定を切り替えられるように、ブレイクポイント監視用テーブルには有効／無効の項が設けてある。
【００３２】
図１３、図１４及び、図１５には、それぞれ本発明に係るステップイン実行コマンド、ステップオーバー実行コマンド、ステップアウト実行コマンド投入の説明図が示してある。仮想マシン監視プログラムによるステップ実行ステップイン／ステップオーバー／ステップアウトの３通りの処理がある。ステップインはブレイクポイントまたは前回のステップ実行処理で停止させた位置に対応するアプリケーションのソースコード行からはずれるまでアプリケーションの実行を進める処理である。
【００３３】
ステップオーバーは、関数を呼び出した場合に関数の呼び出しもとに戻るまでアプリケーションの実行を停止させない点を除いて、ステップインと同じ処理を実行する処理である。ステップアウトは、アプリケーションが実行を一時停止している関数から抜けるまでアプリケーションの処理を進める処理である。仮想マシンがブレイクポイントあるいは前回のステップ実行処理を終えてアプリケーションの実行を一時停止させているとき、図１３、図１４及び、図１５のように利用者はユーザ・インタフェースを提供するアプリケーションを介して、ステップ実行コマンドを仮想マシン監視プログラムに入力する。ステップ実行コマンドを受信した仮想マシン監視プログラムは、図１３、図１４及び、図１５のように各ステップ実行に対応したフラグ変数の更新処理を実行し、仮想マシンの実行を再開させる。
【００３４】
図１６には、本発明に係るステップ実行管理テーブル例が示してある。図１３、図１４で仮想マシン監視プログラムが操作するステップインフラグ／ステップオーバーフラグを管理するテールである。フラグ名で示されたステップインフラグ／ステップオーバーフラグは、ＯＮ／ＯＦＦの何れかの値をとる。
【００３５】
図１７には、本発明に係るメソッド呼び出し管理テーブル例１が示してある。このテーブルは仮想マシン監視プログラムがフレームプッシュ機能、ステップアウト機能を実現させるときに使用されるものである。仮想マシンがフレームをプッシュするときに仮想マシン監視プログラムはフレームがプッシュされたことを記録するためにプッシュされたフレームのフレームＩＤの項にフレームＩＤを、実行停止フラグの項に実行停止フラグを格納する。フレームＩＤの初期値は１、実行停止フラグのデフォルト値はＯＦＦである。実行停止フラグはステップオーバー処理／ステップアウト処理で使用する情報であり、実行停止フラグがＯＮとなっていた場合に、仮想マシン監視プログラムは仮想マシンの実行を一時停止させるように制御する。
【００３６】
図１８には、本発明に係るメソッド呼び出し管理テーブル例２が示してある。このテーブルの情報は仮想マシン監視プログラムがブレイクポイント処理でアプリケーションの実行を一時停止させた際、メソッド呼び出しのスタック情報を表示するために用いられる。１つのレコードは、フレームＩＤ／メソッド名／スタックアドレス（メソッドが呼ばれる直前のスタックポインタの値）からなる。実際に格納される内容についての詳細については図２５のＳ２５０８の処理を参照されたい。
【００３７】
図１９には、本発明に係るアプリケーションのデバッグ情報テーブル例５が示してある。本図はメソッド引数に関したデバッグ情報であり、メソッド名の項にはメソッド（アプリケーションが使用する関数）の名前が、メソッド引数名の項にはメソッド名の項で示された関数が使用する引数名が、サイズの項には前記引数のサイズがバイト単位で、スタック内でのオフセットの項にはスタック（メソッド引数とローカル変数を格納するための領域）内のオフセットが格納される。なお、関数が呼ばれるとローカル変数を確保するためにスタックが変化し、関数呼び出しから戻るとローカル変数を確保していたメモリ領域が開放され、スタックの値は関数呼び出し前の値に戻る。
【００３８】
図２０には、本発明に係るアプリケーションのデバッグ情報テーブル例６が示してある。本図はローカル変数に関したデバッグ情報であり、メソッド名の項にはアプリケーションが使用する関数の名前が、ローカル変数名の項にはメソッド内で使用される変数の名前が、サイズの項には前記ローカル変数のサイズがバイト単位で、スタック内でのオフセットの項にはスタック内のオフセットが格納される。
【００３９】
図２１には、本発明に係るインスタンス配置テーブル例が示してある。本図はアプリケーションが使用するインスタンスに関する情報である。インスタンスＩＤの項にはアプリケーションが使用するインスタンス（オブジェクト）ＩＤが、メモリアドレスの項にはインスタンスが生成されたときに定められたインスタンスのアドレスが、サイズの項にはインスタンスのサイズがバイト単位で、属するクラスの項にはクラス（オブジェクト指向言語で利用されるクラスを指す）の名前が格納される。
【００４０】
図２２には、本発明に係るインスタンス値管理テーブル例が、図２３には、本発明に係るスタティックフィールド値管理テーブル例が示してある。クラス名、メモリアドレス、サイズの項については図２１の説明と同様である。データの項で示された値はオブジェクトのインスタンスフィールド及びクラスのスタティックフィールドの初期値として定められるものである。これらの値は、値が上書きされるごとに変化し、仮想マシンのコード(スタティックフィールドとインスタンスフィールドの値を更新するコード)を監視することで値の更新を監視することが可能となる。
【００４１】
図２４は、本発明に係る仮想マシンのデバッグ処理の流れを示すフローチャートである。仮想マシンデバッグ装置のシミュレータによりシミュレーションが開始されると、シミュレータは仮想マシン監視プログラムが呼び出し、仮想マシン監視プログラムは図２や図３で示した実行監視用の設定データ、書き込み監視用の設定データからなる監視情報記述ファイルをＲＥＡＤする（Ｓ２４０１）。監視情報記述ファイルには、図２の例のように監視対象とする関数の名前とリンカが出力する関数のアドレス情報が記述されている。図３の例のように変数が配置されるメモリ領域を記述した設定ファイルも読み込まれるが、この時点では、アプリケーションのどの変数がどこに配置されるかは決定されていない。
【００４２】
次に、仮想マシンの実行を開始する（Ｓ２４０２）。Ｓ２４０１で読み込まれた監視情報記述ファイルの内容から監視対象となるアドレス領域を決定し、実行すべきアドレスが監視対象アドレスかどうかを判定し（Ｓ２４０３）、実行すべきアドレスが監視対象アドレスである場合には監視プログラムのコードを実行する（Ｓ２４０４）。監視プログラム実行処理は、指定されたアドレスのコードを実行する直前、あるいは指定されたメモリ領域に値が書き込まれる直前に実行される。監視プログラム実行処理は図２５と図２６に示すように仮想マシンがアクセスするメモリアドレスに応じて異なる処理を実行する。その後、Ｓ２４０４の監視コードの処理を実行したか否かに関わらず、仮想マシンのコードを実行する（Ｓ２４０５）。Ｓ２４０３−＞Ｓ２４０４−＞Ｓ２４０５、またはＳ２４０３−＞Ｓ２４０５の処理を繰り返す。
【００４３】
図２５は、図２４のＳ２０３及びＳ２０４の部分（実行監視）を詳述したフローチャートである。仮想マシンで次に実行させるコードのアドレスを、図２で示した実行監視用の設定データ及び図３で示した書き込み監視用の設定データであるか判定し（Ｓ２５０１、Ｓ２５０３、Ｓ２５０５、Ｓ２５０７、Ｓ２５０９、Ｓ２５１１）、監視アドレスに対応する処理を実行して仮想マシンのコードに戻る。
【００４４】
Ｓ２５０２では、仮想マシンが次に実行しようとするコードが、アプリケーションの実行を一時停止させるアドレスのコードであるか否かを判定し、停止させるアドレスであれば仮想マシンの実行を一時停止させる。そうでなければ仮想マシンのコードに戻る。
【００４５】
Ｓ２５０４では、アプリケーションのコード／データ領域のロード先アドレスを登録する。登録された情報は、下記の（１）、（２）に記載した処理で利用される。メモリ再配置処理(Garbage Collection等)によってアプリケーションのコード／データ領域が移動させられた場合、コード／データ領域の移動に伴い、登録情報を更新する。
【００４６】
（１）コード領域のロード先アドレスを参照する処理：図５で示した実行監視用の設定データのように、アプリケーションのデバッグ情報に記載されたコード領域の相対アドレスを、図４出示したアプリケーションのコード領域のロード先アドレスに足し合わせることで、ブレイクポイントが設定されたときに監視するアドレスを取得する。
【００４７】
（２）データ領域(スタティックフィールド領域)のロード先アドレスを参照する処理：     図８で示したアプリケーションのデバッグ情報管理テーブルに格納された各スタティックフィールドの相対位置情報（オフセット、サイズ）と、図７で示したアプリケーションのスタティックフィールド領域を参照することで、スタティックフィールドの値をフィールド名と対応付けて表示することができる。ロードされた値をスタティックフィールドの初期値として図２３で示すスタティックフィールド管理テーブルに格納する。スタティックフィールド領域への値の書き込みを図２６のＳ２６０１とＳ２６０２の処理で監視することにより、アプリケーションのスタティックフィールドの更新後の値を表示させることができる。
【００４８】
Ｓ２５０６では、アプリケーションがメソッドを呼び出すときスタックにフレームがプッシュされ、メソッド呼び出しから復帰するときフレームがポップされる。仮想マシンがフレームをプッシュするとき、仮想マシン監視プログラムは図１７で示したメソッド呼び出し管理テーブル１にフレームがプッシュされたことを記録する。フレームがプッシュされるごとに、その時点で最も大きなフレームＩＤをもつレコードよりもフレームＩＤが１つ大きいレコードをメソッド呼び出し管理テーブル１に登録する。フレームＩＤの初期値は１とする。仮想マシンがフレームをポップするとき、その時点で最も大きなフレームＩＤをもつレコードをテーブルから削除する。
【００４９】
仮想マシンがフレームをプッシュするとき、フレームＩＤとともに実行停止フラグを登録する。実行停止フラグのデフォルト値はＯＦＦである。この値は後述するステップオーバー処理／ステップアウト処理を実行する際にＯＮになり得る。また、仮想マシンがフレームをポップするとき、フレームＩＤと実行停止フラグをテーブルから削除する。フレームＩＤと実行停止フラグをテーブルから削除するとき、実行停止フラグを参照する。実行停止フラグがＯＮになっていれば、仮想マシンの実行を一時停止させる。
【００５０】
Ｓ２５０８では、仮想マシンが次に実行するアプリケーションのメソッドのアドレスを参照し、仮想マシン監視プログラムが管理する図１８で示したメソッド呼び出し管理テーブル２にレコードを１つ登録する。メソッドが呼ばれるごとに、その時点で最も大きなフレームＩＤをもつレコードよりもフレームＩＤが１つ大きいレコードをメソッド呼び出し管理テーブル２に登録する。フレームＩＤの初期値は１とする。
【００５１】
スタックアドレスは、図２５の条件Ｓ２５０７により仮想マシン監視プログラムに処理が移った時点でのアプリケーションのスタックポインタの値である。メソッド名は、図６で示したアプリケーションのデバッグ情報管理テーブル２を参照することで取得する。メソッド名と対応付けられたメソッドの相対位置は、仮想マシンが次に実行するアプリケーションのメソッドのアドレスから、図４で示した対応するアプリケーションのコード領域の先頭アドレスを差し引いて取得する。
【００５２】
図１８で示したメソッド呼び出し管理テーブル２に登録された情報は、ブレイクポイントでアプリケーションの実行を一時停止させた際、メソッド呼び出しのスタック情報を表示するために用いられる。また、スタックアドレスと図１９、図２０で示したアプリケーションのデバッグ情報テーブルを参照することで、メソッド引数とローカル変数の値を変数名と対応付けて表示させることが可能である。
【００５３】
図１８で示したメソッド呼び出し管理テーブル２に登録されたレコードは、Ｓ２５０６の処理内容で記述したフレームのポップ処理が実行されるときに１つ削除される。削除されるレコードは、フレームＩＤが最も大きなレコードである。
【００５４】
Ｓ２５１０では、インスタンスは図で示したように仮想マシンが管理するメモリ領域に配置される。生成されたインスタンスのメモリ領域を、インスタンスに関する情報と共に図２１で示したインスタンス配置テーブルに登録する。インスタンス生成時に初期値が与えられていれば、図２２で示したインスタンス値を管理テーブルのデータとして初期値を登録する。図２２で管理するデータは後述するインスタンスフィールド更新処理（図２６のＳ２６０４）によって最新の値に更新される。
【００５５】
インスタンスが置かれるメモリ領域を登録するとき、図２１のようにどのクラスのインスタンスがどのメモリ領域に配置されたかをインスタンスＩＤとともに登録する。監視プログラムは図１０のようなアプリケーションのデバッグ情報を参照することで、図２２のテーブルで管理されるデータ(インスタンスフィールドの値)をフィールド名と対応付けて表示させることができる。また、インスタンスＩＤまたはメモリアドレスを介して指定されたインスタンス間の参照関係を追跡することが可能となる。
【００５６】
Ｓ２５１２では、アプリケーションのコード／データ（スタティックフィールド）領域およびインスタンスが置かれた領域を移動させる処理をメモリ再配置処理と呼ぶことにする。メモリ再配置処理はGarbage Collection等によって実行される。なお、Ｓ２５１２の処理は仮想マシンがメモリ再配置処理を実行するときに起動され、メモリ再配置処理の各ステップを監視することで、監視対象とするメモリ領域を移動先のメモリ領域に変更する。
【００５７】
図２６は、書き込みアクセスによって起動される仮想マシン監視プログラムの処理の流れを示すフローチャートである。書き込みが行われた領域がスタティックフィールド領域のアドレスかを判定し（Ｓ２６０１）、スタティックフィールド領域の場合には図２５のＳ２５０３とＳ２５１１の処理を監視することで取得されたスタティックフィールドのメモリ領域に対し、書き込み処理が実行されたら、図２３で示したスタティックフィールド値管理テーブルのデータの項を更新する（Ｓ２６０２）。ここで更新されたデータはスタティックフィールドの最新の値を表示するために用いられる。(本実施例ではスタティックフィールドのデータを図２３で示すようなテーブルで管理しているが、このようなテーブルを利用せずスタティックフィールド領域のメモリの値を直接参照してスタティックフィールドの値を表示させる実装方法も可能である。この場合、上記の書き込み処理の監視処理は不要である。)
書き込みが行われた領域がインスタンスフィールド領域のアドレスかを判定し（Ｓ２６０３）、インスタンスフィールド領域の場合には図２５のＳ２５０９とＳ２５１１の処理を監視することで取得されたインスタンスフィールドのメモリ領域に対し、書き込み処理が実行されたら、図２２のインスタンス値管理テーブルのデータの項を更新する。ここで更新されたデータはインスタンスフィールドの最新の値を表示するために用いられる。(本実施例ではインスタンスフィールドのデータを図２２のようなテーブルで管理しているが、このようなテーブルを利用せずインスタンスフィールド領域のメモリの値を直接参照してインスタンスフィールドの値を表示させる実装方法も可能である。この場合、上記の書き込み処理の監視処理は不要である。)
図２７は、仮想マシン監視プログラムが図１２のブレイクポイント監視用テーブルを参照して実行する処理（ブレイクポイント機能）の流れを示すフローチャートである。本処理は、図２５のＳ２５０２に対応している。なお、後述するステップ実行機能を実行する仮想マシン監視プログラムの処理もＳ２５０２に対応している。
【００５８】
仮想マシン監視プログラムはインタープリターの処理を一時停止させた後で起動される。仮想マシン監視プログラムは、インタープリターの関数引数やローカル変数として保持されている次に実行されるアプリケーションのコードのアドレスを取得する（Ｓ２７０１）。取得したアドレスが、図１２で示したブレイクポイント監視テーブルに格納された有効なブレイクポイントに対応するアドレスであるかどうかを判定し（Ｓ２７０２）、有効なブレイクポイントに対応するアドレスである場合には仮想マシン監視プログラムの実行を停止させる前に、ブレイクポイントに対応したアプリケーションのソースコードにフォーカスを移す（Ｓ２７０３）。
【００５９】
これは図２５のＳ２５０４で示した処理によって、図４で示したアプリケーションのコード領域に登録された各アプリケーションのコードのロード先アドレスと図５で示したアプリケーションのデバッグ情報管理テーブルを逆参照することで可能である。
【００６０】
ブレイクポイントに対応したアプリケーションのソースコードにフォーカスを移した後、アプリケーションのメソッド用のスタックに積まれたメソッド引数とローカル変数の値を表示する（Ｓ２７０４）。この処理は、図１８で示したメソッド呼び出し管理テーブルに登録されているスタックアドレスと図１９で示したアプリケーションのデバッグ情報１、及び図２０で示したアプリケーションのデバッグ情報２を参照することで可能である。
【００６１】
次にインタープリターの処理を停止させたまま仮想マシン監視プログラムの実行を一時停止させて実行再開命令を待つ（Ｓ２７０５）。これにより、アプリケーションの実行がブレイクポイントで一時停止される。仮想マシン監視プログラムは、再開命令を受信すると仮想マシンのコードに戻る（Ｓ２７０６）。
【００６２】
図２８は、図２５のＳ２５０２に対応した仮想マシン監視プログラムによるステップイン機能の処理の流れを示すフローチャートである。(Ｓ２８０７でＹＥＳの場合、図２７のＳ２７０３、Ｓ２７０４に相当する処理が入るが、図２７で説明済みであるためここでは省略する。)
仮想マシン監視プログラムは、次に実行するアプリケーションのアドレスを取得し（Ｓ２８０１）、図１６で示したステップ実行管理フラグを参照することにより、ステップインフラグがＯＮであるかどうか判定する（Ｓ２８０２）。ブレイクポイントまたは前回のステップ実行命令で停止させたソースコード行から、次に実行するアプリケーションのアドレスがはずれているかどうかを調べる。
【００６３】
アプリケーションのソースの各行に対応するアドレス領域は、図５で示したアプリケーションのデバッグ情報管理テーブル１を参照して、各アプリケーションのデバッグ情報に記述されたソースの各行に対応した相対アドレス領域に各アプリケーションのコードのロード先アドレス（図４で示したアプリケーションのコード領域）を加算することで計算することができる。
【００６４】
次に実行するアプリケーションのアドレスがここで計算された前回の停止行に対応するアドレス領域からはずれているかどうかを判定し（Ｓ２８０３）、外れていない場合には仮想マシンのコードに戻り、外れていたらステップインフラグをＯＦＦにし（Ｓ２８０４）、仮想マシン監視プログラムの実行を一時停止させて実行再開命令を待つ（Ｓ２８０５）。仮想マシン監視プログラムは、再開命令を受信すると仮想マシンのコードに戻る（Ｓ２８０６）。Ｓ２８０２でステップインフラグが立っていない場合はＳ２８０７に進む。処理プロセスは図２７で説明したブレイクポイントの処理プロセスと同様であるので省略する。
【００６５】
図２９はステップオーバー機能を実現するための仮想マシン監視プログラムの処理の流れを示すフローチャートである。図２５で示したインタープリターを監視する処理（Ｓ２５０２）とフレーム操作処理を監視する処理（Ｓ２５０６）に対応する仮想マシン監視プログラムの処理によりステップオーバー機能を実現する。
【００６６】
なお、ブレイクポイント機能の処理内容については図２７で説明済みであるため本図からは省略してある。ステップオーバーがステップインと異なる点は、アプリケーションの実行がソースの他の行に移る前にメソッドが呼び出されたら、呼び出されたメソッドから処理が戻るまでアプリケーションの実行を停止させない点である。フレームのプッシュ／ポップ操作を監視する仮想マシン監視プログラムの処理（図２５のＳ２５０６）によって、この違いが実現されている。
【００６７】
仮想マシン監視プログラムは監視対象のアドレスがインタープリターのアドレスかどうかを判定し（Ｓ２９０１）、ＹＥＳの場合にはステップオーバーフラグがＯＮかどうか判定する（Ｓ２９０８）。ＮＯの場合には仮想マシンのコードに戻る。ＹＥＳの場合は次に実行するアプリケーションのアドレスを取得して（Ｓ２９０９）、前回アプリケーションを停止させたソースコード行から外れたコードのアドレスかどうかを判定する（Ｓ２９１０）。
【００６８】
Ｓ２９１０の判定でＮＯの場合には仮想マシンのコードに戻る。ＹＥＳの場合はステップオーバーフラグをＯＦＦにして（Ｓ２９１１）、仮想マシン監視プログラムの実行を一時中止させ、実行再開命令を待ち（Ｓ２９１２）、実行再開命令情報を受信する（Ｓ２９１３）と仮想マシンのコードに戻る。
【００６９】
Ｓ２９０１の判定でＮＯの場合には監視対象のアドレスがフレームプッシュ処理のアドレスかどうかを判定し（Ｓ２９０２）、ＹＥＳの場合にはステップオーバーフラグがＯＮ  であるかどうかを判定する（Ｓ２９０５）。ＮＯの場合には仮想マシンのコードに戻る。仮想マシン監視プログラムはステップオーバーフラグがＯＮであることを検出すると、図１７で示したメソッド呼び出し管理テーブル１に登録するレコードの実行停止フラグをＯＮにする（Ｓ２９０６）。続いて、ステップオーバーフラグをＯＦＦに変更して（Ｓ２９０７）から仮想マシンのコードに戻る。
【００７０】
Ｓ２９０７でステップオーバーフラグをＯＦＦに変更するため、インタープリターを監視する処理(図２５のＳ２５０２)においてステップオーバーフラグによってアプリケーションの実行を一時停止させることはなくなる。その後、ステップオーバーフラグがＯＮのときに呼ばれたメソッドから復帰するとき、図２８に示すようにフレームのポップ操作を監視する処理(図２５のＳ２５０６９)においてポップしたフレームの実行停止フラグがＯＮであることを検出し、アプリケーションの実行を再停止させる。
【００７１】
Ｓ２９０２の判定でＮＯの場合には監視対象のアドレスがフレームポップ処理のアドレスかどうかを判定し（Ｓ２９０３）、ＮＯの場合には仮想マシンのコードに戻る。ＹＥＳの場合はポップしたフレームの実行停止フラグがＯＮであるかどうかを判定する（Ｓ２９０４）。ＮＯの場合には仮想マシンのコードに戻り、ＹＥＳの場合はＳ２９１２に進み仮想マシン監視プログラムの実行を一時中止させ、実行再開命令を待つ。
【００７２】
図３０はステップアウト機能を実現するための仮想マシン監視プログラムの処理の流れを示すフローチャートである。図１５に示すように利用者がステップアウト実行コマンドを入力し、仮想マシン監視プログラムはステップアウト実行コマンド情報を受信すると、図１７に示すメソッド呼び出し管理テーブル１を参照し、フレームＩＤが最も大きなレコードの実行停止フラグをＯＮにする。フレームＩＤが最も大きなレコードは、実行中のメソッドから呼び出しもとのメソッドに復帰するときに参照される。したがって、フレームのポップ操作を監視する処理においてポップするフレームの実行停止フラグを調べることで、ステップアウト機能を実現することが可能となる。
【００７３】
仮想マシン監視プログラムは監視対象のアドレスがフレームポップ処理のアドレスかどうかを判定し（Ｓ３００１）、ＹＥＳの場合にはホップしたフレームの実行停止フラグがＯＮかどうか判定する（Ｓ３００２）。ＮＯの場合には仮想マシンのコードに戻る。Ｓ３００２の判定でＹＥＳの場合には仮想マシン監視プログラムの実行を一時停止し、実行再開命令を待ち（Ｓ３００３）、実行再開命令情報を受信する（Ｓ３００４）と仮想マシンのコードに戻る。Ｓ３００２の判定でＮＯの場合には仮想マシンのコードに戻る。
【図面の簡単な説明】
【００７４】
【図１】実施例の全体構成図
【図２】実行監視用の設定データ例
【図３】書き込み実行監視用の設定データ例
【図４】アプリケーションのコード領域例
【図５】アプリケーションのデバッグ情報管理テーブル例１
【図６】アプリケーションのデバッグ情報管理テーブル例２
【図７】アプリケーションのスタティックフィールド領域例
【図８】アプリケーションのデバッグ情報管理テーブル例３
【図９】アプリケーションのインスタンスフィールド領域例
【図１０】アプリケーションのデバッグ情報管理テーブル例４
【図１１】ブレイクポイント設定例の説明図
【図１２】ブレイクポイント監視用テーブル例
【図１３】ステップオーバー実行コマンド入力例の説明図
【図１４】ステップイン実行コマンド入力例の説明図
【図１５】ステップアウト実行コマンド入力例の説明図
【図１６】ステップ実行管理フラグ例
【図１７】メソッド呼び出し管理テーブル例１
【図１８】メソッド呼び出し管理テーブル例２
【図１９】アプリケーションのデバッグ情報管理テーブル例５
【図２０】アプリケーションのデバッグ情報管理テーブル例６
【図２１】インスタンス配置テーブル例
【図２２】インスタンス値管理テーブル例
【図２３】スタティックフィールド値管理テーブル例
【図２４】仮想マシンデバッグ処理の流れ
【図２５】実行監視処理の流れ
【図２６】書き込み監視処理の流れ
【図２７】ブレイクポイント処理の流れ
【図２８】ステップイン処理の流れ
【図２９】ステップオーバー処理の流れ
【図３０】ステップアウト処理の流れ
【図３１】仮想マシンのデバッグ手順例
【符号の説明】
【００７５】
１      仮想マシンデバッグ装置
２      外部記憶装置
１０      シミュレータ
１１      仮想マシン
１２      アプリケーションプログラム
２１      デバッグ情報ファイル
２１      監視情報ファイル
１００      仮想マシン監視プログラム
１０１      デバッグ情報入力手段
１０２      監視アドレス判定手段
１０３      デバッグ処理判定手段
１０４      監視対象処理手段
【図１】
2008191907.tif 000003
【図２】
2008191907.tif 000004
【図３】
2008191907.tif 000005
【図４】
2008191907.tif 000006
【図５】
2008191907.tif 000007
【図６】
2008191907.tif 000008
【図７】
2008191907.tif 000009
【図８】
2008191907.tif 000010
【図９】
2008191907.tif 000011
【図１０】
2008191907.tif 000012
【図１１】
2008191907.tif 000013
【図１２】
2008191907.tif 000014
【図１３】
2008191907.tif 000015
【図１４】
2008191907.tif 000016
【図１５】
2008191907.tif 000017
【図１６】
2008191907.tif 000018
【図１７】
2008191907.tif 000019
【図１８】
2008191907.tif 000020
【図１９】
2008191907.tif 000021
【図２０】
2008191907.tif 000022
【図２１】
2008191907.tif 000023
【図２２】
2008191907.tif 000024
【図２３】
2008191907.tif 000025
【図２４】
2008191907.tif 000026
【図２５】
2008191907.tif 000027
【図２６】
2008191907.tif 000028
【図２７】
2008191907.tif 000029
【図２８】
2008191907.tif 000030
【図２９】
2008191907.tif 000031
【図３０】
2008191907.tif 000032
【図３１】
2008191907.tif 000033