(57)【要約】【課題】ユーザの意図するブレーク動作をさせることができないというような、所望のデバッグが十分にできない問題を防止する。【解決手段】プログラムデバッグ装置は、プログラムをデバッグするための情報としてのデバッグ情報を生成するコンパイル部２０００と、生成されたデバッグ情報を格納するデバッグ情報記憶部４１００と、記憶されたデバッグ情報を用いてデバッグを行うデバッグ部３０００とを具備している。コンパイル部２０００は、最適化部２１００と、デバッグ情報生成部２２００とを備えている。最適化部２１００は、最適化機能による最適化の処理における関数の展開、関数の削除、共通のプログラム部分の行の結合、及び、使われていないプログラム部分の行の削除の実行の有無を抽出する。デバッグ情報生成部２２００は、抽出の結果に基づいて、デバッグ情報を生成する。【選択図】図５
2011204204.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの最適化機能を持つプログラムデバッグ装置であって、
プログラムをデバッグするための情報としてのデバッグ情報及び前記プログラムの実行コードを生成するコンパイル部と、
生成された前記デバッグ情報及び前記実行コードを格納するデバッグ情報記憶部と、
記憶された前記デバッグ情報及び前記実行コードを用いてデバッグを行うデバッグ部と
を具備し、
前記コンパイル部は、
前記最適化機能による最適化の処理における関数の展開、関数の削除、共通のプログラム部分の行の結合、及び、使われていないプログラム部分の行の削除の実行の有無を抽出する最適化部と、
前記抽出の結果に基づいて、前記デバッグ情報を生成するデバッグ情報生成部と
を備える
プログラムデバッグ装置。  
【請求項２】
請求項１に記載のプログラムデバッグ装置において、
前記最適化部は、
関数の展開及び前記関数の削除を含む前記最適化の処理を行い、最適化された関数の情報として展開関数名及び任意の番号である展開関数情報番号の情報を生成する関数展開最適化処理部と、
前記関数の削除により削除される関数中で、共通のプログラム部分の行の結合及び使われていないプログラム部分の行の削除が行なわれてないプログラムの行番号の情報を生成する展開関数プログラム最適化処理部と
を含む
プログラムデバッグ装置。
【請求項３】
請求項２に記載のプログラムデバッグ装置において、
前記デバッグ情報生成部は、
前記展開関数名と前記展開関数情報番号を前記デバッグ情報に含むように前記デバッグ情報記憶部に登録する関数展開最適化情報生成部と、
前記行番号を前記デバッグ情報に含むように前記デバッグ情報記憶部に登録する展開関数プログラム最適化情報生成部と
を含む
プログラムデバッグ装置。
【請求項４】
請求項３に記載のプログラムデバッグ装置において、
前記デバッグ情報記憶部は、
前記展開関数名と前記展開関数情報番号と前記行番号を前記デバッグ情報における展開関数情報として格納する最適化関数情報記憶部を含む
プログラムデバッグ装置。
【請求項５】
請求項４に記載のプログラムデバッグ装置において、
前記デバッグ部は、
前記デバッグの実行状態を監視する実行状態監視部と、
前記最適化関数情報記憶部に格納された前記デバッグ情報を参照して、前記展開関数情報を前記実行状態監視部に登録する最適化展開関数処理部）と、
入力された情報と前記展開関数情報とを検索して、前記コンパイル部により最適化された前記展開関数の実行コードを実行するコード実行部と
を含む
プログラムデバッグ装置。
【請求項６】
プログラムの最適化機能を持つプログラムデバッグ装置を用いたプログラムデバッグ方法であって、
前記プログラムデバッグ装置は、
プログラムをデバッグするための情報としてのデバッグ情報及び前記プログラムの実行コードを生成するコンパイル部と、
生成された前記デバッグ情報及び前記実行コードを格納するデバッグ情報記憶部と、
記憶された前記デバッグ情報及び前記実行コードを用いてデバッグを行うデバッグ部と
を具備し、
前記プログラムデバッグ方法は、
前記コンパイル部が、
前記プログラムを関数別に展開し、展開関数毎に展開先の行番号に任意の番号を付加するステップと、
前記プログラムに関数呼び出しが存在しない場合、前記関数の最適化を行い、最適化して展開された結果不要になった関数の削除を行なうステップと、
最適化された前記関数の情報として展開関数名及び任意の番号である展開関数情報番号の情報を前記デバッグ情報に含むように前記デバッグ情報記憶部に登録するステップと、
前記展開関数のプログラムに対して共通のプログラム部分の行の結合及び使われていないプログラム部分の行の削除を含む最適化を行なうステップと、
前記展開先の前記展開関数で前記行の結合や前記行の削除などの最適化の影響を受けずにプログラムが存在しているかを判断し、前記展開先の前記展開関数で最適化の影響を受けないプログラムが存在する場合は行番号を前記デバッグ情報に含むように前記デバッグ情報記憶部に登録するステップと
を具備する
プログラムデバッグ方法。
【請求項７】
請求項６に記載のプログラムデバッグ方法であって、
前記デバッグ部が、
入力により指定された前記プログラムの行が前記デバッグ情報記憶部に登録されていない関数の場合、前記デバッグ情報記憶部に登録されている前記デバッグ情報を取得してデバッグ処理を実行するステップと、
前記デバッグ情報記憶部に登録された関数の場合、当該関数の展開関数情報番号及び行番号を前記デバッグ情報記憶部から取得して、前記プログラムについての実行コードにおいて、前記取得した行番号と一致する行番号を検出して、検出した前記行番号の情報に基づいてデバッグ処理を実行するステップと
を更に具備する
プログラムデバッグ方法。
【請求項８】
請求項６又は７に記載のプログラムデバッグ方法をコンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムデバッグ装置およびプログラムデバッグ方法に関する。  
【背景技術】
【０００２】
近年、コンピュータシステムに求められる機能は増大傾向にある。それに伴い、半導体集積回路（以降、“マイクロコンピュータ”と呼ぶ）の機能が複雑になり、その制御用のプログラムのサイズも大きくなってきている。その流れの中で、プログラムのサイズを抑えるためにプログラムの最適化手法が発展してきている。しかしながら、プログラムの最適化によりデバッグ情報が喪失され、プログラムデバッグ装置によるデバッグができなくなる場合がある。そのため、プログラムを最適化しても容易にデバッグできる技術が望まれている。  
【０００３】
特開２００２−７３３７１号公報に、プログラムデバッグ方式が開示されている。このプログラムデバッグ方式は、プログラムの最適化時にもデバッグを可能にすることを目的としている。以下、このプログラムデバッグ方式について説明する。図１は、特開２００２−７３３７１号公報のプログラムデバッグ装置１０００の構成を示すブロック図である。プログラムデバッグ装置１０００は、コンパイラ１０と、デバッガ１１と、プログラム記憶部１０１と、実行コード記憶部１０２と、デバッグ情報記憶部１０３と、実行状態記憶部１１３を備えている。プログラム記憶部１０１は、プログラムを記憶する。実行コード記憶部１０２は、実行コードを記憶する。デバッグ情報記憶部１０３は、コンパイル時に生成されるデバッグ情報を記憶する。実行状態記憶部１１３は、プログラムの実行状態を記憶する。
【０００４】
コンパイラ１０は、内部表現変換部１０４と、最適化部１０５と、コード生成部１０６と、デバッグ情報生成部１０７と、展開関数情報生成部１０８とを備えている。最適化部１０５は、関数展開最適化部１０５１を含んでいる。展開関数情報生成部１０８は、デバッグ情報生成部１０７に付加されている。デバッガ１１は、入力部１０９と、コード実行部１１０と、実行状態監視部１１１と、展開関数処理部１１２とを備えている。展開関数処理部１１２は、実行状態監視部１１１に付加されている。
【０００５】
デバッグ情報記憶部１０３は、展開関数情報記憶部１０３３と、行アドレス情報記憶部１０３４とを備えている。展開関数情報記憶部１０３３は、複数箇所に展開された関数に対応した情報を記憶する。行アドレス情報記憶部１０３４は、ソース行とアドレスが対応付けられ、更に展開関数情報記憶部１０３３の参照を可能とする情報を付加した行アドレス情報を記憶する。実行状態記憶部１１３は、プログラムの実行状態に加えて、複数箇所に展開された関数の実行状態を記憶する
【０００６】
このプログラムデバッグ装置１０００を用いたプログラムデバッグ方式において、コンパイラ１０において、内部表現変換部１０４は、プログラム記憶部１０１からソースプログラム（以降、“ソース”と呼ぶ）を得て、ソース行から内部表現（ソース行から実行コードに変換する段階で発生する中間的なコード）に変換する。コード生成部１０６は、内部表現から実行コードを生成し、アドレスを割り当てる。デバッグ情報生成部１０７は、プログラムのソース１行毎に、（割り当てられた）対応するアドレスを、ソース行番号とともに、行アドレス情報記憶部１０３４に記録する。行アドレス情報記憶部１０３４に記録された情報を、以降、“行アドレス情報”と呼ぶ。行アドレス情報記憶部１０３４に記憶された情報としては、図４Ａに示すテーブルが例示される。
【０００７】
プログラムのソース１行が、関数展開最適化部１０５１により、「関数を呼ぶ」という実行コードではなく、関数の処理内容の実行コードに展開された場合（関数を呼んでいる位置に処理内容が展開される関数を、以降、“展開関数”と呼ぶ）、関数展開最適化部１０５１は、展開関数の関数名、ソース行、展開位置、展開範囲に関する情報を、デバッグ情報生成部１０７を経由して展開関数情報生成部１０８に渡す。展開関数情報生成部１０８は、渡された情報を展開関数情報記憶部１０３３に記録する。展開関数情報記憶部１０３３及び行アドレス情報記憶部１０３４に記録される情報を、以降、“デバッグ情報”と呼ぶ。展開関数情報記憶部１０３３に記憶された情報として、図４Ｂの展開関数用先頭アドレス情報テーブル、及び、図４Ｃの展開関数用行アドレス情報テーブルが例示される。展開関数用先頭アドレス情報テーブル、及び、展開関数用行アドレス情報テーブルは、展開関数ごとに設けられている。図４Ｂ〜図４Ｃの例では、複数の展開関数の各々に対応して、複数のテーブルが登録されている。
【０００８】
デバッガ１１では、デバッガ操作者（以降、“ユーザ”と呼ぶ）が、入力部１０９で、ソース行番号とブレーク条件（例えば、ソース行を実行させる直前で実行を止める等）とを対応させる操作をした時、入力された行番号が展開関数に該当している場合、展開関数処理部１１２は、デバッグ情報に基づいて、入力行番号に該当するアドレスとブレーク条件を実行状態監視部１１１に登録する。実行状態監視部１１１は、登録されたアドレスとブレーク条件を元に実行状態を監視し、実行状態に応じて、実行コードのアドレスとソース行を取得し、実行状態記憶部１１３に記録する。実行状態記憶部１１３に記録された情報は、ユーザがデバッグ時にデバッグ情報（例えば、ソース行、コード、コードのアドレス等）を確認したい時には、例えばディスプレイなどにより、ソース行、コード、コードのアドレス等の情報を参照できる。なお、入力された行番号が展開関数に該当しない場合は、ユーザが入力部１０９で入力したソース行番号とブレーク条件を、行アドレス情報記憶部１０３４を元に、デバッガ１１が、入力行に該当するアドレスとブレーク条件を実行状態監視部１１１に登録し、処理を続ける。
【０００９】
図２は、特開２００２−７３３７１号公報のプログラムデバッグ装置１０００における展開関数情報生成部１０８の動作を示すフローチャートである。コンパイラ１０のコンパイルプロセスにおいて、展開関数情報生成部１０８は、展開された関数の関数名、ソース行、展開位置、展開範囲に関する情報を、デバッグ情報生成部１０７から受け取ると、行アドレス情報記憶部１０３４（図４Ａ）に展開関数フラグ４０２を登録する（ステップＳ２０１）。展開関数情報生成部１０８は、既に展開された関数かどうかを判断する（ステップＳ２０２）。すなわち、その関数の展開関数用行アドレス情報テーブル（図４Ｃ）が有るか否かを判断する。既に展開された関数であればステップＳ２０３へ分岐し、既に展開された関数でなければステップＳ２０６へ分岐する。
【００１０】
既に展開された関数の場合（ステップＳ２０２：Ｙｅｓ）、展開関数情報生成部１０８は、その関数に関する展開関数用行アドレス情報テーブル（図４Ｃ）から、展開関数用先頭アドレス情報テーブルポインタ５０２を取得する（ステップＳ２０３）。次に、展開された位置の先頭アドレス（行アドレス情報記憶部１０３４のテーブル（図４Ａ）の行番号に対応するアドレス）を、その関数に関する展開関数用先頭アドレス情報テーブル（図４Ｂ）に登録する（ステップＳ２０４）。続いて、展開関数用行アドレス情報テーブルポインタ４０３を行アドレス情報記憶部１０３４（図４Ａ）に登録する（ステップＳ２０５）。
【００１１】
既に展開された関数ではない場合（ステップＳ２０２：Ｎｏ）、展開関数情報生成部１０８は、展開関数情報記憶部１０３３内に、任意の関数用として、展開関数用行アドレス情報テーブル（図４Ｃ）を新規に作成する（ステップＳ２０６）。次に、作成されたそのテーブルに展開関数名５０１を登録する（ステップＳ２０７）。続いて、展開された関数内に、更に展開関数があるかどうかを判断する（ステップＳ２０８）。更に展開関数があれば（ステップＳ２０８：Ｙｅｓ）、展開関数情報生成部１０８を再帰呼出し（ステップＳ２１２）、同様の処理（Ｓ２０１〜Ｓ２０２、Ｓ２０３〜Ｓ２０４／Ｓ２０６〜Ｓ２１５、Ｓ２０５）を行う。更に展開関数がなければ（ステップＳ２０８：Ｎｏ）、ステップＳ２０９へ分岐する。
【００１２】
展開関数情報生成部１０８は、展開関数用行アドレス情報テーブル（図４Ｃ）に１行分の相対アドレス情報（ソース行番号ｎ：対応する相対アドレスｎ）５０３を登録する（ステップＳ２０９）。そして、ソース行を１行進める（ステップＳ２１０）。その後、ソース行が終了かどうかを、例えばＥＯＦ（ＥｎｄＯｆ  Ｆｉｌｅ：ファイルの終了を表す記号）で判断する（ステップＳ２１１）。ソース行が終了でなければ（ステップＳ２１１：Ｎｏ）、ステップＳ２０８へ分岐する。ソース行が終了であれば（ステップＳ２１１：Ｙｅｓ）、ステップＳ２１３へ分岐する。ソース行の終了により、それまで展開されていなかった関数用の新規の展開関数用行アドレス情報テーブル（図４Ｃ）が完成となる。
【００１３】
展開関数情報生成部１０８は、その新規の展開関数用行アドレス情報テーブル（図４Ｃ）に対応した展開関数用先頭アドレス情報テーブル（図４Ｂ）を新規作成する（ステップＳ２１３）。次に、展開関数用先頭アドレス情報テーブルポインタ５０２を、所定の展開関数用行アドレス情報テーブル（図４Ｃ）に登録する（ステップＳ２１４）。続いて、展開関数用先頭アドレス情報テーブル（図４Ｂ）に、関数を展開した場所の先頭アドレス６０１を登録する（ステップＳ２１５）。
【００１４】
以上のように、コンパイラ１０のコンパイルプロセスにおいて、展開関数情報生成部１０８は呼び出された関数の展開に関する処理を実行する。
【００１５】
図３は、特開２００２−７３３７１号公報のプログラムデバッグ装置１０００における展開関数処理部１１２の動作を示すフローチャートである。デバッガ１１のデバッグプロセスにおいて、展開関数処理部１１２は以下のように動作する。入力部１０９からソース行番号とブレーク条件が入力されると（ステップＳ３０１）、展開関数処理部１１２は、入力されたソース行番号で、行アドレス情報記憶部１０３４（図４Ａ）のソース行番号を検索し、対象行のアドレス情報（ソース行番号ｎ：対応するアドレスｎ）４０１を得る（ステップＳ３０２）。展開関数処理部１１２は、展開された関数かどうかを、展開関数フラグ４０２があるかどうかで判断する（ステップＳ３０３）。展開された関数の場合（ステップＳ３０３：Ｙｅｓ）ステップＳ３０６へ分岐する。展開された関数でない場合（ステップＳ３０３：Ｎｏ）、ステップＳ３０４でアドレスを得る。そして、アドレスとブレーク条件を実行状態監視部１１１に登録し（ステップＳ３０５）、処理を終了する。
【００１６】
展開関数処理部１１２は、展開関数用行アドレス情報テーブルポインタ４０３を行アドレス情報記憶部１０３４（図４Ａ）から取得する（ステップＳ３０６）。次に、展開関数用先頭アドレス情報テーブルポインタ５０２を、展開関数用行アドレス情報テーブルポインタ４０３に基づいて、展開された関数に対応する展開関数用行アドレス情報テーブル（図４Ｃ）から取得する（ステップＳ３０７）。続いて、展開関数処理部１１２は、関数内が更に展開された関数かどうかを判断する（ステップＳ３０８）。更に展開された関数の場合（ステップＳ３０８：Ｙｅｓ）、ステップＳ３０６へ分岐する。更に展開された関数でない場合（ステップＳ３０８：Ｎｏ）、ステップＳ３０９へ分岐し、展開された関数に対応する展開関数用行アドレス情報テーブル（図４Ｃ）から、対応する相対アドレスを取得する。  
【００１７】
展開関数処理部１１２は、展開された関数に対応する展開関数用先頭アドレス情報テーブル（図４Ｂ）より、先頭アドレス６０１を１つ取得する（ステップＳ３１０）。そして、先頭アドレス＋相対アドレスで求めた実アドレスとブレーク条件を実行状態監視部１１１に登録する（ステップＳ３１１）。次に、展開関数処理部１１２は、次の先頭アドレス（ｎ＋１）へ進める（ステップＳ３１２）。続いて、展開関数用先頭アドレス情報テーブル（図４Ｂ）が終了かどうかを判断する（ステップＳ３１３）。展開関数用先頭アドレス情報テーブル（図４Ｂ）が終了でない場合（ステップＳ３１３：Ｎｏ）、ステップＳ３１０へ分岐する。展開関数用先頭アドレス情報テーブル（図４Ｂ）が終了の場合（ステップＳ３１３：Ｙｅｓ）、処理は終了する。
【００１８】
ただし、上述のように、図４Ａ〜図４Ｃは、特開２００２−７３３７１号公報におけるデバッグ情報記憶部１０３９で保持される情報の一例であり、行アドレス情報記憶部１０３４（図４Ａ）の構成、展開関数用行アドレス情報テーブルの構成（図４Ｃ）および展開関数用先頭アドレス情報テーブルの構成（図４Ｂ）を示すものである。行アドレス情報記憶部１０３４（図４Ａ）では、展開された関数でない行には、アドレス情報（ソース行番号ｎ：対応するアドレスｎ）４０１が記録される。一方、関数が展開されている行には、展開関数フラグ４０２、ソース行番号、展開関数用行アドレス情報テーブルポインタ４０３が記録される。
【００１９】
展開関数情報記憶部１０３３は、展開関数用行アドレス情報テーブル（図４Ｃ）と、展開関数用先頭アドレス情報テーブル（図４Ｂ）で構成される。図４Ｃにおいて、展開関数用行アドレス情報テーブルには、はじめに、展開関数名５０１、展開関数用先頭アドレス情報テーブルポインタ５０２が記録される。その次に、順次、相対アドレス情報（ソース行番号ｎ：対応する相対アドレスｎ）５０３が記録される。図４Ｂにおいて、展開関数用先頭アドレス情報テーブルには、１つの関数が展開された複数個所の先頭アドレス６０１が記録される。なお、展開関数用行アドレス情報テーブル（図４Ｃ）、及び、展開関数用先頭アドレス情報テーブル（図４Ｂ）は、展開された関数の種類分だけ、生成される。
【００２０】
このように、展開関数用行アドレス情報テーブル（図４Ｃ）に記録されるアドレスを相対アドレスで持ち、関数が展開された位置の各先頭アドレスを展開関数用先頭アドレス情報テーブル（図４Ｂ）で持つことにより、テーブルサイズの縮小を行っている。
【００２１】
展開関数用行アドレス情報のアドレスを相対アドレスで持たない場合には、ソース行１行に対応するアドレスを、展開された個所の数だけ持つことになる。例えば、２０行の関数が３０個所に展開された場合、１ソース行、１アドレスを１項目とすると、２０（行）×３０（個所）＝６００（項目）の項目数が発生する。展開関数用行アドレス情報を相対アドレスで持ち、関数が展開された位置の各先頭アドレスを展開関数用先頭アドレス情報テーブルで持つと、２０（行）＋３０（先頭アドレス）＝５０（項目）の項目数で済み、１／１２の項目数で実現される。
【００２２】
この技術は、関数の展開がソースプログラムのレベルで行われた後のソースプログラムに対して、ユーザがそのソース行にブレークポイントを設定するという構成ではない。この技術は、関数の展開が行われる前の状態のソースプログラムに対して、ユーザがそのソース行にブレークポイントを設定し、実行形式のプログラムのソースレベルのデバッグを行うことができ、内部的に関数の展開が行われたことを、ユーザに意識させることなくデバッグを行うことができる。
【００２３】
また、１つの関数の展開が任意の複数箇所に展開された場合でも、予め関数が複数箇所に展開されることを考慮したデバッグ情報の構造になっているため、任意の複数箇所に展開された関数に対し、ソースレベルでブレークポイントを設定することができる。
【００２４】
関連する技術として、特開昭６２−０９２０３５号公報にプログラムデバッグ装置が開示されている。このプログラムデバッグ装置は、第１手段と、第２手段と、第３手段とから構成されている。第１手段は、デバッグすべきプログラムを実行し、該実行状況をトレースする。第２手段は、トレースされた履歴中から、特定の命令のみを選択的に順次読み出す。第３手段は、読み出された命令に対応する、ソースプログラム上の情報を表示させる。このプログラムデバッグ装置は、実行トレース（ヒストリ）した結果を基に特定の情報（例えば、関数呼び出しなどの特定命令のみ）を表示する。
【００２５】
関連する技術として、特開平５−２１６７１９号公報に、デバッガのブレーク方法およびデバッガが開示されている。このデバッガのブレーク方法は、自動展開可能な言語で記載されたソースプログラムに対して、プログラム実行時に実行の中断を行うブレークポイントを設定する。上記ソースプログラムに基づいて１または複数の展開ソースプログラムを生成し、上記ソースプログラムの展開前と展開後の対応関係を表わす展開情報を生成し、該展開情報を基に上記展開ソースプログラム中にブレークポイントの設定を行う。展開後のソースプログラムに対するブレークポイントの指定を、展開前の行番号と展開後の行番号の組合せで行い、該展開前行番号および展開後行番号に基づいてブレークポイント位置の決定を行っても良い。上記展開後行番号が自動展開単位で個別に付与されたものであっても良い。
【先行技術文献】
【特許文献】
【００２６】
【特許文献１】特開２００２−７３３７１号公報
【特許文献２】特開昭６２−０９２０３５号公報
【特許文献３】特開平５−２１６７１９号公報
【発明の概要】
【発明が解決しようとする課題】
【００２７】
特開２００２−７３３７１号公報の技術は、実行したプログラムによっては、デバッガ１１を用いて所望のデバッグが十分にできない場合が有り得るという問題がある。その理由は以下のとおりである。図１に示すプログラムデバッグ装置１０００は、コンパイラ１０の最適化部１０５で展開関数とプログラム部分の行に対して、展開関数情報生成部１０８で情報を生成して、デバッグ情報記憶部１０３９の展開関数情報記憶部１０３３と行アドレス情報記憶部１０３４にデバッグのための情報として展開関数情報の関数とソース行番号を記憶している。しかし、コード生成部１０６で生成される実行コードは、最適化部１０５で行なわれる関数の展開だけでなく、関数を展開した後に元の関数の削除、共通のプログラム部分の行の結合や使われていないプログラム部分の行の削除等の最適化が実行された結果の実行コードになっている。そのため、ユーザが入力部１０９よりデバッガ１１に対してブレークポイントの設定等をした場合、その設定が実行コードの存在しない行番号になっていることが考えられる。その場合であっても、デバッガ１１は、最適化を考慮していない展開関数情報記憶部１０３３と行アドレス情報記憶部１０３４をデバッグ情報記憶部１０３９から情報として取得し、展開関数情報として展開関数とソース行番号が記憶されている中から対応する行番号を検索してブレークポイントを設定してしまう。その結果、デバッグ情報と実行コードとの整合性が取れず、ユーザの意図するブレーク動作をさせることができなくなる。すなわち、所望のデバッグが十分にできない場合が有り得る。
【課題を解決するための手段】
【００２８】
以下に、発明を実施するための形態で使用される番号・符号を用いて、課題を解決するための手段を説明する。これらの番号・符号は、特許請求の範囲の記載と発明を実施するための形態との対応関係を明らかにするために括弧付きで付加されたものである。ただし、それらの番号・符号を、特許請求の範囲に記載されている発明の技術的範囲の解釈に用いてはならない。
【００２９】
本発明のプログラムデバッグ装置は、プログラムの最適化機能を持つ。このプログラムデバッグ装置は、プログラムをデバッグするための情報としてのデバッグ情報及びプログラムの実行コードを生成するコンパイル部（２０００）と、生成されたデバッグ情報を格納するデバッグ情報記憶部（４１００）と、記憶されたデバッグ情報及び前記実行コードを用いてデバッグを行うデバッグ部（３０００）とを具備している。コンパイル部（２０００）は、最適化部（２１００）と、デバッグ情報生成部（２２００）とを備えている。最適化部（２１００）は、最適化機能による最適化の処理における関数の展開、関数の削除、共通のプログラム部分の行の結合、及び、使われていないプログラム部分の行の削除の実行の有無を抽出する。デバッグ情報生成部（２２００）は、抽出の結果に基づいて、デバッグ情報を生成する。
【００３０】
本発明では、コンパイル部（２０００）の関数の展開後に最適化されたプログラムからデバッグ情報（例示：展開関数情報）を生成することで、最適化により行の結合や行の削除をされなかったプログラムの行の情報（例示：行番号）を、デバッグ情報（例示：展開関数情報）をとして保持することができる。それにより、デバッグ情報（例示：展開関数情報）に実行コード上に存在しない行番号は含まれない。そのため、ユーザの意図するブレーク動作をさせることができないというような、所望のデバッグが十分にできない問題を防止できる。すなわち、デバッグ部（３０００）によるデバッグ時に行番号に対応する実行コードがないことにより所望のデバッグが十分にできない問題を起こさない、という作用・効果がある。
【００３１】
本発明のプログラムデバッグ方法は、プログラムの最適化機能を持つプログラムデバッグ装置を用いたプログラムデバッグ方法である。ただし、プログラムデバッグ装置（１００００）は、プログラムをデバッグするための情報としてのデバッグ情報及びプログラムの実行コードを生成するコンパイル部（２０００）と、生成されたデバッグ情報及び実行コードを格納するデバッグ情報記憶部（４１００）と、記憶されたデバッグ情報及び実行コードを用いてデバッグを行うデバッグ部（３０００）とを具備している。
プログラムデバッグ方法は、コンパイル部（２０００）が、プログラムを関数別に展開し、展開関数毎に展開先の行番号に任意の番号を付加するステップと、プログラムに関数呼び出しが存在しない場合、関数の最適化を行い、最適化して展開された結果不要になった関数の削除を行なうステップと、最適化された関数の情報として展開関数名及び任意の番号である展開関数情報番号の情報をデバッグ情報に含むようにデバッグ情報記憶部（４１００）に登録するステップと、展開関数のプログラムに対して共通のプログラム部分の行の結合及び使われていないプログラム部分の行の削除を含む最適化を行なうステップと、展開先の展開関数で行の結合や行の削除などの最適化の影響を受けずにプログラムが存在しているかを判断し、展開先の展開関数で最適化の影響を受けないプログラムが存在する場合は行番号をデバッグ情報に含むようにデバッグ情報記憶部（４１００）に登録するステップとを具備している。
【００３２】
本発明のプログラムは、上記のプログラムデバッグ方法をコンピュータに実行させる。
【００３３】
上記プログラムデバッグ方法やそれを実行させるプログラムについても、上記プログラムデバッグ装置と同様の作用・効果を得ることができる。
【発明の効果】
【００３４】
本発明により、ユーザの意図するブレーク動作をさせることができないというような、所望のデバッグが十分にできない問題を防止できる。
【図面の簡単な説明】
【００３５】
【図１】図１は、特開２００２−７３３７１号公報のプログラムデバッグ装置の構成を示すブロック図である。
【図２】図２は、特開２００２−７３３７１号公報のプログラムデバッグ装置における展開関数情報生成部の動作を示すフローチャートである。
【図３】図３は、特開２００２−７３３７１号公報のプログラムデバッグ装置における展開関数処理部の動作を示すフローチャートである。
【図４Ａ】図４Ａは、行アドレス情報記憶部に記憶された情報のテーブルの一例を示している。
【図４Ｂ】図４Ｂは、展開関数用先頭アドレス情報テーブルの一例を示している。
【図４Ｃ】図４Ｃは、展開関数用行アドレス情報テーブルの一例を示している。
【図５】図５は、本発明の実施の形態に係るプログラムデバッグ装置の構成を示すブロック図である。
【図６】図６は、本実施の形態に係るプログラムデバッグ装置のコンパイラより出力される展開関数情報の模式図である。
【図７Ａ】図７Ａは、本実施の形態に係るプログラムデバッグ装置のデバッグ情報の流れの一例を示す模式図である。
【図７Ｂ】図７Ｂは、本実施の形態に係るプログラムデバッグ装置のデバッグ情報の流れの一例を示す模式図である。
【図７Ｃ】図７Ｃは、本実施の形態に係るプログラムデバッグ装置のデバッグ情報の流れの一例を示す模式図である。
【図８】図８は、本発明の実施の形態に係るコンパイラ２０００による最適化部２１００からデバッグ情報生成部２２００の処理を示すフローチャートである。
【図９】図９は、本発明の実施の形態に係るデバッガ３０００による最適化展開関数処理部３１００の処理を示すフローチャートである。
【発明を実施するための形態】
【００３６】
以下、本発明の実施の形態に係るプログラムデバッグ装置およびプログラムデバッグ方法に関して、添付図面を参照して説明する。なお、同様の機能・動作を行う構成には符号を付している。
【００３７】
まず、本発明の実施の形態に係るプログラムデバッグ装置１００００の構成について説明する。
図５は、本発明の実施の形態に係るプログラムデバッグ装置１００００の構成を示すブロック図である。このプログラムデバッグ装置１００００は、コンピュータに例示される情報処理装置であり、図示されていないＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）と、記憶装置と、入力装置と、出力装置とを備えている。ＣＰＵ、記憶装置、入力装置、及び出力装置は、バスやケーブルにより互いに情報の送受信が可能に接続されている。記憶装置は、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、及びＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）に例示される。入力装置は、キーボード、及びマウスに例示される。出力装置は、ディスプレイやプリンタに例示される。
【００３８】
ＣＰＵは、例えば記憶媒体からＨＤＤにインストールされたコンピュータプログラムをＲＡＭに展開する。そして、展開されたコンピュータプログラムを実行して、必要に応じて記憶装置や入力装置や出力装置のようなハードウエアを制御しながら、当該コンピュータプログラムの情報処理を実現する。記憶装置は、コンピュータプログラムを記録し、ＣＰＵが利用する情報や生成する情報を記録する。入力装置は、ユーザに操作されることにより生成される情報をＣＰＵや記憶装置に出力する。出力装置は、ＣＰＵにより生成された情報や記憶装置の情報をユーザに認識可能に出力する。
【００３９】
プログラムデバッグ装置１００００は、コンピュータプログラムとしてのコンパイラ２０００及びデバッガ３０００と、記憶装置としての情報記憶部４０００と実行状態記憶部１１３と、入力装置としての入力部１０９とを備えている。コンパイラ２０００は、ユーザシステムの動作制御を行なうための実行コードを作成する。デバッガ３０００は、その実行コードが正しく動作するかを検証する。情報記憶部４０００は、プログラムと実行コードとデバッグ情報を記憶する。実行状態記憶部１１３は、プログラムの実行状態を記憶する。入力部１０９は、デバッガに対する指示を入力する。
【００４０】
コンパイラ２０００は、内部表現変換部１０４と最適化部２１００とコード生成部１０６とデバッグ情報生成部２２００とを備えている。
【００４１】
内部表現変換部１０４は、プログラム設計者が作成したプログラム（ソース）をソース行から内部表現のプログラムに変換して最適化部２１００へ出力する。最適化部２１００は、内部表現のプログラムについて、関数の展開や、関数を展開した後に元の関数の削除・共通のプログラム部分の行の結合や、使われていないプログラム部分の行の削除などの最適化の処理を行う。コード生成部１０６は、その最適化されたプログラムについて、実行コードを生成し、アドレスを割り当てる。
【００４２】
最適化部２１００は、関数展開最適化処理部２１１０と展開関数プログラム最適化処理部２１２０とを有している。関数展開最適化処理部２１１０は、関数が展開されることで関数呼び出しがなくなり削除される関数をデバッグ情報生成部２２００の関数展開最適化情報生成部２２１０に出力する。  
展開関数プログラム最適化処理部２１２０は、その削除される関数中で、共通のプログラム部分の行の結合や使われていないプログラム部分の行の削除などの最適化が行なわれていないプログラムの行番号をデバッグ情報生成部２２００の展開関数プログラム最適化情報生成部２２２０に出力する。
【００４３】
デバッグ情報生成部２２００は、上述のように関数展開最適化情報生成部２２１０と展開関数プログラム最適化情報生成部２２２０とを有している。デバッグ情報生成部２２００は、最適化部２１００から入力されるプログラムに基づいて、実行コードのデバッグ情報を生成して、デバッグ情報記憶部４１００に記憶する。また、デバッグ情報生成部２２００は、関数展開最適化情報生成部２２１０と展開関数プログラム最適化情報生成部２２２０により展開関数名と任意の番号である展開関数情報番号と展開関数の行番号から展開関数情報（例示：図６、詳細は後述される）を生成して、デバッグ情報記憶部４１００の最適化関数情報記憶部４１１０に記憶する。ここで、デバッグ情報は、プログラムをデバッグするための情報であり、展開関数情報を含んでいる。
【００４４】
デバッガ３０００は、実行状態監視部１１１と最適化展開関数処理部３１００とコード実行部１１０とを備えている。ユーザは、入力部１０９よりプログラム上の行番号を入力する。デバッガ３０００は、その入力された行番号と、行番号が存在する関数名とが通知される。
【００４５】
最適化展開関数処理部３１００は、最適化関数情報記憶部４１１０を参照する。そして、その関数名が登録されている展開関数情報を検出した場合、検出された展開関数情報を実行状態監視部１１１に登録する。実行状態監視部１１１は、コード実行部１１０の実行コードの実行状態を監視して、検出された展開関数情報の展開関数情報番号と行番号とから算出されたものと合致した実行コードに対して、設定されたブレークポイントでの停止等を行なう。更に、実行状態に応じて、展開関数情報を取得し、実行状態記憶部１１３に記録する。実行状態記憶部１１３に記録された情報は、ユーザがデバッグ時にデバッグ情報を確認したい時には、ディスプレイなどによる行やコード等の情報を参照できる（これらのブレークポイントでの停止や前記ディスプレイによる行やコードの表示等のデバッガがプログラムの行に対して行なう一連の処理を総称してデバッグ処理と記す）。
【００４６】
情報記憶部４０００は、プログラム記憶部１０１と実行コード記憶部１０２とデバッグ情報記憶部４１００とを備えている。プログラム記憶部１０１は、プログラム設計者が作成したプログラムが記憶される。実行コード記憶部１０２は、コンパイラ２０００のコード生成部１０６で生成された実行コードが記憶される。デバッグ情報記憶部４１００は、コンパイラ２０００のデバッグ情報生成部２２００で生成されたデバッグ情報が記憶される。デバッグ情報記憶部４１００は、最適化関数情報記憶部４１１０を有している。最適化関数情報記憶部４１１０は、コンパイラ２０００の関数展開最適化情報生成部２２１０と展開関数プログラム最適化情報生成部２２２０で生成され展開関数情報が記憶される。
【００４７】
図６は、本実施の形態に係るプログラムデバッグ装置１００００のコンパイラ２０００より出力される展開関数情報５００３の模式図である。展開関数情報５００３は、展開関数名６００１と展開関数情報番号（任意の数値）６００２とｎ行（ｎは整数）の行番号６００３を１つの情報群として構成されている。ここで、展開関数名６００１は、関数が展開されることで関数呼び出しがなくなり削除される関数の名前を示している。展開関数情報番号（任意の数値）６００２は、関数を展開するときソース行の行番号に付加される番号を示しており、展開後の行番号を相対的に示すために用いる。行番号６００３は、その削除される関数中で、共通のプログラム部分の行の結合や使われていないプログラム部分の行の削除などの最適化が行なわれていないプログラムの行番号（削除されていない行番号）を示している。この図では、最適化により削除された複数の関数分の展開関数情報５００３が、展開関数情報テーブル６０００として示されている。  
【００４８】
図７Ａ〜図７Ｃは、本実施の形態に係るプログラムデバッグ装置１００００のデバッグ情報の流れの一例を示す模式図である。
【００４９】
プログラムのコンパイルにおいて、図７Ａは、プログラム設計者が作成するプログラムに含まれている、展開関数Ａを示すプログラム５００１である。プログラム５００１は、展開関数名（展開関数Ａ）とその展開関数の内容を示すプログラム部分の複数の行（行１、行２、…、行ｎ）とで構成されている。なお、この図では展開関数Ａ以外のソース行は省略されている。
【００５０】
図７Ｂは、コンパイラ２０００がプログラムから作成した実行コードのうち、プログラム５００１が展開関数Ａの複数の呼び出し位置で展開された実行コード５００２である。実行コード５００２は、プログラムにおける複数の呼び出し位置に対応して、複数の展開先関数で構成されている。この例では、２箇所の読み出し位置で展開されている（展開先関数１、展開先関数２）。各展開先関数は展開関数名（展開関数Ａ）と展開関数情報番号（１００００）と複数の行番号（行番号１０００１、…）で構成される。ただし、行番号は、展開関数Ａの行番号に展開関数情報番号１００００を加えた値である。また、各展開先関数には、最適化の処理が施されている。その結果、各展開先関数には、共通のプログラム部分の行の結合や使われていないプログラム部分の行の削除などの最適化が行なわれていないプログラムの行番号（行番号１０００１、１０００３、１０００９、１００１０）が記載されている。すなわち、最適化が行われて削除された行番号（行番号１０００２、１０００４−１０００８、１００１１−１０００ｎ）は記載されていない。
【００５１】
図７Ｃは、図６の具体例を示し、実行コード５００２の作成と同時に作成される展開関数情報５００３である。展開関数情報５００３は、展開関数名（Ａ）と展開関数番号（１００００）と複数の行情報（行番号１、行番号３、行番号９、行番号１０）で構成されている。展開関数情報５００３は、関数が展開されることで関数呼び出しがなくなり削除される関数（展開関数Ａ）に関し、共通のプログラム部分の行の結合や使われていないプログラム部分の行の削除などの最適化が行なわれていないプログラムの行番号（行番号１、３、９、１０）が記載されている。ただし、行番号には展開関数番号（１００００）は加えられていない。この展開関数情報５００３が最適化関数情報記憶部４１１０に登録される。  
【００５２】
プログラムのデバッグにおいて、デバッガ３０００は、コンパイラ２０００が出力した図７Ｂと図７Ｃを使用する。入力部１０９よりデバッガ３０００への入力は、図７Ａのプログラム５００１の行に対応した行番号となる。図７Ｃは、前述の入力されたプログラム５００１（図７Ａ）の行を基にデバッガ３０００が取得する展開関数情報５００３である。図７Ｂは、デバッガ３０００が実行を行なう実行コード５００２である。入力されたプログラム５００１（図７Ａ）の行から展開関数情報５００３（図７Ｃ）を取得して実行状態監視部１１１に登録し、実行状態監視部１１１で実行を監視しながら実行コード５００２（図７Ｂ）を実行する構成となっている。
【００５３】
次に、本発明の実施の形態に係るプログラムデバッグ装置１００００の動作について説明する。ここでは、コンパイラ２０００の処理のうち、最適化部２１００からデバッグ情報生成部２２００の処理について説明する。コンパイラ２０００におけるその他の処理は、既存の技術を用いることができる。
【００５４】
図８は、本発明の実施の形態に係るコンパイラ２０００による最適化部２１００からデバッグ情報生成部２２００の処理を示すフローチャートである。プログラムデバッグ装置１００００のコンパイラ２０００の関数展開最適化処理部２１１０は、最初にプログラム設計者が作成したプログラムを、関数別に実行コードに展開する（ステップＳ１００１）。例えば、プログラム設計者が作成したプログラムに含まれる展開関数Ａであるプログラム５００１（図７Ａ）は、プログラム中の関数呼び出しの位置ごとに、実行コードに展開される。
【００５５】
関数展開最適化処理部２１１０は、関数を実行コードに展開するとき、展開関数毎に展開先の行番号に対して任意の番号を付加する（ステップＳ１００２）。例えば、プログラム５００１の展開関数Ａ（図７Ａ）は、実行コード５００２に展開されるとき、図７Ｂに示すように、展開先関数１及び展開先関数２として展開される。そのとき、展開関数Ａ（図７Ａ）の行１に対応して、展開先の行番号として、展開先関数１及び展開先関数２では任意の番号１００００が付加され、行番号１０００１となる。ただし、この段階では、最適化は行われていないため、行番号は、プログラム５００１の展開関数Ａの行番号に対応している。すなわち、図示されないが、展開先関数１及び展開先関数２の行番号は、いずれも行番号１０００１、１０００２、…、１０００＋ｎである。
【００５６】
関数展開最適化処理部２１１０は、関数の展開によりプログラム５００１に関数呼び出しが存在しているか否かを判断する（ステップＳ１００３）。関数呼び出しが存在する場合（ステップＳ１００３：Ｙｅｓ）、処理を終了する。一方、関数呼び出しが存在しない場合（ステップＳ１００３：Ｎｏ）、コンパイラ２０００の関数展開最適化処理部２１１０は、関数の最適化を行う。具体的には、展開関数が呼び出し位置で展開された結果（例示：展開先関数１、展開先関数２）、不要になった元の関数（例示：展開関数Ａ）の削除を行なう（ステップＳ１００４）。
【００５７】
関数展開最適化処理部２１１０は、最適化された関数の情報として、展開関数名とステップＳ１００２で付加した任意の番号である展開関数情報番号とを、関数展開最適化情報生成部２２１０に送る。図７Ａ及び図７Ｂの例では、展開関数名として展開関数Ａ、展開関数情報番号として１００００を送る。関数展開最適化情報生成部２２１０は、受信した展開関数名及び展開関数情報番号を展開関数名６００１及び展開関数情報番号６００２（図６、又は、図７Ｃの展開関数名Ａ；（展開関数情報番号）１００００）として最適化関数情報記憶部４１１０に登録する（ステップＳ１００５）。
【００５８】
コンパイラ２０００の展開関数プログラム最適化処理部２１２０は、各展開関数（例示：展開関数Ａ）のプログラムに対して、共通のプログラム部分の行の結合や使われていないプログラム部分の行の削除などの最適化を行なう（ステップＳ１００６）。その結果、例えば図７Ｂのように、展開先関数１では行番号として１０００１、１０００３が残り、展開先関数２では行番号として１０００１、１０００９、１００１０が残る。最適化の方法は従来知られた方法を用いることができる。
【００５９】
展開関数プログラム最適化処理部２１２０は、関数呼び出しの展開先でプログラム部分の結合や削除などの最適化でも、展開関数のプログラムが存在しているかを判断する（ステップＳ１００７）。関数呼び出しの展開先で最適化により展開関数のプログラムの行が存在しない場合（ステップＳ１００７：Ｎｏ）は処理を終了する。関数呼び出しの展開先で最適化により展開関数のプログラムの行が存在する場合（ステップＳ１００７：Ｙｅｓ）、その行番号のみを展開関数プログラム最適化情報生成部２２２０に送る。例えば、図７Ｂの例では、展開関数Ａについて、最適化後において、関数呼び出しの展開先で展開関数のプログラムの行として、行番号１０００１、１０００３、１０００９、１００１０が存在する。従って、展開関数Ａについて、行番号１０００１、１０００３、１０００９、１００１０を展開関数プログラム最適化情報生成部２２２０に送る。展開関数プログラム最適化情報生成部２２２０は、受信した行番号を図６の行番号６００３として最適化関数情報記憶部４１１０に登録する（ステップＳ１００８）。例えば、図７Ｂの例では、最終的に図７Ｃに示すように、行番号１、３、９、１０が登録される。ただし、行番号としては、展開関数情報番号１００００を引いた値（ソースにおける行番号）が登録される。その結果、最適化関数情報記憶部４１１０は、展開関数名Ａ、展開関数情報番号１００００、行番号１、３、９、１０を含む展開関数情報５００３を記憶する。
【００６０】
展開関数プログラム最適化処理部２１２０は、関数呼び出しの展開先で最適化されても展開関数のプログラム部分の行が存在しなくなるまでステップＳ１００７に戻り処理を繰り返す。
【００６１】
図９は、本発明の実施の形態に係るデバッガ３０００による最適化展開関数処理部３１００の処理を示すフローチャートである。ここでは、デバッガ３０００の処理のうち、最適化展開関数処理部３１００の処理について説明する。デバッガ３０００におけるその他の処理は、既存の技術を用いることができる。
【００６２】
最適化展開関数処理部３１００は、プログラム設計者又はデバッグ作業者により、プログラムデバッグ装置１００００の入力部１０９から入力されたブレークポイントの行を受信する（ステップＳ２００１）。
【００６３】
次に、最適化展開関数処理部３１００は、入力された行番号が最適化関数情報記憶部４１１０に登録された関数か否かを判断する（ステップＳ２００２）。例えば行番号が「３」の場合、最適化関数情報記憶部４１１０に登録された展開関数Ａ（図７Ｃ）に含まれる行番号なので、登録された関数と判断する。入力された行番号が登録された関数でない場合（ステップＳ２００２：Ｎｏ）、最適化展開関数処理部３１００は、コンパイラ２０００のデバッグ情報生成部２２００で生成されてデバッグ情報記憶部４１００に登録されているデバッグ情報を取得して（ステップＳ２００５）、デバッグ処理を実行する（ステップＳ２００６）。
【００６４】
入力された行番号が登録された関数の場合（ステップＳ２００２：Ｙｅｓ）、最適化展開関数処理部３１００は、入力されたプログラムの行に対応する展開関数の実行コード上の行番号を検出するために、最適化関数情報記憶部４１１０を参照して、展開関数情報番号（任意の番号）および行番号を取得する（ステップＳ２００３）。例えば、図７Ｃの展開関数情報５００３を参照して、展開関数Ａの展開関数情報番号１００００および行番号１、３、９、１０を取得する。デバッガ３０００は、取得した展開関数情報番号と行番号からステップＳ２００１にて入力された実行コード上の合致する行番号を検出する（ステップＳ２００４）。例えば、取得した展開関数情報番号１００００および行番号１、３、９、１０と、入力された行番号３とから、図７Ｂにおいて実行コード上の行番号は１０００３であると検出する。デバッガ３０００は、検出した行番号情報をもとにデバッグ処理を実行する（ステップＳ２００６）。  
【００６５】
本発明は、プログラムの最適化機能を持つプログラムデバッグ装置において、コンパイラの最適化における関数の展開や削除、共通のプログラム部分の行の結合や使われていないプログラム部分の行の削除がされたかを抽出するコンパイラの最適化部と前記抽出情報よりデバッグするための情報を生成するコンパイラのデバッグ情報生成部と生成したデバッグ情報を格納するデバッグ情報記憶部と前記記憶されたデバッグ情報を用いてデバッグを行うデバッガとを有し、コンパイラの関数の展開後に最適化されたプログラムから展開関数情報を生成することで最適化により結合や削除されないプログラムの行番号を展開関数情報として保持することにより、展開関数情報に実行コード上に存在しない行番号は含まれないため、デバッガによるデバッグ時に行番号に対応する実行コードがないことによる誤動作を起こさない効果がある。
【００６６】
図７Ａ〜図７Ｃ（本実施の形態のプログラムデバッグ装置１００００のデバッグ情報の流れを示す）を用いて従来技術の問題点が解決されるメカニズムを説明する。  
【００６７】
図７Ａのプログラム５００１は、展開関数情報番号を１００００とした場合にコンパイラ２０００が図８のステップＳ１００１で展開関数Ａ中の全ての行番号をステップＳ１００２で付加された番号である１００００を加えたものとして、実行コード５００２内の関数呼び出し先に展開される。  
【００６８】
図７Ｂの実行コード５００２は、最適化後に、展開先関数１の展開関数Ａの行番号が１０００１、１０００３、展開先関数２の展開関数Ｂの行番号が１０００１、１０００９、１００１０となる。  
【００６９】
図７Ｃの展開関数情報５００３は、実行コード５００２から展開関数情報を生成したものである。例えば、展開関数Ａが展開先の全ての関数において行番号の“２”で示される行が、最適化によって削除されていれば、展開関数情報５００３に行番号２の行情報を付加しない（図７Ｃ）。しかし、展開関数Ａが展開先の全ての関数のいずれかにおいて行番号の“２”で示される行が１つでも存在していれば、図３のフォーマットに従い、展開関数情報５００３に行番号２の行情報を付加してデバッグ情報を最適化関数情報記憶部４１１０に格納する。
【００７０】
デバッガ３０００では、入力部１０９よりプログラム５００１の展開関数Ａの行番号として“１”が入力された場合、展開関数情報５００３の展開関数Ａの展開関数情報から展開関数情報番号は１００００のため、実行コード５００２内から展開関数情報番号＋行番号である１０００１と合致した展開先関数１／展開先関数２の行番号１０００１に対してデバッグ処理を行なう。それにより、デバッガが誤動作せずに関数が展開されて最適化されたプログラムであってもデバッグが可能となる。  
【００７１】
本実施の形態により、少なくとも以下の効果を得ることができる。
第１の効果として、コンパイラにより最適化されたプログラムをデバッグできる。その理由としては、デバッガがコンパイラで最適化により展開された関数とプログラムの行番号で構成された情報を使用するため、その情報の行番号に対応する実行コードが必ず存在し、実行コードとデバッグ情報の整合性がとれているため、デバッガでプログラム実行時に誤動作することがないからである。  
【００７２】
第２の効果として、デバッグ時のプログラムロードが短くなる。その理由としては、本実施の形態では、関数が展開されて呼び出しがなくなった関数（呼び出し位置に展開された関数）の情報と、共通のプログラム部分の行の結合や使われていないプログラム部分の行の削除が行なわれない行番号（最適化後に残った行番号）の情報のみを持つため、従来のコンパイラのように最適化時に展開される関数の情報を保持する必要がなく、デバッグ情報ファイルが小さくなりデバッグ時のプログラムロードからデバッグ開始までの時間を短縮できるからである。  
【００７３】
第３の効果としては、格納するデバッグ情報が小さくてすむ。その理由としては、上記第２の効果の場合と同様に保持する情報を少なくすることができるためである。  
【００７４】
本発明は上記各実施の形態に限定されず、本発明の技術思想の範囲内において、各実施の形態は適宜変形又は変更され得ることは明らかである。
【符号の説明】
【００７５】
１００００  プログラムデバッグ装置  
２０００  コンパイラ  
２１００  最適化部  
２１１０  関数展開最適化処理部  
２１２０  展開関数プログラム最適化処理部  
２２００  デバッグ情報生成部  
２２１０  関数展開最適化情報生成部  
２２２０  展開関数プログラム最適化情報生成部  
３０００  デバッガ  
３１００  最適化展開関数処理部  
４０００  情報記憶部  
４１００  デバッグ情報記憶部  
４１１０  最適化関数情報記憶部  
５００１  プログラム  
５００２  実行コード  
５００３  展開関数情報  
６０００  展開関数情報テーブル  
６００１  展開関数名  
６００２  展開関数情報番号  
６００３  行番号  
１０００  プログラムデバッグ装置  
１０  コンパイラ  
１１  デバッガ  
１０１  プログラム記憶部  
１０２  実行コード記憶部  
１０３  デバッグ情報記憶部  
１０３３  展開関数情報記憶部  
１０３４  行アドレス情報記憶部  
１０４  内部表現変換部  
１０５  最適化部  
１０５１  関数展開最適化部  
１０６  コード生成部  
１０７  デバッグ情報生成部  
１０８  展開関数情報生成部  
１０９  入力部  
１１０  コード実行部  
１１１  実行状態監視部  
１１２  展開関数処理部  
１１３  実行状態記憶部  
４０１  アドレス情報  
４０２  展開関数フラグ  
５０１  展開関数名  
５０２  展開関数用先頭アドレス情報テーブルポインタ  
５０３  相対アドレス情報  
６０１  先頭アドレス  
【図１】
2011204204.tif 000003
【図２】
2011204204.tif 000004
【図３】
2011204204.tif 000005
【図４Ａ】
2011204204.tif 000006
【図４Ｂ】
2011204204.tif 000007
【図４Ｃ】
2011204204.tif 000008
【図５】
2011204204.tif 000009
【図６】
2011204204.tif 000010
【図７Ａ】
2011204204.tif 000011
【図７Ｂ】
2011204204.tif 000012
【図７Ｃ】
2011204204.tif 000013
【図８】
2011204204.tif 000014
【図９】
2011204204.tif 000015