(57)【要約】【課題】相互に関連して実行される複数のスレッドに対して、当該複数のスレッドのうち一部のスレッドに対するデバッグを行う場合に、信頼性の高いデバッグを行うことのできるスレッドデバッグ装置を提供する。【解決手段】相互に関連して実行される複数のスレッドのうちデバッグ対象となる少なくとも１つの対象スレッドの、少なくとも一部の処理を、ターゲットコンピュータ２０に実行させるとともに、前記複数のスレッドのうち前記対象スレッドを除いた対象外スレッドを、前記対象スレッドの実行中に、ターゲットコンピュータ２０の少なくとも一部のハードウェア資源へのアクセスを制限しつつ、ターゲットコンピュータ２０に実行させるスレッドデバッグ装置である。【選択図】図１
2007128132.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータ上で相互に関連して実行される複数のスレッドに対して、当該複数のスレッドのうち一部のスレッドに対するデバッグを行うスレッドデバッグ装置であって、
前記複数のスレッドのうちデバッグ対象となる少なくとも１つの対象スレッドの、少なくとも一部の処理を、前記コンピュータに実行させる対象スレッド実行手段と、
前記複数のスレッドのうち前記対象スレッドを除いた対象外スレッドを、前記対象スレッド実行手段による前記対象スレッドの実行中に、前記コンピュータの少なくとも一部のハードウェア資源へのアクセスを制限しつつ、前記コンピュータに実行させる対象外スレッド実行手段と、
を含むことを特徴とするスレッドデバッグ装置。
【請求項２】
請求項１に記載のスレッドデバッグ装置において、
前記対象外スレッドのそれぞれに、自分自身にジャンプする処理を実行する命令を埋め込む命令埋め込み手段をさらに含み、
前記対象外スレッド実行手段は、前記対象外スレッドに前記埋め込まれた命令を実行させることで、前記ハードウェア資源へのアクセスを制限することを特徴とするスレッドデバッグ装置。
【請求項３】
請求項２に記載のスレッドデバッグ装置において、
前記複数のスレッドに含まれる各スレッドと、当該各スレッドに対して前記命令埋め込み手段による命令の埋め込みを行ったか否かを表す情報と、を対応づけるスレッドテーブルを保持するテーブル保持手段をさらに含み、
前記対象スレッド実行手段は、前記スレッドテーブルに基づいて、前記対象外スレッドの全てに対して、前記命令埋め込み手段による命令の埋め込みを行ったと判定した場合に、前記対象スレッドを前記コンピュータに実行させることを特徴とするスレッドデバッグ装置。
【請求項４】
請求項１乃至３のいずれか一項に記載のスレッドデバッグ装置において、
前記複数のスレッドは、同時期にそれぞれ前記コンピュータが備える複数のプロセッサのいずれかに割り当てられて実行され、前記各スレッドが割り当てられた前記プロセッサ内のハードウェア資源を互いに参照できるように、前記各スレッドが参照するアドレス空間に前記プロセッサ内のハードウェア資源をマッピングすることを特徴とするスレッドデバッグ装置。
【請求項５】
コンピュータ上で相互に関連して実行される複数のスレッドであって、それぞれ所定の命令列を順次実行する複数のスレッドに対して、当該複数のスレッドのうち一部のスレッドに対するデバッグを行うスレッドデバッグ装置であって、
前記複数のスレッドのうちデバッグ対象となる少なくとも１つの対象スレッドの、少なくとも一部の処理を、前記コンピュータに実行させる対象スレッド実行手段と、
前記複数のスレッドのうち前記対象スレッドを除いた対象外スレッドを、前記対象スレッド実行手段による前記対象スレッドの実行中に、当該対象外スレッドの命令列の処理の進行を制限しつつ、前記コンピュータに実行させる対象外スレッド実行手段と、
を含むことを特徴とするスレッドデバッグ装置。
【請求項６】
コンピュータ上で相互に関連して実行される複数のスレッドに対して、当該複数のスレッドのうち一部のスレッドに対するデバッグを行うスレッドデバッグ方法であって、
前記複数のスレッドのうちデバッグ対象となる少なくとも１つの対象スレッドの、少なくとも一部の処理を、前記コンピュータに実行させる第１のステップと、
前記複数のスレッドのうち前記対象スレッドを除いた対象外スレッドを、前記第１のステップによる前記対象スレッドの実行中に、前記コンピュータの少なくとも一部のハードウェア資源へのアクセスを制限しつつ、前記コンピュータに実行させる第２のステップと、
を含むことを特徴とするスレッドデバッグ方法。
【請求項７】
コンピュータ上で相互に関連して実行される複数のスレッドに対して、当該複数のスレッドのうち一部のスレッドに対するデバッグを行うプログラムであって、
前記複数のスレッドのうちデバッグ対象となる少なくとも１つの対象スレッドの、少なくとも一部の処理を、前記コンピュータに実行させる対象スレッド実行手段、及び
前記複数のスレッドのうち前記対象スレッドを除いた対象外スレッドを、前記対象スレッド実行手段による前記対象スレッドの実行中に、前記コンピュータの少なくとも一部のハードウェア資源へのアクセスを制限しつつ、前記コンピュータに実行させる対象外スレッド実行手段、
としてコンピュータを機能させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータ上で相互に関連して実行される複数のスレッドに対して、当該複数のスレッドのうち一部のスレッドに対するデバッグを行うスレッドデバッグ装置、スレッドデバッグ方法及びプログラムに関する。
【背景技術】
【０００２】
デバッガは、コンピュータプログラムの不具合（バグ）発見を支援するコンピュータプログラムである。デバッガを用いることにより、ユーザは任意にソースプログラム中にブレークポイントを設定して、当該ブレークポイントに対応する命令箇所でプログラムの実行を中断させたり、中断させたプログラムの実行を再開させたりすることができる。また、決まった処理量（例えばソースプログラムにおける１ステップに相当する命令）ずつプログラムを実行させたり、プログラム実行中や中断中にレジスタやメモリに格納されたデータの内容を確認したりすることもできる。
【０００３】
特に、ＧＤＢ（The GNU Source-Level Debugger）を用いたデバッガは、コンピュータ上で実行される複数のスレッドやプロセスなどのうち一部又は全部を任意に指定して、それら指定されたスレッドやプロセスの実行を中断又は再開させたり、それらの実行を所定の処理量ずつ行わせたりすることができる（非特許文献１参照）。
【非特許文献１】リチャード  ストールマン、ローランド  ペッシュ、スタン  シェブス他、“Debugging with GDB”、[online]、平成12年3月、[平成17年9月22日検索]、インターネット<URL: http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gdb-5.0/gdb-ja_toc.html>
【発明の開示】
【発明が解決しようとする課題】
【０００４】
しかしながら、上記従来例の技術を相互に関連して動作する複数のスレッド群の一部に対して適用すると、不都合が生じる場合がある。すなわち、相互に関連して動作する複数のスレッド群のうち、デバッグ対象となる一部のスレッドだけを実行させた場合、当該デバッグ対象スレッドの実行環境は、本来の実行環境とは大きく異なってしまう。なぜなら、デバッグの対象外であるスレッドが実行されないため、これらのスレッドとの間で共有されるメモリ上のデータなどが参照できなくなったり、デバッグ対象スレッドが参照するアドレス空間自体が、スレッド間で共有されるハードウェア資源がマッピングされずに本来のものと異なるものになったりするためである。
【０００５】
一方で、本来の実行環境に近い実行環境でデバッグするために、相互に関連して動作する複数のスレッド群を同時期に実行させることとすると、デバッグ対象以外のスレッドがコンピュータ上のメモリなどのハードウェア資源にアクセスし、例えば共通して参照する変数の書き換えなどを行ってしまう。そのため、例えばある時点以降におけるデバッグ対象スレッドのみの処理内容を検証しようとしても、正しくデバッグ対象スレッドのみの動作を追跡することができない。
【０００６】
本発明は上記実情に鑑みてなされたものであって、その目的の一つは、相互に関連して実行される複数のスレッドに対して、当該複数のスレッドのうち一部のスレッドに対するデバッグを行う場合に、信頼性の高いデバッグを行うことのできるスレッドデバッグ装置、スレッドデバッグ方法及びプログラムを提供することにある。
【課題を解決するための手段】
【０００７】
上記課題を解決するための本発明に係るスレッドデバッグ装置は、コンピュータ上で相互に関連して実行される複数のスレッドに対して、当該複数のスレッドのうち一部のスレッドに対するデバッグを行うスレッドデバッグ装置であって、前記複数のスレッドのうちデバッグ対象となる少なくとも１つの対象スレッドの、少なくとも一部の処理を、前記コンピュータに実行させる対象スレッド実行手段と、前記複数のスレッドのうち前記対象スレッドを除いた対象外スレッドを、前記対象スレッド実行手段による前記対象スレッドの実行中に、前記コンピュータの少なくとも一部のハードウェア資源へのアクセスを制限しつつ、前記コンピュータに実行させる対象外スレッド実行手段と、を含むことを特徴とする。
【０００８】
これにより、本発明に係るスレッドデバッグ装置は、デバッグ対象スレッドの実行中に、デバッグ対象スレッドと相互に関連するスレッドを、ハードウェア資源へのアクセスを制限しつつ実行させることで、信頼性の高いデバッグを行うことができる。
【０００９】
また、上記スレッドデバッグ装置は、前記対象外スレッドのそれぞれに、自分自身にジャンプする処理を実行する命令を埋め込む命令埋め込み手段をさらに含み、前記対象外スレッド実行手段は、前記対象外スレッドに前記埋め込まれた命令を実行させることで、前記ハードウェア資源へのアクセスを制限することとしてもよい。これにより、本発明に係るスレッドデバッグ装置は、デバッグ対象外のスレッドに対して簡易な処理でハードウェア資源へのアクセスを制限することができる。
【００１０】
さらに、上記スレッドデバッグ装置は、前記複数のスレッドに含まれる各スレッドと、当該各スレッドに対して前記命令埋め込み手段による命令の埋め込みを行ったか否かを表す情報と、を対応づけるスレッドテーブルを保持するテーブル保持手段をさらに含み、前記対象スレッド実行手段は、前記スレッドテーブルに基づいて、前記対象外スレッドの全てに対して、前記命令埋め込み手段による命令の埋め込みを行ったと判定した場合に、前記対象スレッドを前記コンピュータに実行させることとしてもよい。これにより、本発明に係るスレッドデバッグ装置は、例えば各スレッドに対する命令の埋め込みを独立したデバッグプログラムが実行する場合であっても、デバッグ対象外のスレッドに命令を埋め込んで各スレッドを実行させる準備が完了するのを待って、各スレッドを実行させることができる。
【００１１】
また、本発明に係るスレッドデバッグ装置において、前記複数のスレッドは、同時期にそれぞれ前記コンピュータが備える複数のプロセッサのいずれかに割り当てられて実行され、前記各スレッドが割り当てられた前記プロセッサ内のハードウェア資源を互いに参照できるように、前記各スレッドが参照するアドレス空間に前記プロセッサ内のハードウェア資源をマッピングすることとしてもよい。これにより、例えば同時実行させる複数のスレッドによりパイプライン処理などを実現するなどの場合において、信頼性の高いデバッグを行うことができる。
【００１２】
また、本発明に係る他のスレッドデバッグ装置は、コンピュータ上で相互に関連して実行される複数のスレッドであって、それぞれ所定の命令列を順次実行する複数のスレッドに対して、当該複数のスレッドのうち一部のスレッドに対するデバッグを行うスレッドデバッグ装置であって、前記複数のスレッドのうちデバッグ対象となる少なくとも１つの対象スレッドの、少なくとも一部の処理を、前記コンピュータに実行させる対象スレッド実行手段と、前記複数のスレッドのうち前記対象スレッドを除いた対象外スレッドを、前記対象スレッド実行手段による前記対象スレッドの実行中に、当該対象外スレッドの命令列の処理の進行を制限しつつ、前記コンピュータに実行させる対象外スレッド実行手段と、を含むことを特徴とする。これにより、対象外スレッドの所定の命令箇所以降の命令を実行させないこととなり、複数スレッドを実行する環境におけるデバッグ対象スレッドのみの処理内容を検証でき、信頼性の高いデバッグを行うことができる。
【００１３】
また、本発明に係るスレッドデバッグ方法は、コンピュータ上で相互に関連して実行される複数のスレッドに対して、当該複数のスレッドのうち一部のスレッドに対するデバッグを行うスレッドデバッグ方法であって、前記複数のスレッドのうちデバッグ対象となる少なくとも１つの対象スレッドの、少なくとも一部の処理を、前記コンピュータに実行させる第１のステップと、前記複数のスレッドのうち前記対象スレッドを除いた対象外スレッドを、前記第１のステップによる前記対象スレッドの実行中に、前記コンピュータの少なくとも一部のハードウェア資源へのアクセスを制限しつつ、前記コンピュータに実行させる第２のステップと、を含むことを特徴とする。
【００１４】
また、本発明に係るプログラムは、コンピュータ上で相互に関連して実行される複数のスレッドに対して、当該複数のスレッドのうち一部のスレッドに対するデバッグを行うプログラムであって、前記複数のスレッドのうちデバッグ対象となる少なくとも１つの対象スレッドの、少なくとも一部の処理を、前記コンピュータに実行させる対象スレッド実行手段、及び前記複数のスレッドのうち前記対象スレッドを除いた対象外スレッドを、前記対象スレッド実行手段による前記対象スレッドの実行中に、前記コンピュータの少なくとも一部のハードウェア資源へのアクセスを制限しつつ、前記コンピュータに実行させる対象外スレッド実行手段、としてコンピュータを機能させることを特徴とする。
【発明を実施するための最良の形態】
【００１５】
以下、本発明の好適な実施の形態について、図面を参照しながら説明する。
【００１６】
図１は、本発明の一実施形態に係るプログラム開発環境の一例を表す図である。このプログラム開発環境１０は、本発明の一実施形態に係るプログラムデバッグ方法を適用したものであり、図示しないデータ通信ネットワークによって接続されたターゲットコンピュータ２０及びホストコンピュータ３０を含んで構成されている。
【００１７】
ターゲットコンピュータ２０は、ホストコンピュータ３０によるデバッグの対象となる複数のスレッドを含むプログラムが実行されるコンピュータである。また、ホストコンピュータ３０は、本発明の一実施形態に係るスレッドデバッグ装置として機能し、ターゲットコンピュータ２０上で実行されるスレッドのデバッグを行うためのコンピュータである。これらのコンピュータとしては、例えば公知のパーソナルコンピュータシステムやワークステーション、あるいはプログラムを実行可能なゲーム機等を用いることができる。
【００１８】
また、ここでは、ターゲットコンピュータ２０は、複数のプロセッサユニット（ＰＵ）を含んで構成されているものとする。ＰＵは、当該ＰＵに割り当てられたスレッドなどのプログラムに含まれる命令を実行するプロセッサと、当該プロセッサからデータの読み書きが可能なローカルメモリとを含む。
【００１９】
ターゲットコンピュータ２０においては、ＯＳ（オペレーティングシステム）２１が動作している。また、ＯＳ２１上で、ユーザアプリケーションプログラム２２とデバッグエージェントプログラム２３が実行される。ユーザアプリケーションプログラム２２は、複数のスレッドを実行するプログラムであり、ユーザのデバッグ作業の対象となる。ＯＳ２１は、これら複数のスレッドを、所定の順序及びタイミングにより複数のＰＵのいずれかに割り当てるスケジューリング処理を実行する。これにより、複数のスレッドは、ターゲットコンピュータ２０上において同時期に実行されることができる。
【００２０】
デバッグエージェントプログラム２３は、ＯＳ２１上で動作する一種のアプリケーションプログラムであって、ホストコンピュータ３０からの制御に従って動作し、またＯＳ２１から取得したデバッグ用の各種データをホストコンピュータ３０に対して送信する。ＯＳ２１は各種デバッグ用のライブラリプログラムを含んでおり、デバッグエージェントプログラム２３はこれらのプログラムを利用してユーザアプリケーションプログラム２２に対してスレッドの実行中断や実行再開などの制御を実行したり、メモリやレジスタの内容確認等を行ったりすることができる。また、デバッグエージェントプログラム２３は、ユーザアプリケーションプログラム２２の処理が予め設定したブレークポイントに到達したことや、プログラム例外の発生、ステップ実行の終了などのイベントを監視し、所定のイベントを検知した場合にホストコンピュータ３０に通知する。
【００２１】
ホストコンピュータ３０においては、ＯＳ３１が動作している。また、ＯＳ３１上で、デバッグ通信プログラム３２とホストデバッガプログラム３３が実行される。デバッグ通信プログラム３２は、ホストデバッガプログラム３３とデバッグエージェントプログラム２３とのデータ通信を中継するものであり、ホストデバッガプログラム３３からの制御命令などのデータをデバッグエージェントプログラム２３により処理可能な形式に変換してデータ通信ネットワーク経由で送信する。また、デバッグエージェントプログラム２３から送信されたデータをデータ通信ネットワーク経由で受信し、ホストデバッガプログラム３３で処理可能な形式に変換してホストデバッガプログラム３３に対して出力する。
【００２２】
ホストデバッガプログラム３３は、ユーザアプリケーションプログラム２２のデバッグ作業を行うための一種のアプリケーションプログラムであり、ユーザアプリケーションプログラム２２によって起動される複数のスレッドのうち一部又は全部を指定して、その実行中断や実行再開を指示することができる。また、ユーザアプリケーションプログラム２２のソースコード中の任意の位置に対応する命令箇所にブレークポイントを設定したり、ターゲットコンピュータ２０のメモリやレジスタにデータを書き込んだり、またそこからデータを読み出したりすることができる。さらに、ターゲットコンピュータ２０のメモリやレジスタを参照することで、スレッドリストの取得やスレッドの状態に関する情報の取得を行うことができる。
【００２３】
なお、ここでは、ホストデバッガプログラム３３は、少なくとも一つのプロセッサユニット（ＰＵ）デバッガ３４と、統合開発環境プログラム３５と、を含んで構成されているものとする。ＰＵデバッガ３４は、ターゲットコンピュータ２０が備える複数のＰＵのうち少なくとも一部のＰＵに１対１で対応するデバッガプログラムである。ＰＵデバッガ３４は、それぞれ対応するＰＵに割り当てられて実行されているユーザアプリケーションプログラム２２のスレッドに対して、制御命令等を発行することによりデバッグ処理を行う。また、統合開発環境プログラム３５は、ユーザに統合開発環境を提供するアプリケーションプログラムであって、本実施の形態においてはＰＵデバッガ３４とユーザとの間のインタフェースの役割を果たす。具体的に、統合開発環境プログラム３５は、ユーザからのデバッグ指示を行う操作を受け付けて、その指示内容に応じた制御命令等のデータを各ＰＵデバッガ３４に対して出力する。また各ＰＵデバッガ３４が取得した対応するスレッドの状態や各スレッドが参照するメモリやレジスタの内容等の情報を、ホストコンピュータ３０に接続されたディスプレイ等に出力する制御を行う。
【００２４】
また、ホストコンピュータ３０は、デバッグ通信プログラム３２により読み書き可能なスレッドテーブルを保持している。スレッドテーブルは、例えば図２（ａ）の例により表されるような内容を含んだデータベースである。図２（ａ）の例においては、スレッドテーブルは、スレッド識別子と、スレッドグループ識別子と、プロセス識別子と、ＴＣＰソケット番号と、当該スレッドの制御情報とを対応づけて保持している。
【００２５】
ここで、スレッド識別子は各スレッドを識別する識別情報であって、ＯＳ２１上で実行されているスレッドごとに一意の値となる。また、スレッドグループ識別子は、複数のスレッドがＯＳ２１上でグループとして管理されている場合に、各スレッドの属するスレッドグループを識別する識別情報である。また、プロセス識別子は当該スレッドを起動したプロセスを識別する識別情報である。これらの識別子の情報は、デバッグエージェントプログラム２３から取得できる。また、ＴＣＰソケット番号は、各スレッドを制御するＰＵデバッガ３４と通信するためのＴＣＰソケットを表す番号である。さらに、スレッドの制御情報は、ＰＵデバッガ３４から出力される各スレッドに対する制御命令と、デバッグエージェントプログラム２３から送信されるスレッドの状態に関する情報と、の少なくとも一方に基づいて更新される情報であって、当該スレッドを制御可能な接続が確立しているか否かの情報を含むスレッドの制御のために用いられる情報である。
【００２６】
以下では、プログラム開発環境１０による処理の一例について、タイムチャートに基づいて説明する。なお、以下の説明においては、ユーザアプリケーションプログラム２２に含まれる複数のスレッドは、それぞれ所定の命令列を順次実行するプログラムであるとする。また、一例として、ユーザアプリケーションプログラム２２に含まれる複数のスレッドのうち、スレッドＴａ、スレッドＴｂ及びスレッドＴｃの３つのスレッドが相互に関連するものであるとする。
【００２７】
具体的には、これら相互に関連する３つのスレッドはスレッドグループＧに属している。ＯＳ２１は、スレッドグループＧに属するこれら全てのスレッドを、同時期にそれぞれ複数のＰＵのいずれかに割り当てて実行させるように制御するものとする。また、これらのスレッドは、割り当てられたＰＵ内の例えばローカルメモリ等のハードウェア資源を互いに参照できるように、各スレッドが参照するアドレス空間に、同一スレッドグループに属するスレッドで共有されるハードウェア資源をマッピングしているものとする。このように同一スレッドグループに属するスレッドの動作を制御することにより、複数のスレッドによりパイプライン処理などを実現する場合に、処理の効率化を図ることができる。
【００２８】
なお、以下では、スレッドＴａが割り当てられたＰＵに対応するＰＵデバッガをＰＵデバッガ３４ａ、スレッドＴｂが割り当てられたＰＵに対応するＰＵデバッガをＰＵデバッガ３４ｂ、スレッドＴｃが割り当てられたＰＵに対応するＰＵデバッガをＰＵデバッガ３４ｃと表記することとする。また、スレッドＴａ、スレッドＴｂ及びスレッドＴｃは、それぞれ図２のスレッドテーブルにおいて、No.が１，２，及び３のスレッドに対応しているものとする。
【００２９】
まず、ユーザからの指示に基づいて、スレッドＴａの所定の命令箇所にブレークポイントを設定して、スレッドグループＧに属する３つのスレッドを実行させる場合の例について、図３のタイムチャートに基づいて説明する。
【００３０】
ユーザからの指示を受け付けた統合開発環境プログラム３５は、まずブレークポイント設定の対象となるスレッド（対象スレッド）が、複数のスレッドを含んだスレッドグループに属するスレッドであるか否かを判定する。具体的に、統合開発環境プログラム３５は、ホストコンピュータ３０が保持するスレッドテーブルを参照して、対象スレッドのスレッドグループ識別子を取得する。そして、スレッドテーブルから、当該スレッドグループ識別子と同じスレッドグループ識別子を持つスレッドの情報を取得する。同じスレッドグループ識別子を持つスレッドがなければ、スレッドグループに属するスレッドの制御は必要ないので、統合開発環境プログラム３５は対象スレッドに対応するＰＵデバッガ３４に対して通常のブレークポイント設定の指示命令を出力する。一方、同じスレッドグループ識別子を持つスレッドが対象スレッドの他にある場合、以下に説明するように、スレッドグループに属する各スレッドに対して指示命令の出力を行う。
【００３１】
ユーザからの指示の対象となった対象スレッドが複数のスレッドを含むスレッドグループに属している場合、統合開発環境プログラム３５は、ユーザからの指示に応じて、各ＰＵデバッガ３４向けの指示命令を出力する（Ｓ１）。具体的に、統合開発環境プログラム３５は、デバッグ対象となる対象スレッドであるスレッドＴａに対応するＰＵデバッガ３４ａに対しては、ブレークポイントを設定させる命令を出力する。一方、スレッドグループＧに属するスレッドのうち、デバッグ対象を除いた対象外スレッドであるスレッドＴｂ及びＴｃに対応するＰＵデバッガ３４ｂ及び３４ｃに対しては、ハードウェア資源へのアクセスを制限させるための命令埋め込みを実行させる命令を出力する。
【００３２】
Ｓ１の処理により出力された命令を受け取ったＰＵデバッガ３４ａは、まずスレッドＴａにブレークポイントを設定する旨の制御命令を、ブレークポイントを設定する位置の情報とともにデバッグ通信プログラム３２に対して出力する（Ｓ２）。ここで、ブレークポイントを設定する位置の情報は、ユーザの指定したソースコード上の位置に対応するスレッドＴａの命令箇所を表すプログラムカウンタの値である。
【００３３】
この制御命令を受け取ったデバッグ通信プログラム３２は、当該制御命令をデバッグエージェントプログラム２３で処理可能な形式に変換して、デバッグエージェントプログラム２３に対して送信する（Ｓ３）。デバッグエージェントプログラム２３は、受信した制御命令に応じて、スレッドＴａのプログラムの指示された命令箇所に、ブレークポイントを設定する（Ｓ４）。
【００３４】
また、ＰＵデバッガ３４ａは、Ｓ２の処理に続いて、スレッドＴａの実行開始を指示する制御命令を、デバッグ通信プログラム３２に対して出力する（Ｓ５）。ここで、ＰＵデバッガ３４ａは、スレッドＴａの実行前に必要なブレークポイント設定の命令は既に出力しているので、続けてスレッドＴａの実行を開始する制御命令を出力してしまう。しかし、デバッグ通信プログラム３２は、そのままスレッドＴａの実行を開始する制御命令をデバッグエージェントプログラム２３に送信するわけではなく、まずスレッドテーブルにおけるスレッドＴａの制御情報を更新する（Ｓ６）。具体的に、デバッグ通信プログラム３２は、スレッドＴａの制御情報を、スレッドＴａに対して実行開始を指示する制御命令を受け取ったことを表す情報（ここでは「cont」とする）を含むものに更新する。これにより、スレッドテーブルの内容は例えば図２（ｂ）に示すようなものになる。
【００３５】
一方、Ｓ１の処理により出力された命令を受け取ったＰＵデバッガ３４ｂは、スレッドＴｂのハードウェア資源へのアクセスを制限するための命令埋め込みを行わせる制御命令を、デバッグ通信プログラム３２に対して出力する（Ｓ７）。なお、この制御命令は、スレッドＴｂにおいて命令を埋め込む位置を表すプログラムカウンタの値などの情報を含んでもよい。この制御命令を受け取ったデバッグ通信プログラム３２は、スレッドテーブルにおけるスレッドＴｂの制御情報を更新する（Ｓ８）。具体的に、デバッグ通信プログラム３２は、スレッドＴｂの制御情報を、スレッドＴｂに対して命令埋め込みを行う制御命令を受け取ったことを表す情報（ここでは「lcont」とする）を含むものに更新する。これにより、スレッドテーブルの内容は例えば図２（ｃ）に示すようなものになる。
【００３６】
さらに、デバッグ通信プログラム３２は、Ｓ７の処理により出力された制御命令をデバッグエージェントプログラム２３で処理可能な形式に変換して、デバッグエージェントプログラム２３に対して送信する（Ｓ９）。デバッグエージェントプログラム２３は、受信した制御命令に応じて、スレッドＴｂのプログラムの所定の命令箇所に、所定の命令を埋め込む（Ｓ１０）。
【００３７】
ここで、ＰＵデバッガ３４ｂからの制御命令に基づいて、スレッドＴｂに埋め込まれる命令について説明する。この命令は、スレッドＴｂによるターゲットコンピュータ２０の少なくとも一部のハードウェア資源へのアクセスを制限するためのものである。具体的には、この命令の埋め込みにより、例えばスレッドグループＧに属するスレッドが共通して参照する、ＰＵ内のローカルメモリやＰＵ外のメモリ、その他のディスクドライブなどの記憶装置等に対するスレッドＴｂのアクセスを制限する。
【００３８】
埋め込まれる命令は、メモリ等へのアクセスを行わない例えば単に演算を行う命令などであってもよいが、この場合スレッドＴｂにおいて実行される全ての命令をこのような命令で置き換える必要がある。そのため、ここでは、自分自身にジャンプする処理を実行するループ命令を埋め込むこととする。これは、例えば「ＢＲ  ００」などの形式で表される命令であり、この場合のＢＲは指定された位置の命令箇所にジャンプする命令であること、００はジャンプする位置が現在の命令箇所に対して相対的に０であることを表している。このようなループ命令を埋め込んで実行させることにより、スレッドＴｂが実行する処理はこの命令箇所において自分自身に対するループを繰り返すこととなり、埋め込まれた命令箇所以降の処理命令は、実行されない。これにより、スレッドＴｂの命令列のうち１箇所に命令を埋め込むことで、メモリ等のハードウェア資源へのスレッドＴｂのアクセスを制限できる。
【００３９】
ここで、命令を埋め込む箇所は、スレッドＴｂにおいて次に実行される命令箇所とする。そうすれば、スレッドＴｂの実行を開始した後、スレッドＴｂは直ちにループ処理を繰り返し、メモリ等のハードウェア資源に対するアクセスは行わないことになる。ここで、次に実行される命令の箇所は、前述したようにＳ７の処理でＰＵデバッガ３４ｂが指定してもよいし、デバッグエージェントプログラム２３がＰＵにおいて管理されているプログラムカウンタの値などを参照することで取得してもよい。
【００４０】
また、このループ命令は、スレッドＴｂの命令列の処理の進行を制限するためのものでもある。これにより、スレッドＴｂのループ命令を埋め込んだ箇所以降の命令列の実行を制限でき、スレッドＴａの処理に影響を与えるようなスレッドＴｂの処理を実行させないことができる。なお、ここで説明したループ命令の埋め込みに代えて、次にＰＵが実行する命令列のアドレスを表すプログラムカウンタの値を制御するなど、他の方法によりスレッドＴｂの命令列の処理の進行を制限することとしてもよい。
【００４１】
一方、ＰＵデバッガ３４ｃは、ＰＵデバッガ３４ｂと同様に、スレッドＴｃにハードウェア資源へのアクセスを制限するための命令埋め込みを行う制御命令を、デバッグ通信プログラム３２に対して出力する（Ｓ１１）。この制御命令を受け取ったデバッグ通信プログラム３２は、スレッドテーブルにおけるスレッドＴｃの制御情報を更新する（Ｓ１２）。これにより、スレッドテーブルの内容は例えば図２（ｄ）に示すようなものになる。
【００４２】
さらに、デバッグ通信プログラム３２は、Ｓ１１の処理で出力された制御命令をデバッグエージェントプログラム２３に送信し（Ｓ１３）、デバッグエージェントプログラム２３は、受信した制御命令に応じて、スレッドＴｃに対してスレッドＴｂの場合と同様にループ命令の埋め込みを実行する（Ｓ１４）。
【００４３】
ここで、前述したＳ６、Ｓ８及びＳ１２の処理により、デバッグ通信プログラム３２はスレッドテーブルにおけるスレッドグループＧに属する各スレッドの制御情報を更新している。デバッグ通信プログラム３２は、各スレッドの制御情報を、当該スレッドを実行開始可能な状態になったことを示す情報（ここでは、cont又はlcontを含む情報）に更新したタイミングで、スレッドテーブルを参照し、スレッドグループＧに属する各スレッドの実行を開始させるか否かの判定を行う。
【００４４】
具体的には、デバッグ通信プログラム３２は、制御情報を更新したスレッドのスレッドグループ識別子を取得し、取得したスレッドグループ識別子と同一のスレッドグループ識別子を持つ各スレッドの制御情報を取得する。そして、取得した各スレッドの制御情報が全てcont又はlcontのいずれかを含んでいる場合、デバッグ通信プログラム３２は、同一スレッドグループに属する全てのスレッドを実行させる準備が整ったと判定する。
【００４５】
図３に示すタイムチャートにおいては、Ｓ１２の処理により、図２（ｄ）に示すようにスレッドグループＧに属する３つのスレッドの制御情報が全てcont又はlcontのいずれかを含むものになる。よって、デバッグ通信プログラム３２は、この処理の後に、スレッドグループＧに属するスレッドの実行を開始する制御命令をデバッグエージェントプログラム２３に対して送信する（Ｓ１５）。これにより、デバッグエージェントプログラム２３は、スレッドグループＧに属するスレッドＴａ、Ｔｂ及びＴｃの実行を開始させる（Ｓ１６）。
【００４６】
以上説明したように、デバッグ通信プログラム３２は、各スレッドに対する制御命令に基づいてスレッドテーブルを更新し、同一スレッドグループに属するスレッドについてのスレッドテーブル上の制御情報に基づいて、スレッドの実行を開始させる制御命令をデバッグエージェントプログラム２３に送信するか否かの判定を行う。これにより、各スレッドに対するデバッグ処理の制御をそれぞれ独立したＰＵデバッガが行う場合であっても、同一スレッドグループに属するスレッドの制御を望ましいタイミングで行うことができる。
【００４７】
次に、以上説明した例によりブレークポイントを設定した命令箇所までスレッドＴａの処理が実行された場合に、当該ブレークポイントの到来をトリガとしてプログラム開発環境１０により実行される処理の例について、図４のタイムチャートに基づいて説明する。
【００４８】
まず、デバッグエージェントプログラム２３は、スレッドＴａにおけるブレークポイント到来のイベントを検知すると、これに応じてスレッドＴａの実行を停止させる（Ｓ２１）。なお、このとき、スレッドＴａの実行が停止されると、ＯＳ２１によりスレッドＴａと同時期に実行されるように制御されているスレッドグループＧに属するスレッドＴｂ及びスレッドＴｃについても、その実行が停止される。
【００４９】
続いて、デバッグエージェントプログラム２３は、当該イベントの発生を示す情報をデバッグ通信プログラム３２に対して送信する（Ｓ２２）。イベント発生の情報を受信したデバッグ通信プログラム３２は、この情報をイベントの発生したスレッドＴａに対応するＰＵデバッガ３４ａに対して出力する（Ｓ２３）。
【００５０】
スレッドＴａが停止したことを通知する情報を受け取ったＰＵデバッガ３４ａは、スレッドＴａの属するスレッドグループＧの停止に応じた処理を実行させる制御命令をデバッグ通信プログラム３２に対して出力する（Ｓ２４）。この制御命令は、実際にターゲットコンピュータ２０上におけるスレッドの実行を停止させるものではなく、ホストコンピュータ３０上でスレッドの実行停止に応じた処理を実行するために必要となる。なぜなら、スレッドグループＧに属するスレッドＴｂ及びスレッドＴｃは、ブレークポイント到来にもスレッドの終了にもよらずに、ＯＳ２１の制御により実行が停止されているため、スレッドＴａの場合と異なり、実行停止をホストコンピュータ３０に対して通知するためのイベントが発生しないためである。
【００５１】
Ｓ２４の処理によるスレッドグループＧの停止の通知を受け取ったデバッグ通信プログラム３２は、スレッドテーブルにおける各スレッドの制御情報を更新する（Ｓ２５）。具体的には、スレッドグループＧに属する各スレッドの制御情報を、スレッドの実行が停止していることを表す情報（ここでは「stop」とする）を含んだものに更新する。これにより、スレッドテーブルの内容は、図２（ａ）に示すようなものに戻る。
【００５２】
続いて、デバッグ通信プログラム３２は、スレッドグループＧに属するスレッドＴａを除いた各スレッドについて、対応するＰＵデバッガ３４に対してスレッドの停止を通知する情報を出力する（Ｓ２６）。具体的には、スレッドＴｂが停止したことをＰＵデバッガ３４ｂに対して通知し、スレッドＴｃが停止したことをＰＵデバッガ３４ｃに対して通知する。
【００５３】
Ｓ２３及びＳ２６の処理により、対応するスレッドが停止したことの通知を受け取った各ＰＵデバッガ３４は、それぞれ統合開発環境プログラム３５に対して各スレッドの現在の状態に関する情報などを出力する（Ｓ２７、Ｓ２８及びＳ２９）。これにより、統合開発環境プログラム３５は、ユーザに提示する各スレッドに関する情報を更新する。
【００５４】
以上説明した処理により、ホストコンピュータ３０は、ブレークポイント到来によってスレッドグループＧに属する各スレッドが停止した場合に、ブレークポイントの設定されたスレッドＴａの実行が停止されたことを示すイベント情報に基づいて、スレッドＴｂ及びＴｃの実行も停止されたことに応じた処理を実行することができる。
【００５５】
以上説明した本実施の形態によれば、ホストデバッガプログラム３３からの制御命令により、デバッグ対象スレッドをターゲットコンピュータ２０上で実行させるとともに、当該スレッドの実行中にデバッグ対象外のスレッドをターゲットコンピュータ２０の少なくとも一部のハードウェア資源へのアクセスを制限しつつ実行させることができる。これにより、相互に関連する複数のスレッドを本来の実行環境に近い状態で実行させつつ、デバッグ対象となる特定のスレッドの動作を検証でき、信頼性の高いデバッグを行うことができる。
【００５６】
なお、以上の説明においては、スレッドグループに属するスレッドに対してブレークポイントを設定して各スレッドを実行させる場合の例について説明したが、本実施形態に係るプログラム開発環境１０は、他のデバッグ処理を実行する場合にも同様にデバッグ対象外のスレッドをハードウェア資源へのアクセスを制限しつつ実行させることができる。例えば、スレッドグループＧに属するスレッドのうち、あるスレッド（例えばスレッドＴｂ）をソースプログラムにおける１ステップに相当する命令ずつ実行させて動作検証を行いたい場合、予めデバッグ対象外となるスレッドＴａ及びＴｃに前述したループ命令を埋め込んで、スレッドグループＧに属する各スレッドを実行させる。これにより、スレッドＴａ及びスレッドＴｃによるメモリ等のハードウェア資源へのアクセスを制限しつつ、スレッドＴｂをソースプログラムの１ステップずつ実行させることができる。
【００５７】
また、本実施形態に係るプログラム開発環境１０においては、デバッグ対象のスレッドとして複数のスレッドを実行させつつ、当該複数のスレッドと相互に関連して動作するデバッグ対象外のスレッドを、ハードウェア資源へのアクセスを制限しつつ実行させることもできる。これにより、デバッグ対象となる複数のスレッドが相互に関連して実行する処理の検証を行いたい場合にも、本来の実行環境に近い状態でデバッグ作業を行うことができる。
【００５８】
また、本発明は上記実施形態に限定されるものではなく、種々の実施形態により実現可能である。例えば、上記の説明においてはデバッグ対象のスレッドを実行するターゲットコンピュータ２０とは異なるホストコンピュータ３０においてデバッグ処理を行うこととしたが、ターゲットコンピュータ２０においてホストデバッガプログラム３３に相当するプログラムを実行させることとしてもよい。この場合、ユーザは１つのコンピュータ上でプログラムのデバッグ作業を行うことができる。また、上記の説明においてデバッグ通信プログラム３２により実現したスレッドテーブルによる同一スレッドグループに属するスレッドの制御を、ホストデバッガプログラム３３やデバッグエージェントプログラム２３などの他のプログラムにより実現することとしてもよい。
【図面の簡単な説明】
【００５９】
【図１】本発明の実施の形態に係るプログラム開発環境を表す図である。
【図２】ホストコンピュータが保持するスレッドテーブルの一例を表す図である。
【図３】ブレークポイントを設定する処理の一例を表すフロー図である。
【図４】ブレークポイント到来時の処理の一例を表すフロー図である。
【符号の説明】
【００６０】
１０  プログラム開発環境、２０  ターゲットコンピュータ、２１,３１  オペレーティングシステム、２２  ユーザアプリケーションプログラム、２３  デバッグエージェントプログラム、３０  ホストコンピュータ、３２  デバッグ通信プログラム、３３  ホストデバッガプログラム、３４  プロセッサユニットデバッガ、３５  統合開発環境プログラム。
【図１】
2007128132.tif 000003
【図２】
2007128132.tif 000004
【図３】
2007128132.tif 000005
【図４】
2007128132.tif 000006