(57)【特許請求の範囲】
【請求項１】
コンピュータに、
アプリケーションプログラムの一部分に対応するソースコードを修正して得られるソースコードに含まれる、関数内にネストされた静的変数を含む局所的な静的変数を、大域変数に変更し、
前記アプリケーションプログラムの処理により前記静的変数の変数値が格納されたアドレスと、前記大域変数と、を関連付けて記憶手段に記憶し、
前記アプリケーションプログラムの処理において前記アプリケーションプログラムの前記一部分が呼び出された場合に、前記静的変数を前記大域変数に置き換えて得られるソースコードをコンパイルして得られるプログラムが実行されるように設定し、
前記アプリケーションプログラムの処理において前記大域変数が呼び出された場合に、前記大域変数と関連付けられて前記記憶手段に記憶された前記アドレスから変数値が読み出されるように設定する、
処理を実行させることを特徴とするデバッグ支援プログラム。
【請求項２】
前記大域変数は、ユニークな名称が付される、
ことを特徴とする請求項１に記載のデバッグ支援プログラム。
【請求項３】
前記一部分に対応するソースコードを修正する処理は、前記ソースコードにおける手続きの名称をユニークな名称に変更する処理であり、
前記設定する処理は、前記ソースコードにおける前記手続きが呼び出された場合に、前記ユニークな名称の手続きにブランチさせる設定を行う処理を含む、
ことを特徴とする請求項１又は請求項２に記載のデバッグ支援プログラム。
【請求項４】
コンピュータが、
アプリケーションプログラムの一部分に対応するソースコードを修正して得られるソースコードに含まれる、関数内にネストされた静的変数を含む局所的な静的変数を、大域変数に変更し、
前記アプリケーションプログラムの処理により前記静的変数の変数値が格納されたアドレスと、前記大域変数と、を関連付けて記憶手段に記憶し、
前記アプリケーションプログラムの処理において前記アプリケーションプログラムの前記一部分が呼び出された場合に、前記静的変数を前記大域変数に置き換えて得られるソースコードをコンパイルして得られるプログラムが実行されるように設定し、
前記アプリケーションプログラムの処理において前記大域変数が呼び出された場合に、前記大域変数と関連付けられて前記記憶手段に記憶された前記アドレスから変数値が読み出されるように設定する、
処理を実行することを特徴とするデバッグ方法。
【請求項５】
第１の装置と、アプリケーションプログラムを実行する第２の装置と、を含むデバッグ支援システムであって、
前記第１の装置が、
前記アプリケーションプログラムのうちの一部のプログラムに対応するソースコードを修正して得られるソースコードに含まれる、関数内にネストされた静的変数を含む局所的な静的変数を、大域変数に変更する変更手段と、
変更後のソースコードをコンパイルして得られる修正プログラムを、前記第２の装置に送信する送信手段と、を含み、
前記第２の装置が、
前記アプリケーションプログラムの処理により前記静的変数が格納されたアドレスと、前記大域変数と、を関連付ける関連付け手段と、
前記アプリケーションプログラムの処理において前記一部のプログラムが呼び出された場合に、前記静的変数を前記大域変数に置き換えた前記修正プログラムが実行されるように設定する設定手段と、を含む、
ことを特徴とするデバッグ支援システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、アプリケーションプログラム（以下「アプリケーション」という）に含まれるバグ（不具合）の修正を支援するデバッグ支援プログラム、デバッグ支援方法及びデバッグ支援システムに関する。
【背景技術】
【０００２】
アプリケーションの動作結果が意図するものと異なる場合、例えば、アプリケーションが異常終了する場合などは、その原因がアプリケーションに含まれるバグである可能性が高い。このため、アプリケーションの開発過程では、アプリケーションが小規模のものでない限り、バグを取り除くデバッグ作業が不可欠である。大規模なアプリケーションの場合、修正したソースコードからロードモジュールを再度ビルドし、アプリケーションの最初からデバッグ作業を再開すると、ソースコードの修正からデバッグ作業の再開まである程度の時間が必要である。そこで、デバッグ作業を支援するために、デバッグ対象であるアプリケーションを動作させたままアプリケーションを修正するデバッグ技術がある。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平８−１７９９４０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかし、従来のアプリケーションを動的に修正する技術では、動的にリンクを生成して修正箇所を呼び出すものの、修正箇所（関数・手続き）内にネストされた静的変数の値が継承されないという問題点がある。
【０００５】
そこで、本発明の一側面として、アプリケーションの動的な修正において、修正箇所に含まれる、関数内にネストされた静的変数を含む局所的な静的変数の値を継承可能とすることを目的とする。
【課題を解決するための手段】
【０００６】
コンピュータが、アプリケーションプログラムの一部分に対応するソースコードを修正して得られるソースコードに含まれる、関数内にネストされた静的変数を含む局所的な静的変数を、大域変数に変更し、アプリケーションプログラムの処理により静的変数の変数値が格納されたアドレスと、大域変数と、を関連付けて記憶手段に記憶する。また、コンピュータが、アプリケーションプログラムの処理においてアプリケーションプログラムの一部分が呼び出された場合に、静的変数を大域変数に置き換えて得られるソースコードをコンパイルして得られるプログラムが実行されるように設定する。さらに、コンピュータが、アプリケーションプログラムの処理において大域変数が呼び出された場合に、大域変数と関連付けられて記憶手段に記憶されたアドレスから変数値が読み出されるように設定する。
【発明の効果】
【０００７】
アプリケーションの動的な修正において、修正箇所に含まれる、関数内にネストされた静的変数を含む局所的な静的変数の値を継承することができる。
【図面の簡単な説明】
【０００８】
【図１】デバッガが組み込まれるコンピュータシステムの構成図である。
【図２】ホストコンピュータ及び利用者端末の内部構造の説明図である。
【図３】デバッグ作業の手順を説明する手順図である。
【図４】修正したソースコードをアプリケーションに適用する方法の概念図である。
【図５】修正したソースコードに含まれる変数の説明図である。
【図６】アプリケーション適用処理のメインルーチンのフローチャートである。
【図７】パッチをビルドするサブルーチンのフローチャートである。
【図８】パッチを転送するサブルーチンのフローチャートである。
【図９】パッチをアプリケーションへ適用するサブルーチンのフローチャートである。
【図１０】修正したソースコードがどのように処理されるかを説明する説明図である。
【発明を実施するための形態】
【０００９】
以下、添付された図面を参照し、本発明を実施するための実施形態について詳述する。
本実施形態でデバッグ対象となるアプリケーションプログラムは、複数のソースコードをコンパイルして得られる複数のプログラム部分により構成される。各プログラム部分が呼び出されると、各プログラム部分に応じた処理が実行される。
【００１０】
本実施形態では、アプリケーションの動的な修正において、静的変数の値を継承するために、デバッガとして動作するコンピュータが次のような処理を実行する。
まず、コンピュータが、デバッグ対象であるアプリケーションのうちの修正されたソースコードに基づいてダイナミックリンクライブラリを生成し、生成したダイナミックリンクライブラリについて、静的変数を大域変数に置き換える処理を行なう。ここで、「静的変数」とは、例えば、Ｃ言語における“static変数”など、アプリケーションが終了するまで値が保持される変数である。一方、「大域変数」とは、例えば、Ｃ言語における“extern変数”など、他のファイルなどで定義された変数を使用するために宣言する外部変数である。また、コンピュータが、静的変数を保持する領域の実際のアドレス（実アドレス）と大域変数とを関連付けて、アプリケーションに対してダイナミックライブラリをリンクする。そして、コンピュータが、アプリケーションについて、ダイナミックリンクライブラリの手続きが実行されるように変更する。
【００１１】
次に、本実施形態の一例について説明する。
アプリケーションの開発を支援するツールとして、統合開発環境（Integrated Development Environment）が存在する。統合開発環境は、ソースコードの編集、ソースコードの管理、アプリケーションのビルド方法の管理、ビルドの実行、アプリケーションの実行、デバッグ作業のためのデバッガなどの機能を持つ。デバッガは、利用者の指示に応答して、アプリケーションの停止・再開や、変数の値の参照・変更などを行うことができる。デバッグ対象となるアプリケーションは、Ｃ言語、ＦＯＲＴＲＡＮ言語などの高級言語で記述され、このような高級言語で記述されたプログラムを対象とするデバッグが可能なデバッガは「ソースレベルデバッガ」と呼ばれている。ここでは、デバッガとして、高級言語であるＣ言語を扱う、ソースレベルデバッガを前提とする。
【００１２】
図１は、アプリケーション１００を実行するホストコンピュータ２００（第２の装置）と、ホストコンピュータ２００を操作する少なくとも１台の利用者端末３００（第１の装置）と、を有するコンピュータシステムにより構築した、統合開発環境４００の一例を示す。
【００１３】
統合開発環境４００のデバッガは、ホストコンピュータ２００に備えられた内部デバッガ４１０及び外部デバッガ４２０と、利用者端末３００に備えられたデバッガ制御装置４３０と、を有する。内部デバッガ４１０は、アプリケーション１００と一体化されたモジュールであって、外部デバッガ４２０からの指示に応答して、アプリケーション１００の実行・停止などを制御する。外部デバッガ４２０は、アプリケーション１００とは別のプロセスとして起動させるモジュールであって、デバッガ制御装置４３０からの指示に応答して、内部デバッガ４１０を介してアプリケーション１００にアタッチして制御する。デバッガ制御装置４３０は、利用者へのユーザインターフェースを提供するモジュールであって、利用者の指示に応答して外部デバッガ４２０に各種指示などを送信する。
【００１４】
ここで、ホストコンピュータ２００及び利用者端末３００は、図２に示すように、メモリＡ、ＣＰＵ（Central Processing Unit）などのプロセッサＢ、ハードディスクＣ、ドライブ装置Ｄ及び通信装置Ｅを有する。メモリＡ、プロセッサＢ、ハードディスクＣ、ドライブ装置Ｄ及び通信装置Ｅは、シリアルＡＴＡ（AT Attachment）などのバスＦにより相互に接続される。ドライブ装置Ｄは、例えば、ＣＤ−ＲＯＭ（Compact Disk Read Only Memory）、ＤＶＤ−ＲＯＭ（Digital Versatile Disk Read Only Memory）などのリムーバブルディスクＧからデータを読み込む。リムーバブルディスクＧに代えて、フラッシュメモリを内蔵したＵＳＢ（Universal Serial Bus）メモリなどを使用することもできる。通信装置Ｅは、ホストコンピュータ２００と利用者端末３００とを接続する、例えば、ＮＩＣ（Network Interface Card）などである。
【００１５】
図３は、デバッガを使用したアプリケーション１００のデバッグ作業の大まかな手順を示す。なお、デバッグ作業の前提として、デバッグ対象であるアプリケーション１００がビルド済みであるものとする。
【００１６】
ステップ１（図では「Ｓ１」と略記する。以下同様。）では、利用者が、デバッガによりアプリケーション１００を実行させ、その動作を検証する。なお、デバッグ作業は、アプリケーション１００の途中から開始することも可能である。
【００１７】
ステップ２では、利用者が、アプリケーション１００の動作検証結果に基づいて、アプリケーション１００にバグがあるか否かを判断する。そして、利用者がアプリケーション１００にバグがあると判断すればステップ３の手順へと進める一方（Ｙｅｓ）、利用者がアプリケーション１００にバグがないと判断すればデバッグ作業を終了させる（Ｎｏ）。
【００１８】
ステップ３では、利用者が、例えば、変数の値の参照・変更などを通して、バグの原因を究明する。
ステップ４では、利用者が、ソースコードを修正する。
【００１９】
ステップ５では、利用者によるアプリケーション１００の再ビルド指示に応答して、デバッガが、ソースコードの修正部分を再ビルドし、これを実行中のアプリケーション１００に適用する。その後、ステップ１以降の手順を繰り返す。
【００２０】
以上説明したデバッグ作業においては、ステップ５における手順を除き、公知のデバッガを使用したデバッグ手法と同様の処理手順で実行可能である。ステップ１〜４のデバッグ処理手順は、デバッグ処理を自動化するツールをコンピュータに実行させても良い。また、ステップ５の再ビルド指示は、デバッグ処理を実行化するツールの処理により行なわれるものであっても良い。
【００２１】
図４は、図３におけるステップ５の処理、即ち、修正したソースコードを実行中のアプリケーション１００に適用する方法の概念を示す。
統合開発環境４００に含まれるビルダ・コンパイラ４４０は、利用者が修正したソースコード５００から、パッチとして機能するダイナミックリンクライブラリ６００を生成する。
【００２２】
ソースコード５００は、アプリケーション１００の動作を規定するプログラムコードである。ソースコード５００で規定される実体には、大域変数、局所変数、大域手続き、局所手続きが含まれる。局所変数としては、大別すると、図５に示すように、ファイルに局所的な変数Ｘ、手続きに局所的な変数Ａ，Ｙ、ブロックに局所的な変数Ｂ，Ｚが存在する。手続き又はブロックに局所的な変数には、記憶クラスとしてauto（自動）とstatic（静的）が存在する。auto変数（自動変数）は、参照されるたびに生成・初期化されるが、static変数（静的変数）は、アプリケーション１００の起動から終了までの間に１つの実体のみが存在する。
【００２３】
ダイナミックリンクライブラリ６００は、アプリケーション１００の一部となるロードモジュールであって、大域変数、局所変数、大域手続き、局所手続きなどの実体や、変数名、手続き名などの名称情報（リロケーション情報）及びデバッグ情報を含む。
【００２４】
ビルダ・コンパイラ４４０により生成されたダイナミックリンクライブラリ６００は、デバッガ制御装置４３０及び外部デバッガ４２０により、内部デバッガ４１０に受け渡される。内部デバッガ４１０は、ダイナミックリンカ４５０を介して、ダイナミックリンクライブラリ６００をアプリケーション１００のロードモジュール１１０にダイナミックリンクする。
【００２５】
次に、図６〜図９のフローチャートを参照し、修正したソースコード５００を実行中のアプリケーション１００に適用する処理（アプリケーション適用処理）の具体例について説明する。
【００２６】
図６は、アプリケーション適用処理のメインルーチンの一例を示す。
ステップ１１では、ビルダ・コンパイラ４４０が、修正したソースコード５００からパッチとしてのダイナミックリンクライブラリ６００をビルドする、後述するサブルーチンを実行する。
【００２７】
ステップ１２では、デバッガ制御装置４３０及び外部デバッガ４２０が協働して、ビルダ・コンパイラ４４０により生成されたダイナミックリンクライブラリ６００を内部デバッガ４１０に転送する、後述するサブルーチンを実行する。
【００２８】
ステップ１３では、内部デバッガ４１０が、ダイナミックリンクライブラリ６００を実行中のアプリケーション１００に適用する、後述するサブルーチンを実行する。
図７は、ビルダ・コンパイラ４４０が実行するサブルーチンの一例を示す。
【００２９】
ステップ２１では、ビルダ・コンパイラ４４０が、アプリケーション１００に関するすべてのソースコード５００の中から、利用者によって修正されたソースコード５００を特定する。ソースコード５００の特定は、公知の差分ビルド手法と同様に、各ソースコード５００のタイムスタンプと、各ソースコード５００をコンパイルしたオブジェクトコードのタイムスタンプと、を比較することで容易に実現することができる。なお、ソースコード５００の特定単位としては、ファイル単位であってもよい。
【００３０】
ステップ２２では、ビルダ・コンパイラ４４０が、アプリケーション１００のパッチとして、ステップ２１で特定されたソースコード５００から、ダイナミックリンクライブラリ６００を生成する。このとき、ビルダ・コンパイラ４４０は、修正されたソースコード５００について、静的変数をユニークな名称を付した大域変数に置き換えると共に、大域手続きをユニークな名称を付した大域手続きに置き換えて、ダイナミックリンクライブラリ６００を生成する。ここで、静的変数名及び大域手続き名をユニークな名称に置き換える理由としては、アプリケーション１００における静的変数及び大域手続きの独自性を保証するためである。なお、ダイナミックリンクライブラリ６００の生成は、一時的なソースコード５００において静的変数及び大域手続きの置き換えを行って実行してもよく、また、静的変数及び大域手続きの置き換えを実際に行わずに、置き換えたものとみなして実行してもよい。
【００３１】
ここで、具体例を使用して、ソースコード５００における静的変数及び大域手続きの置き換え処理について説明する。
図５に示すソースコードにおいて、静的変数は、ファイルに局所的な変数Ｘ、手続きに局所的な変数Ｙ、ブロックに局所的な変数Ｚであり、大域手続きは、手続き“func”である。静的変数Ｘ、Ｙ及びＺについて、図１０に示すように、“static”を“extern”に置き換えて大域変数化すると共に、大域変数化された変数Ｘ、Ｙ及びＺをユニークな名称を付した名称に置き換える。また、大域手続き “func”について、ユニークな名称“XX_func”に置き換える。なお、静的変数及び大域手続きの置き換えに際しては、図１０に示すような名称への置き換えに限らず、予め決められた規則に則った名称への置き換えでもよい。
【００３２】
図８は、デバッガ制御装置４３０及び外部デバッガ４２０が協働して実行するサブルーチンの一例を示す。
ステップ３１では、デバッガ制御装置４３０及び外部デバッガ４２０が協働して、ビルダ・コンパイラ４４０により生成されたダイナミックリンクライブラリ６００をアプリケーション１００の内部デバッガ４１０に転送する。具体的には、デバッガ制御装置４３０が、ダイナミックリンクライブラリ６００を外部デバッガ４２０に転送すると共に、外部デバッガ４２０が、デバッガ制御装置４３０から転送されたダイナミックリンクライブラリ６００を内部デバッガ４１０に転送する。
【００３３】
図９は、内部デバッガ４１０が実行するサブルーチンの一例を示す。
ステップ４１では、内部デバッガ４１０が、大域変数化された静的変数について、DWARF情報などのデバッグ情報を参照し、実行中のアプリケーション１００における実アドレスを求める。
【００３４】
ステップ４２では、内部デバッガ４１０が、ステップ４１で求めた静的変数の実アドレスと大域変数とを関連付けてダイナミックリンカ４５０に伝え、ダイナミックリンク処理でダイナミックリンクライブラリ６００を利用可能とする。
【００３５】
ステップ４３では、内部デバッガ４１０が、ダイナミックリンカ４５０を呼び出し、アプリケーション１００のロードモジュール１１０に対してダイナミックリンクライブラリ６００をダイナミックリンクする。このダイナミックリンクにより、ダイナミックリンクライブラリ６００中の大域変数の参照、大域変数化された静的変数の参照ができるようになる。
【００３６】
ステップ４４では、内部デバッガ４１０が、実行中のアプリケーション１００に含まれる手続きについて、パッチであるダイナミックリンクライブラリ６００に含まれている大域手続きが実行されるように変更する。具体的には、内部デバッガ４１０は、実行中のアプリケーション１００の手続きを、ダイナミックリンクライブラリ６００の大域手続きにブランチするように変更する。これにより、ダイナミックリンクライブラリ６００において定義されている大域手続きの参照が可能となる。
【００３７】
かかるデバッガによれば、実行中のアプリケーション１００を一時停止した状態で、アプリケーション１００のバグを解消するためにソースコード５００を修正すると、修正したソースコード５００から、アプリケーション１００にダイナミックリンク可能なダイナミックリンクライブラリ６００が生成される。このとき、修正したソースコード５００について、局所的な静的変数がユニークな名称の大域変数に置き換えられると共に、大域手続きがユニークな名称の手続きに書き換えられて、ダイナミックリンクライブラリ６００が生成される。
【００３８】
また、生成されたダイナミックリンクライブラリ６００が、次のようにして、実行中のアプリケーション１００に適用される。即ち、大域変数化された静的変数の実アドレスと大域変数とを関連付けて、ダイナミックリンカ４５０を呼び出すことで、大域変数が静的変数の値を継承できるようにする。さらに、実行中のアプリケーション１００の手続きについて、ダイナミックリンクライブラリ６００の大域手続きが実行されるように変更することで、アプリケーション１００の手続きに代えて、ダイナミックリンクライブラリ６００の大域的手続きが実行されるようにする。
【００３９】
ここで、大域変数が静的変数の値を継承できる仕組みについて説明する。図５に示すソースコード５００について、静的変数Ｘの実アドレスが、“ＸＸＸＸ”であると仮定する。このソースコード５００における静的変数Ｘを大域変数化することで、図１０に示すように、静的変数Ｘは大域変数Ｘ＿００１となる。そして、静的変数Ｘについて、その実アドレスＸＸＸＸと大域変数Ｘ＿００１とが関連付けられているので、大域変数Ｘ＿００１を参照することは、アドレスＸＸＸＸを参照することと同一となる。アドレスＸＸＸＸは静的変数Ｘの実アドレスであるため、大域変数Ｘ＿００１を参照することは、静的変数Ｘを参照することとなり、静的変数Ｘの値を継承することができる。
【００４０】
そして、一時停止していたアプリケーション１００の実行を再開すると、ダイナミックリンクライブラリ６００の手続きが実行されるようにアプリケーション１００が変更されているため、修正したソースコード５００により規定した手続きが実行されることとなる。このため、動的なアプリケーションの修正を実現することができる。
【００４１】
従って、アプリケーションの動的な修正において、静的変数の値を継承することができるようになる。
なお、本実施形態は、ホストコンピュータ２００と少なくとも１台の利用者端末３００とを有するコンピュータシステムに限らず、ＰＣ（Personal Computer）、ＷＳ（Work Station）などのコンピュータシステムにも適用可能である。また、高級言語としては、Ｃ言語に限らず、静的変数、大域変数などを扱うことができる、Ｃ＋＋言語、ＦＯＲＴＲＡＮ言語などにも適用可能である。
【符号の説明】
【００４２】
１００  アプリケーション
２００  ホストコンピュータ
３００  利用者端末
４００  統合開発環境
４１０  内部デバッガ
４２０  外部デバッガ
４３０  デバッガ制御装置
４４０  ビルダ・コンパイラ
４５０  ダイナミックリンカ
５００  ソースコード
６００  ダイナミックリンクライブラリ
【図１】
0005906609.tif 000002
【図２】
0005906609.tif 000003
【図３】
0005906609.tif 000004
【図４】
0005906609.tif 000005
【図５】
0005906609.tif 000006
【図６】
0005906609.tif 000007
【図７】
0005906609.tif 000008
【図８】
0005906609.tif 000009
【図９】
0005906609.tif 000010
【図１０】
0005906609.tif 000011