(57)【要約】【課題】不具合を有する最下層のサブルーチンを効率的に特定するデバッガプログラム及びデバッグ方法を提供する。【解決手段】デバッグ対象プログラムのデバッグ処理をコンピューターに実行させる前記コンピューター読み取り可能なデバッガプログラムにおいて、前記デバッグ処理は、前記デバッグ対象プログラムの有するデバッグ対象サブルーチン内で当該デバッグ対象プログラムが一時停止した状態で、停止以降に実行される当該デバッグ対象サブルーチン内の下位サブルーチン呼び出し命令文の指定に応答して、前記一時停止時のメモリ情報及びプログラムカウンタ値を含むプログラム実行状態を退避し、前記下位サブルーチンを実行しその実行結果情報を表示画面に出力すると共に、前記退避したプログラム実行状態を復帰させるサブルーチン事前実行工程を、有する。【選択図】図８
2012256195.tif 000002
【特許請求の範囲】
【請求項１】
デバッグ対象プログラムのデバッグ処理をコンピューターに実行させる前記コンピューター読み取り可能なデバッガプログラムにおいて、
前記デバッグ処理は、
前記デバッグ対象プログラムの有するデバッグ対象サブルーチン内で当該デバッグ対象プログラムが一時停止した状態で、停止以降に実行される当該デバッグ対象サブルーチン内の下位サブルーチン呼び出し命令文の指定に応答して、前記一時停止時のメモリ情報及びプログラムカウンタ値を含むプログラム実行状態を退避し、前記下位サブルーチンを実行しその実行結果情報を表示画面に出力すると共に、前記退避したプログラム実行状態を復帰させるサブルーチン事前実行工程を、有するデバッガプログラム。
【請求項２】
請求項１において、
前記デバッグ処理は、前記サブルーチン事前実行工程の後、前記復帰したプログラム実行状態から前記デバッグ対象プログラムの実行を再開する再開工程を有するデバッガプログラム。
【請求項３】
請求項１または２において、
前記実行結果情報は、前記下位サブルーチンの実行結果を示す戻り値を有するデバッガプログラム。
【請求項４】
請求項１乃至３のいずれかにおいて、
前記デバッグ処理は、前記コンピューターの前記表示画面に出力された前記命令文上にポインタを移動させた時に前記命令文の指定を検出するデバッガプログラム。
【請求項５】
デバッグ対象プログラムの有するデバッグ対象サブルーチン内で当該デバッグ対象プログラムが一時停止した状態で、停止以降に実行される当該デバッグ対象サブルーチン内の下位サブルーチン呼び出し命令文の指定に応答して、前記一時停止時のメモリ情報及びプログラムカウンタ値を含むプログラム実行状態を退避し、前記下位サブルーチン呼び出し命令文を実行しその実行結果情報を表示画面に出力すると共に、前記退避したプログラム実行状態を復帰させるサブルーチン事前実行工程を、
前記デバッグ対象サブルーチン内の全ての前記下位サブルーチン呼び出し命令文について、前記実行結果情報がエラーを示すエラー下位サブルーチン呼び出し命令文が検出されるまで繰り返すエラー下位サブルーチン検出工程を有し、
前記エラー下位サブルーチンを前記デバッグ対象サブルーチンとして実行する前記エラー下位サブルーチン検出工程を、前記エラー下位サブルーチンが最下層のサブルーチンになるまで繰り返すデバッグ方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、デバッガプログラム及びデバッグ方法に関する。
【背景技術】
【０００２】
従来から、プログラムで発生している不具合箇所の特定や、プログラムが期待通りに動作するか否かの検証のために、デバッガプログラム（以下、デバッガ）が用いられる。デバッガは、例えば、デバッグ対象プログラムについて、命令文単位の実行や（ステップイン機能、ステップオーバー機能）、ブレークポイントとして設定した命令文の実行直前での一時停止（ブレークポイント機能）、変数等のメモリ情報の参照及び変更等を可能にする。
【０００３】
例えば、ユーザーが、デバッガ上で、デバッグ対象プログラム内の命令文にブレークポイントを設定しその実行を指示すると、デバッガは、ブレークポイントが設定された命令文の直前でデバッグ対象プログラムを一時停止状態にする（以下、ブレークすると称する）。また、デバッガは、ブレークした状態のテスト対象プログラムに対して、変数値の参照及び変更や、命令文単位の逐次実行、及び、次の別のブレークポイントまでの連続実行等を可能にする。
【０００４】
一般的に、プログラムは、繰り返し行われる命令文のまとまりや、機能を構築する命令文のまとまりをサブルーチンとして有する。メインのルーチンはサブルーチンを呼び出し、呼び出されたサブルーチンから、さらに別のサブルーチンが呼び出される。デバッグ対象プログラムがサブルーチンを有する場合、ユーザーは、デバッグ処理において、まず、不具合を有するサブルーチンを特定する。
【０００５】
例えば、ユーザーは、デバッガ上で、デバッグ対象プログラム内の命令であって、サブルーチン実行後のエラー処理の命令文にブレークポイントを設定し、当該デバッグ対象プログラムをデバッガに実行させる。その結果、デバッグ対象プログラムがブレークした場合は、サブルーチン内でエラーが発生しエラー処理が実行されることが判明する。これにより、当該サブルーチンが不具合を有することが特定される。
【０００６】
なお、プログラムのテストの効率化については、様々な技術が開示されている（特許文献１、２）。
【０００７】
一方、昨今、ソフトウェアの巨大化に伴い、ソフトウェアを構成するプログラム内のサブルーチン数の増加、サブルーチンの呼び出し構造の多層化が進んでいる。このようなデバッグ対象プログラムについてデバッグを行う場合、デバッグ対象プログラムの有する全てのサブルーチンについて、そのエラー処理の命令文にブレークポイントを設定することは、膨大な工数を要する。
【０００８】
そこで、ユーザーは、まず、エラー処理が発生する上位のサブルーチンを特定し、続いて、当該上位のサブルーチンから呼び出される下位のサブルーチンのうち、エラー処理が発生するサブルーチンを特定する。続いて、ユーザーは、特定された下位のサブルーチンから呼び出されるさらに下位のサブルーチンのうち、エラー処理が発生するサブルーチンを特定する。この工程が、不具合を有する最下層のサブルーチンが特定されるまで、デバッガ上で繰り返し行われる。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開平７−２１９８１０号公報
【特許文献２】特開平４−３０７６３０号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかしながら、ユーザーは、不具合を有する最下層のサブルーチンを特定していく工程において、デバッガ上で、デバッグ対象プログラムを何度も初めから実行し直す必要がある。その理由は、サブルーチン実行後のエラー処理の命令文でブレークした時点で、次にブレークポイントを設定する対象である命令文、即ち、当該エラーが発生したサブルーチン内で呼び出される下位のサブルーチン実行後のエラー処理の命令文は、既に実行された後であるためである。デバッガはデバッグ対象プログラムを遡って実行させることができない。
【００１１】
そのため、ユーザーは、デバッガ上で、一旦、デバッグ対象プログラムを終了しメモリクリア等、初期化させた上で、ブレークポイントを下位のサブルーチン実行後のエラー処理の命令文に設定し直し、デバッグ対象プログラムを初めの命令文から再実行させていた。これは、デバッグ操作を煩雑にする上に、デバッグ対象プログラムの実行にテスト環境の準備や画面操作が伴う場合、デバッグ処理に要する工数を増大させる。このため、不具合を有する最下層のサブルーチンの階層が深い場合、デバッグ対象プログラムを何度も初めから実行し直す必要があり、デバッグ処理に膨大な工数を要していた。
【００１２】
そこで、本発明は、不具合を有する最下層のサブルーチンを効率的に特定するデバッガプログラム及びデバッグ方法を提供する。
【課題を解決するための手段】
【００１３】
第１の側面は、デバッグ対象プログラムのデバッグ処理をコンピューターに実行させる前記コンピューター読み取り可能なデバッガプログラムにおいて、
前記デバッグ処理は、
前記デバッグ対象プログラムの有するデバッグ対象サブルーチン内で当該デバッグ対象プログラムが一時停止した状態で、停止以降に実行される当該デバッグ対象サブルーチン内の下位サブルーチン呼び出し命令文の指定に応答して、前記一時停止時のメモリ情報及びプログラムカウンタ値を含むプログラム実行状態を退避し、前記下位サブルーチンを実行しその実行結果情報を表示画面に出力すると共に、前記退避したプログラム実行状態を復帰させるサブルーチン事前実行工程を、有する。
【発明の効果】
【００１４】
第１の側面によれば、不具合を有する最下層のサブルーチンの特定を効率的にする。
【図面の簡単な説明】
【００１５】
【図１】本実施の形態例におけるデバッガシステムの構成の一例を表す図である。
【図２】図１のデバッガのブロック図の一例を表す図である。
【図３】従来のデバッガの表示画面の一例である。
【図４】デバッガにおけるステップイン機能、ステップオーバー機能を説明する図である。
【図５】デバッグ対象プログラム全体のサブルーチンの構成を表す図である。
【図６】従来のデバッガの操作手順を示すフローチャート図である。
【図７】本実施の形態例におけるデバッガの表示画面の一例である。
【図８】本実施の形態例におけるデバッガの操作手順を示すフローチャート図である。
【図９】本実施の形態例におけるデバッガの別の表示画面を表す図である。
【図１０】図８のフローチャートの工程Ｓ２３の処理を表すフローチャート図である。
【図１１】ウィンドウ情報テーブル及びデバッグ情報テーブルを表す図である。
【図１２】本実施の形態例におけるデバッガの表示画面の変形例を表す図である。
【発明を実施するための形態】
【００１６】
以下、図面にしたがって本発明の実施の形態について説明する。ただし、本発明の技術的範囲はこれらの実施の形態に限定されず、特許請求の範囲に記載された事項とその均等物まで及ぶものである。
【００１７】
図１は、本実施の形態例におけるデバッガシステムの構成の一例を表す図である。同図において、デバッガシステムは、例えば、デバッグ機能を備えるデバッガアプリケーションプログラム２１を有するコンピューター１０と、当該コンピューター１０に接続されデバッグの対象のプログラム（以下、デバッグ対象プログラム）６０が動作するコンピューター５０と、を有する。
【００１８】
デバッグ対象プログラム６０が動作するコンピューター５０は、プロセッサ５２、デバッグ対象プログラム６０が格納されたメモリ５３、外部インターフェイス５１を有する。プロセッサ５２はコンピューター５０全体を制御し、外部インターフェイス５１はコンピューター１０との通信処理を制御する。デバッグ対象プログラム６０はプロセッサ５２と協働することによって、当該デバッグ対象プログラム６０の機能を実現する。
【００１９】
一方、デバッガアプリケーションプログラム２１を有するコンピューター１０は、例えば、外部インターフェイス１１、プロセッサ１２、操作手段１３、表示手段１４、メモリ１５を有する。また、メモリ１５はデバッガアプリケーションプログラム２１を有する。外部インターフェイス１１はコンピューター５０との通信処理を行い、操作手段１３はユーザーからのデバッガアプリケーションプログラム（以下、デバッガ）２１への操作指示を受け付ける。また、表示手段１４は、デバッガ２１上で実行中のソースコードや、変数等のメモリ情報を表示する。プロセッサ１２は、コンピューター１０全体の制御を行う。デバッガ２１は、コンピューター１０と協働することによって、本実施の形態例におけるデバッガ機能を実現する。
【００２０】
図２は図１のデバッガ２１の機能ブロック図の一例を表す図である。同図において、デバッガ２１は、例えば、ウィンドウ処理手段３１、サブルーチン実行手段３２、デバッグ情報管理手段３３、メモリ管理手段３４、レジスタ管理手段３５、を有する。ウィンドウ処理手段３１はデバッガ２１の表示画面に出力された情報を処理する手段であり、ウィンドウ情報管理テーブルＴｗにアクセスする。デバッグ情報管理手段３３は、デバッグ対象プログラム６０生成時に合わせて生成されるデバッグ情報管理テーブルＴｄを管理する手段である。メモリ管理手段３４は、デバッグ対象プログラム６０が動作するコンピューター５０のメモリを管理する手段であり、メモリ管理テーブルＴｍにアクセスする。レジスタ管理手段３５は、コンピューター５０のレジスタを管理する。
【００２１】
本実施の形態例におけるデバッガ２１の処理について説明する前に、まず、本実施の形態例におけるデバッグ対象プログラム６０のソースコードの概要と、デバッガ２１の主な機能、及び、従来のデバッガにおけるデバッグ処理の流れを説明する。
【００２２】
図３は、従来のデバッガにおける表示画面Ｃ１、Ｃ２の一例である。同図の表示画面Ｃ１、Ｃ２には、デバッグ対象プログラム６０を構成するソースコードの一部（ｓｏｕｒｃｅ１．ｃ：Ｓ１、ｓｏｕｒｃｅ２．ｃ：Ｓ２）が表示されている。ここで、まず、ソースコードＳ１、Ｓ２について説明する。
【００２３】
図３のソースコードＳ１には、デバッグ対象プログラム６０のメインルーチンｍａｉｎと、当該メインルーチンｍａｉｎから呼び出されるサブルーチンａｄｄ＿ｎｕｍが記述されている。一方、ソースコードＳ２には、ソースコードＳ１に記述されたサブルーチンａｄｄ＿ｎｕｍから呼び出されるサブルーチンのひとつであるサブルーチンＦｕｎｃＣが記述されている。ソースコードＳ１では、６行目から１２行目までメインルーチンｍａｉｎが、１４行目から２８行目までサブルーチンａｄｄ＿ｎｕｍが記述されている。
【００２４】
メインルーチンｍａｉｎの９行目の命令文は、サブルーチンａｄｄ＿ｎｕｍを呼び出し、当該サブルーチンの処理結果を示す戻り値を変数ｒｅｔにセットする命令文である。このサブルーチンａｄｄ＿ｎｕｍの処理結果を示す戻り値は、ソースコードＳ１の１４行目から２８行目内のｒｅｔｕｒｎ命令文によって出力される定数「ＥＲＲＯＲ」や変数「ｎｕｍ」である。ｒｅｔｕｒｎ命令は、その引数にセットした値（ここでは、「ＥＲＲＯＲ」「ｎｕｍ」）を戻り値として出力し、サブルーチンを終了させる命令である。さらに、１１行目のｒｅｔｕｒｎ命令文は、その引数にセットした変数ｒｅｔを、デバッグ対象プログラム６０自体の戻り値として出力する命令文である。
【００２５】
また、サブルーチンａｄｄ＿ｎｕｍの１８行目の命令文はサブルーチンＦｕｎｃＡ、２１行目の命令文はサブルーチンＦｕｎｃＢ、２４行目の命令文はサブルーチンＦｕｎｃＣをそれぞれ呼び出すと共に（例えば、２４行目の場合はＦｕｎｃＣ（）部分）、当該サブルーチンの処理結果を示す戻り値を変数ｎｕｍにセットする命令文である。例えば、２４行目のサブルーチンＦｕｎｃＣの呼び出し命令文の場合、変数ｎｕｍにセットされる戻り値は、サブルーチンＦｕｎｃＣ（ソースコードＳ２）内のｒｅｔｕｒｎ命令によって出力される定数ＥＲＲＯＲまたは変数ｎｕｍ１である。そして、各命令文１８行目、２１行目、２４行目では、さらに、ｉｆ文によって、戻り値がセットされた変数ｎｕｍとエラー値を示す定数ＥＲＲＯＲとを比較する。
【００２６】
値が一致する場合、次行のｒｅｔｕｒｎ命令文（１９行目、２２行目、２５行目）が実行され、サブルーチンａｄｄ＿ｎｕｍは定数ＥＲＲＯＲを出力して終了する。つまり、各サブルーチンが出力する戻り値（例えば、ＦｕｎｃＣの場合、ＥＲＲＯＲまたはｎｕｍ１）がＥＲＲＯＲであり、ｉｆ文の判定がｔｒｕｅの場合、ｒｅｔｕｒｎ命令文（１９行目、２２行目、２５行目）は、定数ＥＲＲＯＲを戻り値として出力する。一方、値が一致しない場合は、次行のｒｅｔｕｒｎ命令文は実行されず、その後続の命令文が実行される。全てのサブルーチンＦｕｎｃＡ〜ＦｕｎｃＣが戻り値として定数ＥＲＲＯＲを出力しない場合、２７行目のｒｅｔｕｒｎ命令文が実行され、変数ｎｕｍが戻り値として出力される。
【００２７】
続いて、図３のソースコードＳ２について説明する。ソースコードＳ２には、ソースコードＳ１のサブルーチンａｄｄ＿ｎｕｍから呼び出されるサブルーチンＦｕｎｃＣが記述されている。サブルーチンＦｕｎｃＣの７６行目、７９行目、１０１行目の命令文は、前述と同様に、それぞれサブルーチンＦｕｎｃＦ、ＦｕｎｃＧ、ＦｕｎｃＨを呼び出し、その戻り値がセットされた変数ｎｕｍ１と定数ＥＲＲＯＲとを比較する。
【００２８】
値が一致する場合、サブルーチンＦｕｎｃＣを終了させる次行のｒｅｔｕｒｎ命令文（７７行目、８０行目、１０２行目）が実行され、サブルーチンＦｕｎｃＣは定数ＥＲＲＯＲを出力して終了する。その結果、ソースコードＳ１におけるサブルーチンａｄｄ＿ｎｕｍの２４行目のＦｕｎｃＣ呼び出し命令文の変数ｎｕｍに、定数ＥＲＲＯＲがセットされる。一方、値が一致しない場合は、次行のｒｅｔｕｒｎ命令文は実行されず、その後続の命令文が実行される。全てのサブルーチンＦｕｎｃＦ〜ＦｕｎｃＨが戻り値として定数ＥＲＲＯＲを出力しなければ、１０４行目の変数ｎｕｍ１の値を出力するｒｅｔｕｒｎ命令文が実行される。
【００２９】
このように、図３の本実施の形態例におけるデバッグ対象プログラム６０において、上位のサブルーチンａｄｄ＿ｎｕｍから下位のサブルーチンＦｕｎｃＡ、ＦｕｎｃＢ、ＦｕｎｃＣが呼び出され、下位のサブルーチン（例えば、サブルーチンＦｕｎｃＣ）から、さらに下位のサブルーチン（例えば、ＦｕｎｃＦ、ＦｕｎｃＧ、ＦｕｎｃＨ）が呼び出される。また、下位のサブルーチンの戻り値がｉｆ文による比較によってエラーを示す値であると判定された場合、その直後のｒｅｔｕｒｎ命令は、定数ＥＲＲＯＲを戻り値として出力する。つまり、ｉｆ文による戻り値判定直後の命令文「ｒｅｔｕｒｎ ＥＲＲＯＲ」は、各サブルーチンのエラー処理に該当する。
【００３０】
また、図３の例において、サブルーチンａｄｄ＿ｎｕｍは、１４行目の命令文から順に実行され、１９行目の命令文が実行される場合はサブルーチンＦｕｎｃＡ、２２行目の命令文が実行される場合はサブルーチンＦｕｎｃＢ、２５行目の命令文が実行される場合はサブルーチンＦｕｎｃＣにおいてエラーが発生することを表す。一方、１４行目、１９行目、２５行目の命令文が実行されず、２７行目のｒｅｔｕｒｎ命令文が実行される場合、サブルーチンＦｕｎｃＡ〜ＦｕｎｃＣでは、エラーが発生しなかったことを表す。
【００３１】
また、仮に、サブルーチンＦｕｎｃＣでエラーが発生する場合、７７行目の命令文が実行される場合はサブルーチンＦｕｎｃＦ、８０行目の命令文が実行される場合はサブルーチンＦｕｎｃＧ、１０２行目が実行される場合はサブルーチンＦｕｎcＨにおいてエラーが発生することを表す。また、７７行目、８０行目、１０２行目の命令文が実行されず、１０４行目のｒｅｔｕｒｎ命令文が実行される場合、サブルーチンＦｕｎｃＦ〜ＦｕｎｃＨでは、エラーが発生しなかったことを表す。
【００３２】
なお、図３に示したソースコードＳ１、Ｓ２は、デバッグ対象プログラム６０を構成するソースコードの一部である。デバッグ対象プログラム６０の全体のサブルーチン構成については、別の図で後述する。
【００３３】
続いて、図３の従来のデバッガの表示画面Ｃ１、Ｃ２及び図４に基づいて、デバッガの主な機能について説明する。デバッガの主な機能は、ブレークポイント機能、ステップイン機能、ステップオーバー機能である。
【００３４】
初めにブレークポイント機能について説明する。ブレークポイント機能は、デバッガ上で、デバッグ対象プログラム６０の任意の命令文にブレークポイントが設定され実行が指示された場合に、当該ブレークポイントを設定した命令文の直前でデバッグ対象プログラム６０の処理を一時停止（ブレーク）する機能である。ただし、ブレークポイントを設定した命令文が実行されない場合、デバッグ対象プログラム６０はブレークしない。また、複数のブレークポイントが設定されている場合、デバッガ対象プログラムは初めに実行されるブレークポイントでブレークする。
【００３５】
ユーザーは、ブレークポイント機能を利用して、エラー処理が発生する下位のサブルーチンを特定する。例えば、ユーザーは、デバッガ上で、予め、サブルーチンのエラー処理の命令文にブレークポイントを設定しておき、デバッグ対象プログラム６０を実行させる。デバッグ対象プログラム６０がブレークした場合、ブレークしたブレークポイントに対応するサブルーチンのエラー処理が実行されること、即ち、当該サブルーチンでエラーが発生したものと判定される。
【００３６】
図３のデバッガの表示画面Ｃ１では、×印はブレークポイントＢ１、Ｂ２、Ｂ３が設定された命令文を、行番号の左に記された丸印はブレークポイントの設定が可能な命令文を示す。同図の表示画面Ｃ１は、サブルーチンａｄｄ＿ｎｕｍ内で呼び出されるサブルーチンＦｕｎｃＡ、ＦｕｎｃＢ、ＦｕｎｃＣのエラー処理の命令文（１９行目、２２行目、２５行目）にそれぞれブレークポイントＢ１、Ｂ２、Ｂ３が設定され、実行された結果、ブレークポイントＢ３でブレークした状態（一時停止状態）を表す。同図の黒色の矢印Ｙ１は、一時停止中のデバッグ対象プログラム６０が次に実行する命令文、つまり、デバッガ上のプログラムカウンタ値の示す命令文を指す。ブレーク後、デバッグ対象プログラム６０は、ブレークポイントＢ３に対応する命令文（２５行目）の直前で一時停止状態となるため、同図の矢印Ｙ１は２５行目の命令文を指す。そして、デバッグ対象プログラム６０の処理は、当該命令文から再開される。
【００３７】
続いて、デバッガの別の機能であるステップイン機能、ステップオーバー機能について説明する。
【００３８】
図４は、デバッガにおけるステップイン機能、ステップオーバー機能を説明する図である。同図では、図３で説明したサブルーチンａｄｄ＿ｎｕｍ、及び、当該サブルーチンａｄｄ＿ｎｕｍから呼び出されるサブルーチンＦｕｎｃＡ〜ＦｕｎｃＣを例示している。また、同図において、直線ＳＬは通常の実行時、点線ＳＩはステップイン指示時、破線ＳＯはステップオーバー指示時におけるプログラムカウンタ値の遷移を表す。サブルーチンａｄｄ＿ｎｕｍが実行される場合、プログラムカウンタ値は同図の直線ＳＬのように遷移する。
【００３９】
ステップイン機能は、対象の命令文が下位のサブルーチンを呼び出す命令文である場合、当該下位のサブルーチンの初めの命令文の直前までデバッグ対象プログラム６０の処理を進める機能である。ユーザーは、下位のサブルーチンの呼び出し命令文にステップインを指示することによって、デバッグ対象のサブルーチンを下位のサブルーチンに変更する。
【００４０】
図４において、デバッガ上でデバッグ対象プログラム６０が、サブルーチンＦｕｎｃＡの呼び出し命令文の直前で一時停止している場合に（Ｐ1）、当該命令文にステップインが指示されると、サブルーチンＦｕｎｃＡの呼び出し処理だけが実行され、デバッグ対象プログラム６０の処理は、サブルーチンＦｕｎｃＡの初めの命令文直前（Ｐ２）で一時停止する。この時、プログラムカウンタ値は、サブルーチンＦｕｎｃＡの呼び出し命令文を示す値から、サブルーチンＦｕｎｃＡ内の初めの命令文を示す値に遷移する。
【００４１】
一方、ステップオーバー機能は、対象命令文が下位のサブルーチンを呼び出す命令文である場合、当該下位のサブルーチン内の全ての命令文を実行し当該呼び出し命令文の直後まで処理を進める機能である。ユーザーは、下位のサブルーチンの呼び出し命令文にステップオーバーを指示することによって、デバッグ対象のサブルーチンにおいて１命令分処理を進める。
【００４２】
図４において、デバッガ上でデバッグ対象プログラム６０が、サブルーチンＦｕｎｃＢの呼び出し命令文の直前で一時停止している場合に（Ｐ３）、当該命令文にステップオーバーが指示されると、サブルーチンＦｕｎｃＢの全ての命令文が実行されデバッグ対象プログラム６０の処理は、サブルーチンＦｕｎｃＢの呼び出し命令文の直後（Ｐ４）で一時停止する。この時、プログラムカウンタの値は、サブルーチンＦｕｎｃＢの呼び出し命令文を示す値から、サブルーチンＦｕｎｃＢ呼び出し命令文の後続の命令文を示す値に遷移する。
【００４３】
以上が、デバッガの主な機能である。次に、従来のデバッガにおけるデバッグ処理の流れについて説明するが、まず、デバッグ対象プログラム６０全体のサブルーチンの構成を説明する。
【００４４】
図５は、本実施の形態例におけるデバッグ対象プログラム６０全体のサブルーチンの構成を表す図である。同図では、上から下にかけて、上位のルーチンと、当該上位のルーチンから呼び出される下位のサブルーチンとの関係を表す。また、本実施の形態例のデバッグ対象プログラム６０において、不具合を有する最下層のサブルーチンは、仮にサブルーチンＦｕｎｃＯであるとする。サブルーチンＦｕｎｃＯは、エラーを示す戻り値を出力する。
【００４５】
図３で前述した通り、メインルーチンｍａｉｎからサブルーチンａｄｄ＿ｎｕｍが呼び出され、当該サブルーチンａｄｄ＿ｎｕｍからサブルーチンＦｕｎｃＡ、ＦｕｎｃＢ、ＦｕｎｃＣが呼び出される。また、サブルーチンＦｕｎｃＣからは、サブルーチンＦｕｎｃＦ、ＦｕｎｃＧ、ＦｕｎｃＨが呼び出される。また、図５に示すように、その他のサブルーチンからも、下位のサブルーチンがそれぞれ呼び出される。このように、本実施の形態例におけるデバッグ対象プログラム６０は、多階層のサブルーチン構成を有する。
【００４６】
そして、図５に示す通り、本実施の形態例における不具合を有する最下層のサブルーチンＦｕｎｃＯは、メインルーチンｍａｉｎから、５つのサブルーチンａｄｄ＿ｎｕｍ、ＦｕｎｃＣ、ＦｕｎｃＦ、ＦｕｎｃＩ、ＦｕｎｃＭを介して呼び出される。一般的に、サブルーチンで呼び出される下位のサブルーチンからエラーを示す戻り値が出力された場合、当該サブルーチンでもその戻り値に基づいて、エラーを示す戻り値を出力する。従って、この例において、サブルーチンＦｕｎｃＯがエラーを示す戻り値を出力することにより、サブルーチンａｄｄ＿ｎｕｍ、ＦｕｎｃＣ、ＦｕｎｃＦ、ＦｕｎｃＩ、ＦｕｎｃＭも、同様にエラーを示す戻り値を出力する。
【００４７】
図５のようなデバッグ対象プログラム６０について、不具合を有する最下層のサブルーチンを特定する場合、例えば、ユーザーは、デバッガ上で、デバッグ対象プログラム６０の全てのサブルーチンについて、その呼び出し命令後のエラー処理の命令文にブレークポイントを設定し実行させる。この結果、デバッグ対象プログラム６０は、初めに実行対象となるブレークポイント、即ち、不具合を有する最下層のサブルーチン呼び出し後のエラー処理の命令文に設定されたブレークポイントでブレークする。これにより、ユーザーは、ブレークしたブレークポイントに基づいて、不具合を有する最下層のサブルーチンを特定できる。しかしながら、この方法によると、デバッグ対象プログラム６０が膨大なサブルーチン呼び出し命令文を有する場合、ブレークポイントの設定処理だけで膨大な工数を要する。
【００４８】
そこで、従来のデバッガによって、ユーザーは、上位のサブルーチンから下位のサブルーチンにかけて、エラーが発生するサブルーチンを順に特定することにより、エラーを有する最下層のサブルーチンを特定していた。具体的に、ユーザーは、上位のサブルーチンから呼び出されるサブルーチンのうちエラーが発生する下位のサブルーチンを特定し、続いて、当該特定された下位のサブルーチンから呼び出されるさらに下位のサブルーチンのうちエラーが発生するサブルーチンを特定していく。ユーザーは、この処理を、エラーが発生する（不具合を有する）最下層のサブルーチンが特定されるまで繰り返す。この処理を、次のフローチャート図に基づいて簡単に説明する。
【００４９】
図６は、図５に示したデバッグ対象プログラム６０について、不具合を有する最下層サブルーチンＦｕｎｃＯを特定する場合の従来のデバッガにおける操作手順を示すフローチャート図である。なお、デバッグ処理に当たり、ユーザーは、サブルーチンａｄｄ＿ｎｕｍがエラーを示す戻り値を出力することを予め認識している。そのため、初め、デバッグ対象のサブルーチンはサブルーチンａｄｄ＿ｎｕｍに設定される（Ｓ１１）。
【００５０】
まず、ユーザーは、図３のように、デバッガ上で、デバッグ対象プログラム６０について、デバッグ対象のサブルーチンａｄｄ＿ｎｕｍ内で呼び出される下位のサブルーチン全て（ＦｕｎｃＡ〜ＦｕｎｃＣ）について、その実行後のエラー処理の命令文（ソースコードＳ１の１９行目、２２行目、２５行目）にブレークポイントＢ１〜Ｂ３を設定する（Ｓ１２）。続いて、ユーザーは、デバッガにデバッグ対象プログラム６０の連続実行を指示する（Ｓ１３）。この例では、サブルーチンＦｕｎｃＣは、エラーを示す戻り値（定数ＥＲＲＯＲ）を出力する。そのため、デバッグ対象プログラム６０は、図３のように、サブルーチンＦｕｎｃＣ実行後のエラー処理の命令文（２５行目）に設定されたブレークポイントＢ３でブレークする。これにより、サブルーチンＦｕｎｃＣにおけるエラーの発生が検出される。
【００５１】
続いて、ユーザーは、ブレークしたブレークポイントに対応する下位のサブルーチン、即ち、エラーの発生が検出された下位のサブルーチンＦｕｎｃＣが、不具合を有する最下層のサブルーチンであるか否かを判定する（Ｓ１４）。例えば、ユーザーは、当該下位のサブルーチンＦｕｎｃＣからさらに呼び出される下位のサブルーチンの有無に基づいて、当該下位のサブルーチンＦｕｎｃＣが不具合を有する最下層のサブルーチンであるか否かを判定する。この例において、サブルーチンＦｕｎｃＣから、サブルーチンＦｕｎｃＦ〜ＦｕｎｃＧが呼び出されるため、サブルーチンＦｕｎｃＣは最下層のサブルーチンではないと判定される（Ｓ１４のＮＯ）。そこで、ユーザーは、デバッグ対象のサブルーチンを、サブルーチンａｄｄ＿ｎｕｍから、エラーの発生が検出された下位のサブルーチンＦｕｎｃＣに変更し（Ｓ１５）、サブルーチンＦｕｎｃＣについて工程Ｓ１２〜Ｓ１４の処理を行わせる。
【００５２】
ただし、この時、デバッグ対象プログラム６０は、２５行目のブレークポイントＢ３で一時停止しており、サブルーチンＦｕｎｃＣの処理は実行された後である。デバッガは、デバッグ対象プログラム６０を元のサブルーチンＦｕｎｃＣの開始位置に遡って再実行することができないため、ユーザーは、デバッグ対象プログラム６０を、初めの命令文から実行し直す。具体的に、ユーザーは、デバッガ上で、設定中のブレークポイントを全て解除しデバッグ対象プログラム６０を終了させると共に（Ｓ１６）、デバッグ環境を初期化させる（Ｓ１７）。そして、同様にして、ユーザーは、新たなデバッグ対象のサブルーチンＦｕｎｃＣについて、工程Ｓ１２〜Ｓ１４の処理を行わせる。
【００５３】
一方、ブレークしたブレークポイントに対応する下位のサブルーチンが不具合を有する最下層のサブルーチンであると特定された場合（Ｓ１４のＹＥＳ、Ｓ１８）、ユーザーはデバッグ処理を終了する。図５のデバッグ対象プログラムの場合、デバッグ対象のサブルーチンがサブルーチンＦｕｎｃＭの時、サブルーチンＦｕｎｃＭ内で呼び出される下位のサブルーチンＦｕｎｃＯが、不具合を有する最下層のサブルーチンであるとして特定される（Ｓ１４のＹＥＳ、Ｓ１８）。
【００５４】
なお、工程Ｓ１４の判定において、エラーの発生が検出された当該下位のサブルーチンＦｕｎｃＣの戻り値等に基づいて当該下位のサブルーチンが不具合を有する最下層のサブルーチンであるか否かが判定可能な場合、ユーザーは戻り値に基づいて判定してもよい。例えば、エラーの発生が検出された当該下位のサブルーチンＦｕｎｃＣの戻り値が、サブルーチンＦｕｎｃＣから呼び出される下位のサブルーチンＦｕｎｃＦ〜ＦｕｎｃＧのいずれかで出力される戻り値であることが判明している場合、当該下位のサブルーチンＦｕｎｃＣは不具合を有する最下層のサブルーチンではないと判定される（Ｓ１４のＮＯ）。
【００５５】
また、同図に図示していないが、例えば、ユーザーは、エラーの発生が検出された当該下位のサブルーチンから呼び出されるさらに下位のサブルーチンにおけるエラーの有無に基づいて、当該下位のサブルーチンが不具合を有する最下層のサブルーチンであるか否かを判定してもよい。具体的に、ユーザーは、デバッグ対象のサブルーチンを、サブルーチンａｄｄ＿ｎｕｍからエラーの発生が検出された下位のサブルーチンＦｕｎｃＣに変更後、変更したサブルーチンＦｕｎｃＣについて工程Ｓ１２〜Ｓ１４の処理を行わせる。そして、エラーが発生する下位のサブルーチンがない場合に、ユーザーは、サブルーチンＦｕｎｃＣを最下層のサブルーチンと判定する。
【００５６】
このように、ユーザーは、デバッグ対象のサブルーチンを、エラーが発生する下位のサブルーチンに変更しながら、不具合を有する最下層のサブルーチンが特定されるまで繰り返す。しかし、この過程において、ユーザーは、デバッグ対象のサブルーチンを変更する度に、デバッグ対象プログラム６０を初めからの再実行させる（Ｓ１６、Ｓ１７）。図５のデバッグ対象プログラム６０の場合、不具合を有する最下層のサブルーチンＦｕｎｃＯが特定されるまで、デバッグ対象プログラム６０の再実行処理が５回行われる。これは、デバッグ処理の操作を煩雑にする上、デバッグ対象プログラム６０の実行がテスト環境の準備や機器の再起動、及び画面操作等を伴う場合、デバッグ処理の工数を増大させる。
【００５７】
そこで、本実施の形態例におけるデバッガ２１は、デバッグ対象のサブルーチン内で一時停止した状態で、停止以降に実行される下位のサブルーチンの呼び出し命令文の指定に応答して、一時停止時のメモリ情報及びプログラムカウンタ値を含むプログラム実行状態を退避させる。そして、デバッガ２１は、当該下位のサブルーチンを実行しその実行結果情報を表示画面に出力すると共に、退避したプログラム実行状態を復帰させる（以下、サブルーチンの事前実行と称する）。
【００５８】
これにより、ユーザーは、事前実行対象のサブルーチンを指定するだけで、意識的にデバッグ対象プログラム６０を実行させることなく、事前実行対象のサブルーチンの実行結果情報を参照することができる。そして、ユーザーは、サブルーチンの事前実行結果情報を参照した上で、デバッグ対象プログラム６０の処理を、当該エラーが発生した下位のサブルーチン呼び出し命令の直前から再開させて、エラーが発生した下位のサブルーチン内のさらに下位のサブルーチンのいずれでエラーが発生するかをチェックすることができる。これにより、ユーザーは、サブルーチンの事前実行結果情報がエラーを示すことにより、デバッグ対象のサブルーチンを当該下位のサブルーチンに変更する場合、デバッグ対象プログラム６０を初めから再実行させる必要がない。以下、具体的に説明する。
【００５９】
図７は、本実施の形態例におけるデバッガ２１の表示画面Ｃ１ａの一例である。同図のように、本実施の形態例におけるデバッガ２１は、表示画面Ｃ１ａ上でのサブルーチンＦｕｎｃＡの呼び出し命令文（１８行目）のマウスポインタＭａによる指定に応答して、サブルーチンＦｕｎｃＡを実行しその実行結果を示すメモリ情報Ｖａを表示画面に出力する。この時、デバッガ２１は、サブルーチンＦｕｎｃＡの事前実行後、メモリ情報及びプログラムカウンタ値を事前実行前の状態に復帰させる。そのため、同図のデバッガ表示画面上の黒矢印ＹａはサブルーチンＦｕｎｃＡの呼び出し命令文の後続の命令文ではなく、当該呼び出し命令文を指したままである。
【００６０】
続いて、本実施の形態例におけるデバッガ２１における、サブルーチン事前実行機能を使用した場合のデバッグ処理の流れについて、フローチャート図に基づいて説明する。
【００６１】
図８は、不具合を有する最下層サブルーチンを特定する本実施の形態例におけるデバッガ２１の操作手順を示すフローチャート図である。まず、同図のフローチャート図における実線で表す処理について説明する。
【００６２】
初めに、ユーザーは、デバッグ対象のサブルーチンを決定する（Ｓ２１）。次に、ユーザーは、デバッガ２１上で、デバッグ対象のサブルーチン内で呼び出される事前実行対象の下位サブルーチン呼び出し命令文の直前までデバッグ対象プログラム６０の処理を進める（Ｓ２２）。続いて、ユーザーが下位のサブルーチンを事前実行対象のサブルーチンとして指定すると、デバッガ２１は当該サブルーチンを実行し、その実行結果を示すメモリ情報を表示画面に表示する（Ｓ２３）。例えば、ユーザーは、表示画面に出力されたソースコードの下位のサブルーチン呼び出し命令文にマウスポインタを移動させることにより（以下、マウスオーバーと称する）、当該下位のサブルーチンを事前実行対象のサブルーチンとして指定する。工程Ｓ２３のデバッガ２１の処理の詳細については、別のフローチャート図で後述する。
【００６３】
続いて、ユーザーは、表示画面に出力された事前実行対象の下位サブルーチンの実行結果を示すメモリ情報に基づいて、事前実行対象の下位サブルーチンでエラーが発生したか否かを判定する（Ｓ２４）。例えば、ユーザーは、メモリ情報が有する下位サブルーチンの実行結果を示す戻り値に基づいて、当該下位サブルーチンでのエラー発生の有無を判定する。エラー発生無しと判定された場合（Ｓ２４のＮＯ）、ユーザーは、デバッガ２１上で、後続の命令文であって、下位のサブルーチン呼び出す命令文の直前までデバッグ対象プログラム６０の処理を進める（Ｓ２２）。そして、ユーザーは、同様にして、当該後続の命令文から呼び出されるサブルーチンを事前実行対象のサブルーチンとして指定し、その実行結果を示すメモリ情報を表示画面に出力させる（Ｓ２３）。
【００６４】
一方、事前実行対象の下位サブルーチンでエラー発生有りと判定された場合（Ｓ２４のＹＥＳ）、ユーザーは、当該下位サブルーチンが不具合を有する最下層のサブルーチンであるか否かを判定する（Ｓ２５）。例えば、ユーザーは、エラー発生有りと判定された事前実行対象の下位サブルーチンから呼び出されるさらに下位のサブルーチンの有無に基づいて、事前実行対象の下位サブルーチンが不具合を有する最下層のサブルーチンであるか否かを判定する。
【００６５】
最下層のサブルーチンである場合（Ｓ２５のＹＥＳ）、ユーザーは、エラーが発生した事前実行対象の下位サブルーチンを、不具合を有する最下層のサブルーチンとして特定し、デバッグ処理を終了する（Ｓ２７）。一方、最下層のサブルーチンではない場合（Ｓ２５のＮＯ）、ユーザーは、デバッグ対象のサブルーチンを、エラーが発生した事前実行対象の下位サブルーチンに変更する（Ｓ２６）。具体的に、ユーザーは、当該下位サブルーチンの呼び出し命令に対して図４で示したステップインを指示し、デバッグ対象プログラム６０の処理を、当該下位サブルーチン内の初めの命令文直前まで進める。そして、ユーザーは、引き続き、新たなデバッグ対象のサブルーチン内の命令文について、工程Ｓ２２〜Ｓ２６の処理を行う。
【００６６】
このように、ユーザーは、エラーが発生した事前実行対象の下位サブルーチンが最下層のサブルーチンになるまで、工程Ｓ２２〜Ｓ２６の処理を繰り返す。そして、当該エラーが発生した事前実行対象の下位サブルーチンが最下層のサブルーチンの場合に（Ｓ２８のＮＯ）、ユーザーは、当該下位サブルーチンを、不具合を有する最下層のサブルーチンとして特定する。
【００６７】
また、ユーザーは、図８の工程Ｓ２５の判定、即ち、下位サブルーチンが不具合を有する最下層のサブルーチンであるか否かの判定を、別の方法で行ってもよい。この処理を、同図の点線で表したフローチャート図に基づいて説明する。この方法において、デバッグ対象のサブルーチンから呼び出される下位サブルーチンであって、エラーが発生する下位サブルーチンがない場合に、ユーザーは、デバッグ対象のサブルーチンを、不具合を有する最下層のサブルーチンとして特定する。
【００６８】
具体的に、事前実行対象の下位サブルーチンでエラー発生有りと判定された場合（Ｓ２４のＹＥＳ）、ユーザーは、デバッグ対象のサブルーチンを、事前実行対象の下位サブルーチンに変更する（Ｓ２６）。そして、ユーザーは、引き続き、新たなデバッグ対象のサブルーチン内の命令文について、工程Ｓ２２〜Ｓ２４の処理を行う。一方、事前実行対象の下位サブルーチンでエラー発生無しと判定された場合（Ｓ２４のＮＯ）、ユーザーは、デバッグ対象サブルーチン内に、後続の、下位のサブルーチン呼び出し命令があるか否かを判定する（Ｓ２８）。後続に、下位のサブルーチン呼び出し命令がある場合（Ｓ２８のＹＥＳ）、同様にして、ユーザーは、工程Ｓ２２〜Ｓ２４の処理を行う。
【００６９】
一方、後続に、下位のサブルーチン呼び出し命令がない場合（Ｓ２８のＮＯ）、デバッグ対象サブルーチン内にエラーが発生する下位のサブルーチンが存在しないことを示す。これは、デバッグ対象サブルーチンで発生するエラーが、当該デバッグ対象サブルーチンから呼び出される下位のサブルーチンに因らないことを示す。従って、デバッグ対象のサブルーチンが、不具合を有する最下層のサブルーチンとして特定される（Ｓ２９）。
【００７０】
即ち、図８の点線で表した処理によると、ユーザーは、エラーが発生する下位サブルーチンを有しないデバッグ対象サブルーチンを検出するまで、工程Ｓ２２〜Ｓ２４、Ｓ２６の処理を繰り返す。そして、エラーが発生する下位サブルーチンを有しないデバッグ対象のサブルーチンを検出した場合（Ｓ２８のＮＯ）、ユーザーは、当該デバッグ対象のサブルーチンを、不具合を有する最下層のサブルーチンとして特定する。ユーザーは、このように、不具合を有する最下層のサブルーチンを特定してもよい。
【００７１】
続いて、図８のフローチャートに基づいて、図５のデバッグ対象プログラム６０について、不具合を有する最下層のサブルーチンＦｕｎｃＯを特定する処理を図７、図９を使用して説明する。この例では、同図の実線の処理に基づいて説明する。
【００７２】
図６の従来のデバッガにおけるデバッグ処理と同様にして、初めのデバッグ対象のサブルーチンは、サブルーチンａｄｄ＿ｎｕｍに設定される（Ｓ２１）。そこで、ユーザーは、例えば、デバッガ２１上で、サブルーチンａｄｄ＿ｎｕｍ内のサブルーチンＦｕｎｃＡ呼び出し命令文（図７の１８行目）にブレークポイントを設定してデバッグ対象プログラム６０を連続実行させ、デバッグ対象プログラム６０をブレークさせる（Ｓ２２）。この結果、デバッグ対象プログラム６０は、デバッグ対象のサブルーチンａｄｄ＿ｎｕｍ内のサブルーチンＦｕｎｃＡの呼び出し命令文（１８行目）の直前で一時停止する。
【００７３】
そして、図７のように、ユーザーが、表示画面Ｃ１ａに出力されたサブルーチンＦｕｎｃＡの呼び出し命令文をマウスオーバーすると、デバッガ２１は、デバッグ対象プログラム６０のメモリ状態及びプログラムカウンタ値を一時退避し、サブルーチンＦｕｎｃＡ内の最後の命令文まで連続実行して実行結果情報である戻り値「５」を表示画面に出力すると共に、一時退避したメモリ情報を復帰させる（Ｓ２３）。そのため、同図の表示画面Ｃ１ａにおいて、黒矢印Ｙａは、サブルーチンＦｕｎｃＡの呼び出し命令文を指したままである。また、戻り値「５」は定数ＥＲＲＯＲ（−１）と一致しないためエラーに該当せず、サブルーチンＦｕｎｃＡはエラーの発生無しと判定される（Ｓ２４のＮＯ）。従って、ユーザーは、続いて、後続の命令文で呼び出される下位のサブルーチンＦｕｎｃＢについて、同様に、事前実行処理を行わせる（Ｓ２２〜Ｓ２４）。
【００７４】
図９は、サブルーチンＦｕｎｃＢ、ＦｕｎｃＣを事前実行する場合におけるデバッガ２１の表示画面の一例である。ユーザーは、引き続き、サブルーチンＦｕｎｃＢ呼び出し命令文（２１行目）の直前まで、デバッグ対象プログラム６０の処理を進める（Ｓ２２）。具体的に、ユーザーは、サブルーチンＦｕｎｃＡの呼び出し命令文１８行目にステップオーバーを指示し、プログラムカウンタ値を２１行目の命令文を示す値まで遷移させる。そして、ユーザーは、サブルーチンＦｕｎｃＢを指定してＭｂ事前実行させ、同図のように、戻り値「２」を含む実行結果情報Ｖｂを表示させる（Ｓ２３）。同様にして、サブルーチンＦｕｎｃＢの戻り値「２」は、エラー該当しない（Ｓ２４のＮＯ）。
【００７５】
そのため、ユーザーは、続いて、図９の表示画面Ｃ１ｃのように、デバッガ上で、サブルーチンＦｕｎｃＣ呼び出し命令文（２４行目）の直前までデバッグ対象プログラム６０を連続実行させた上で（Ｓ２２）、サブルーチンＦｕｎｃＣを指定してＭｃ事前実行させ、その実行結果情報Ｖｃを表示させる（Ｓ２３）。同図の実行結果情報Ｖｃによると、サブルーチンＦｕｎｃＣからはエラーを示す戻り値−１が出力されることがわかる。そこで、ユーザーは、サブルーチンＦｕｎｃＣでエラーが発生したものと判定する（Ｓ２４のＹＥＳ）。
【００７６】
図５で前述した通り、サブルーチンＦｕｎｃＣからは、さらに下位のサブルーチンＦｕｎｃＦ〜ＦｕｎｃＨが呼び出される。そのため、サブルーチンＦｕｎｃＣは、不具合を有する最下層のサブルーチンに当たらないと判定される（Ｓ２５のＮＯ）。そこで、ユーザーは、デバッグ対象のサブルーチンを、サブルーチンａｄｄ＿ｎｕｍからサブルーチンＦｕｎｃＣに変更する（Ｓ２６）。具体的に、ユーザーは、デバッガ２１上で、サブルーチンＦｕｎｃＣの呼び出し命令文（２４行目）にステップインを指示し、デバッグ対象プログラム６０の処理をサブルーチンＦｕｎｃＣ内の初めの命令文の直前（図３のソースコードＳ２の７３行目）まで進める。
【００７７】
この時、デバッガ２１は、サブルーチンＦｕｎｃＣを実行したものの、プログラムカウンタ値及びメモリ情報はサブルーチンＦｕｎｃＣ実行前の状態に復帰している。デバッグ対象プログラム６０はサブルーチンＦｕｎｃＣの呼び出し命令文（２４行目）の直前から再開されるため、ユーザーは、サブルーチンＦｕｎｃＣの呼び出し命令文（２４行目）に、ステップインを指示することができる。つまり、ユーザーは、デバッグ対象のサブルーチンをサブルーチンＦｕｎｃＣに変更する際に、デバッグ対象プログラム６０の初めからの再実行を要しない。
【００７８】
続いて、ユーザーは、新たなデバッグ対象のサブルーチンＦｕｎｃＣに対して、同様に、工程Ｓ２２〜Ｓ２５の処理を行う。この結果、サブルーチンＦｕｎｃＦのエラー発生が検出される（Ｓ２４のＹＥＳ）。サブルーチンＦｕｎｃＦもまた、不具合を有する最下層のサブルーチンではないと判定されるため（Ｓ２５のＮＯ）、ユーザーは、デバッグ対象のサブルーチンをサブルーチンＦｕｎｃＣから下位のサブルーチンＦｕｎｃＦに変更する（Ｓ２６）。同様に、デバッグ対象のサブルーチン変更に当たり、デバッガ２１は、デバッグ対象プログラム６０の初めからの再実行を要しない。
【００７９】
そして、デバッグ対象のサブルーチンがサブルーチンＦｕｎｃＭの時、サブルーチンＦｕｎｃＯが事前実行され、当該サブルーチンが不具合を有する最下層のサブルーチンとして特定される（Ｓ２４のＹＥＳ、Ｓ２５のＹＥＳ、Ｓ２７）。
【００８０】
このように、ユーザーは、デバッガ２１上で、指定したサブルーチンを事前実行してその結果を参照しながら、デバッグ対象プログラム６０の処理を事前実行前の状態から再開させることができる。そのため、エラーが発生する下位のサブルーチンが検出され、デバッグ対象のサブルーチンをエラーが発生する下位のサブルーチンに変更する場合、ユーザーは、デバッグ対象プログラム６０を初めから再実行させる必要がない。これにより、ユーザーは、デバッガ２１上で、デバッグ対象プログラム６０を何度も再実行させることなく、一連の処理の中で、不具合を有する最下層のサブルーチンＦｕｎｃＯを特定することができる。
【００８１】
続いて、図８のフローチャート図における工程Ｓ２３のデバッガ２１の処理の詳細を説明する。図８の工程Ｓ２３の処理は、デバッガ２１が、事前実行対象のサブルーチンの指定に応答して、実行中のデバッグ対象プログラム６０のメモリを一時退避し、事前実行対象のサブルーチンを実行しその実行結果を表示画面に出力すると共に、一時退避したメモリを復帰させる処理である。
【００８２】
図１０は、図８の本実施の形態例のデバッガ２１における工程Ｓ２３の処理の詳細を示すフローチャート図である。まず、デバッガ２１のウィンドウ処理手段３１は、ユーザーのマウスオーバーによる事前実行対象のサブルーチンの指定に応答して、指定部分に該当するテキスト情報を取得する（Ｓ３１）。具体的に、ウィンドウ処理手段３１は、デバッグ対象プログラム６０のソースコードが表示されたウィンドウの情報を有するウィンドウ情報テーブルＴｗと、マウスポインタの示す座標情報とを照合することによって、当該マウスポインタの指すテキスト情報を取得する。この時、ウィンドウ処理手段３１は、必要に応じて、取得したテキスト情報からサブルーチンを示すテキスト情報をさらに抽出してもよい。
【００８３】
図１１は、本実施の形態例におけるデバッガ２１が参照するウィンドウ情報テーブルＴｗ及びデバッグ情報テーブルＴｄを表す図である。同図のウィンドウ情報テーブルＴｗは、図７の表示画面Ｃ１ａにおけるウィンドウのウィンドウ情報を有する。ウィンドウ情報テーブルＴｗは、例えば、画面上のウィンドウ左上の座標情報（Ｘ、Ｙ）＝（１４３、２５４）、ウィンドウの幅及び高さを示すウィンドウサイズ情報（Ｘ、Ｙ）＝（１８１、７５２）、テキストバッファポインタ情報「Ｈ‘００７Ｃ４０００」、先頭行番号情報「ｓｏｕｒｃｅ１．ｃ ＄５」を有する。テキストバッファポインタ情報はウィンドウに表示されたソースコードのテキストデータ「 ｉｎｔ ｍａｉｎ（ｕｎｓｉｇｎｅｄ ｌｏｎｇ ｖａｌｕｅ）  ｉｎｔ ｒｅｔ…」の格納アドレスを示し、先頭行番号情報はウィンドウに表示されたソースコードのファイル名及び、先頭命令文の行番号を示す。
【００８４】
具体的に、図７の表示画面Ｃ１ａに表示されたソースコード「ＦｕｎｃＡ」部分をマウスポインタが移動すると、ウィンドウ処理手段３１は、マウスポインタの座標とウィドウ情報テーブルＴｗの有するウィンドウ座標情報及びウィンドウサイズとを照合する。そして、ウィンドウ処理手段３１は、照合結果に基づいて、ウィンドウ情報テーブルＴｗのテキストバッファポインタ情報が指すテキストデータから、マウスポインタの指す部分のテキスト情報（この例では、ＦｕｎｃＡ）を取得する。
【００８５】
図１０のフローチャート図に戻り、続いて、デバッガ２１のデバッグ情報管理手段３３は、抽出したテキスト情報がサブルーチンであるか否かを判定する（Ｓ３２）。具体的に、デバッグ情報管理手段３３は、取得したテキスト情報とシンボル情報が一致するデバッグ情報テーブルＴｄ１を検出する。そして、デバッグ情報管理手段３３は、検出したデバッグ情報テーブルＴｄ１の種別情報に基づいて、当該テキスト情報がサブルーチンを示すか否かを判定する。サブルーチンではない場合（Ｓ３２のＮＯ）、デバッガ２１はマウスオーバーに応答する処理を行わない。一方、サブルーチンである場合（Ｓ３２のＹＥＳ）、デバッグ情報管理手段３３は、事前実行対象となる当該サブルーチンのデバッグ情報テーブルＴｄに引数のデバッグ情報テーブルＴｄが関連付けられているか否かに基づいて、サブルーチンの引数の有無を判定する（Ｓ３３）。
【００８６】
一方、サブルーチンが引数を有する場合（Ｓ３３のＹＥＳ）、デバッグ情報管理手段３３は、引数のデバッグ情報テーブルＴｄのアドレス情報を参照して、引数の値を取得可能であるか否かを判定する（Ｓ３４）。アドレス情報には有効なアドレスが格納されている場合、引数の値が取得可能であることを示す。
【００８７】
引数の値が取得可能である場合（Ｓ３４のＹＥＳ）、メモリ管理手段３４及びレジスタ管理手段３５は、引数のデバッグ情報テーブルＴｄのアドレス情報に基づいて、引数の値を取得する。この時、メモリ管理手段３４は、必要に応じて、メモリ５３の管理情報を有するメモリ管理テーブルＴｍを参照する。一方、デバッグ情報テーブルＴｄが有効なアドレス情報を有しない場合（Ｓ３４のＮＯ）、デバッグ情報管理手段３３は当該引数の値が取得不可能であるものとして判定する。この場合、デバッガ２１はマウスオーバーに応答する処理を行わない。
【００８８】
図１１のテーブルＴｄ１、Ｔｄ２は、デバッグ情報テーブルを表す。デバッグ情報テーブルは、デバッグ対象プログラム６０生成時に合わせて、デバッグ対象プログラム６０内の全てのサブルーチン及び変数それぞれについて生成される。同図では、サブルーチンＦｕｎｃＡのデバッグ情報テーブルＴｄ１と、その引数である変数ｖａｌｕｅのデバッグ情報テーブルＴｄ２とが例示されている。サブルーチンが引数を有する場合、同図のように、サブルーチンのデバッグ情報テーブルＴｄ１に、引数である変数ｖａｌｕｅのデバッグ情報テーブルＴｄ２が関連付けられる。
【００８９】
デバッグ情報テーブルＴｄ１、Ｔｄ２は、例えば、シンボル情報、アドレス情報、種別情報、行番号情報を有する。ただし、変数のデバッグ情報テーブルＴｄ２は行番号情報を有しない。具体的に、サブルーチンＦｕｎｃＡのデバッグ情報テーブルＴｄ１は、サブルーチン名を示すシンボル情報「ｉｎｔ ＦｕｎｃＡ」、サブルーチンが配置されたメモリ５３のアドレス情報「Ｈ‘ＦＥ０４４Ｆ」、関数の種類を示す種別情報「ｇｌｏｂａｌ関数」、サブルーチンが記述されたソースファイル名と行番号情報「ｓｏｕｒｃｅ１．ｃ ＄３０」を有する。同様にして、変数ｖａｌｕｅのデバッグ情報テーブルＴｄ２は、シンボル情報「ｌｏｎｇ ｖａｌｕｅ」、変数が格納されたアドレス情報「＋Ｈ‘０００００４」、変数の種別情報「ａｕｔｏ変数」を有する。変数の種別がａｕｔｏ変数である場合、当該変数の値はスタックメモリに格納される。
【００９０】
具体的に、デバッグ情報管理手段３３は、図１１のデバッグ情報テーブルＴｄ１、Ｔｄ２に基づいて、テキスト情報「ＦｕｎｃＡ」がｇｌｏｂａｌ関数、即ち、サブルーチンに該当し、サブルーチンＦｕｎｃＡは引数ｖａｌｕｅを有するものと判定する（Ｓ３２のＹＥＳ、Ｓ３３のＹＥＳ）。そこで、メモリ管理手段３４及びレジスタ管理手段３５は、図１１の変数ｖａｌｕｅのデバッグ情報テーブルＴｄ２に基づいて、スタックメモリのアドレス情報「＋Ｈ’０００００４」の示す位置から、変数ｖａｌｕｅの値を取得する（Ｓ３４のＹＥＳ、Ｓ３５）。
【００９１】
図１０フローチャート図に戻り、事前実行対象のサブルーチン情報が（Ｓ３３のＮＯ）、当該サブルーチンが引数を有する場合はさらに引数の値が（Ｓ３５）取得されると、デバッガ２１のメモリ管理手段３４及びレジスタ管理手段３５は、一時停止状態のデバッグ対象プログラム６０のプログラム実行状態を示すメモリ情報及びプログラムカウンタ値を退避する（Ｓ３６）。具体的に、メモリ管理部手段３４及びレジスタ管理手段３５は、サブルーチンＦｕｎｃＡの呼び出し命令（１８行目）の直前で一時停止状態のメモリ情報及びプログラムカウンタ値を、コンピューター５０のメモリ５３及びレジスタ（図示せず）から取得する。メモリ情報には、スタックメモリ等も含まれる。そして、メモリ管理部手段３４及びレジスタ管理手段３５は、取得したメモリ情報及びプログラムカウンタ値をコンピューター１０のメモリ１５に退避する。
【００９２】
続いて、デバッガ２１のサブルーチン実行手段３２は、事前実行対象のサブルーチンＦｕｎｃＡ内の全命令文を実行し、実行結果情報（この例では、戻り値「５」）を取得する（Ｓ３７）。そして、デバッガ２１のウィンドウ処理手段３１は、図７のように、事前実行対象のサブルーチンＦｕｎｃＡの実行結果情報をデバッガ２１の表示画面に出力すると共に（Ｓ３８）、メモリ管理手段３４及びレジスタ管理手段３５は、退避したメモリ情報及びプログラムカウンタ値を復帰させる（Ｓ３９）。そのため、図７の矢印Ｙａのように、デバッガ２１上のプログラムカウンタ値は、サブルーチンＦｕｎｃＡの呼び出し命令文を示したままとなる。
【００９３】
以上、サブルーチンＦｕｎｃＡが事前実行対象のサブルーチンとして指定される場合の工程Ｓ２３の処理について例示したが、他のサブルーチンが指定された場合も同様である。なお、本実施の形態例では、コンピューター１０の表示画面に出力された命令文上にマウスポインタを移動させるマウスオーバーによって、事前実行対象のサブルーチンが指定される場合を例示した。しかし、事前実行対象のサブルーチンは、カーソル移動やドロップダウンリストからの選択等の操作によって指定されてもよい。
【００９４】
以上のようにして、本実施の形態例におけるデバッガ２１は、デバッグ対象プログラム６０が、デバッグ対象のサブルーチン内で一時停止した状態で、停止以降に実行される下位のサブルーチンの呼び出し命令文の指定に応答して、一時停止時のメモリ情報及びプログラムカウンタ値を含むプログラム実行状態を退避させる。そして、デバッガ２１は、当該下位のサブルーチンを実行し、当該下位のサブルーチンの戻り値等を有する実行結果情報を表示画面に出力すると共に、退避したプログラム実行状態を復帰させる。そして、デバッガ２１は、デバッグ対象プログラム６０の処理を、復帰したプログラム実行状態から再開する。
【００９５】
つまり、本実施の形態例におけるデバッガ２１は、一時停止状態のデバッグ対象プログラム６０について、それ以降に実行される下位のサブルーチン呼び出し命令文を、ユーザーによる指定に応答して事前に仮実行しその実行結果情報を出力しつつ、プログラム実行状態を事前実行前の状態に復帰させる。
【００９６】
これにより、ユーザーは、事前実行対象の下位サブルーチンを指定するだけで、意識的にデバッグ対象プログラム６０を実行させることなく、事前実行対象の下位サブルーチンの実行結果情報を取得することができる。このため、ユーザーは、下位サブルーチンの事前実行結果情報を取得した上で、デバッグ対象プログラム６０の処理を下位サブルーチンの事前実行前の状態、即ち、事前実行対象の下位サブルーチンの呼び出し命令の直前から再開させることができる。
【００９７】
このため、不具合を有する最下層のサブルーチンの特定処理においてデバッグ対象のサブルーチンを下位サブルーチンに変更する場合、デバッグ対象プログラム６０の実行し直しを要することなく当該プログラム６０の実行を継続させたまま、デバッグ対象のサブルーチンの変更が可能となる。これにより、不具合を有する最下層のサブルーチンの特定処理において、デバッグ対象プログラム６０の再実行処理が不要となり、デバッグ処理に係る工数が削減される。このように、本実施の形態例におけるデバッガ２１は、多階層のサブルーチンを有するデバッグ対象プログラム６０における不具合を有する最下層のサブルーチンをより効率的に特定可能にし、デバッグ処理の効率を向上させる。
【００９８】
なお、本実施の形態例では、ユーザーは、事前実行対象のサブルーチン呼び出し命令文の直前までデバッグ対象プログラム６０の処理を進め、当該サブルーチンの事前実行を指示した。しかし、デバッグ対象プログラム６０の処理は、サブルーチンの事前実行に当たり、必ずしも、当該サブルーチン呼び出し命令文の直前で一時停止している必要はない。つまり、ユーザーは、一時停止状態のデバッグ対象プログラム６０の停止位置から数命令先に実行予定の下位サブルーチン呼び出し命令文のサブルーチンを事前実行させてもよい。
【００９９】
この場合、デバッガ２１は、停止位置から事前実行対象のサブルーチンの呼び出し命令文までの間の命令文を全て実行した上で事前実行対象のサブルーチンを実行してもよいし、当該間の命令文を実行せずに（スキップし）、事前実行対象のサブルーチンだけを実行してもよい。前者では、デバッガ２１は、当該間の命令文が、事前実行対象のサブルーチンの実行に関連する命令文を含む場合、より適切な実行結果情報を出力することができる。一方、後者では、デバッガ２１は、当該間の命令文が事前実行対象のサブルーチンの実行に関連する命令文を含まない場合は、当該間の命令文の実行に係る処理時間が省かれることにより、より高速に実行結果情報を出力することができる。
【０１００】
なお、デバッガ２１が表示画面に出力する実行結果情報は、サブルーチンの戻り値に加えて他の情報を有していてもよい。
【０１０１】
図１２は、本実施の形態例におけるデバッガ２１の表示画面の変形例を表す図である。同図において、デバッガ２１は、サブルーチンの事前実行時に、当該サブルーチンの戻り値に加えて、当該サブルーチンの引数値の情報Ｅ１、サブルーチンの処理に要した実行時間Ｅ２、実行した命令文の履歴情報Ｅ３を、実行結果情報Ｖｘとして表示する。これにより、ユーザーは、サブルーチンの実行に係る情報をより詳細に把握することができる。例えば、ユーザーは、サブルーチンのエラー判定処理（図８のＳ２４）や、サブルーチンが不具合を有する最下層のサブルーチンか否かの判定処理（図８のＳ２５）をより効率的に、より適切に行うことができる。
【０１０２】
以上の実施の形態をまとめると、次の付記のとおりである。
【０１０３】
（付記１）
デバッグ対象プログラムのデバッグ処理をコンピューターに実行させる前記コンピューター読み取り可能なデバッガプログラムにおいて、
前記デバッグ処理は、
前記デバッグ対象プログラムの有するデバッグ対象サブルーチン内で当該デバッグ対象プログラムが一時停止した状態で、停止以降に実行される当該デバッグ対象サブルーチン内の下位サブルーチン呼び出し命令文の指定に応答して、前記一時停止時のメモリ情報及びプログラムカウンタ値を含むプログラム実行状態を退避し、前記下位サブルーチンを実行しその実行結果情報を表示画面に出力すると共に、前記退避したプログラム実行状態を復帰させるサブルーチン事前実行工程を、有するデバッガプログラム。
【０１０４】
（付記２）
付記１において、
前記デバッグ処理は、前記サブルーチン事前実行工程の後、前記復帰したプログラム実行状態から前記デバッグ対象プログラムの実行を再開する再開工程を有するデバッガプログラム。
【０１０５】
（付記３）
付記１または２において、
前記実行結果情報は、前記下位サブルーチンの実行結果を示す戻り値を有するデバッガプログラム。
【０１０６】
（付記４）
付記３において、
前記実行結果情報は、前記下位サブルーチンの実行時に指定する引数値を有するデバッガプログラム。
【０１０７】
（付記５）
付記３または４において、
前記実行結果情報は、前記下位サブルーチンの実行時間、または、当該下位サブルーチン内で実行された命令履歴のいずれかまたは両方を有するデバッガプログラム。
【０１０８】
（付記６）
付記１乃至５のいずれかにおいて、
前記デバッグ処理は、前記コンピューターの前記表示画面に出力された前記命令文上にポインタを移動させた時に前記命令文の指定を検出するデバッガプログラム。
【０１０９】
（付記７）
付記１乃至６のいずれかにおいて、
前記一時停止時の前記実行状態の有するプログラムカウンタ値は、前記命令文を示す値であるデバッガプログラム。
【０１１０】
（付記８）
デバッグ対象プログラムの有するデバッグ対象サブルーチン内で当該デバッグ対象プログラムが一時停止した状態で、停止以降に実行される当該デバッグ対象サブルーチン内の下位サブルーチン呼び出し命令文の指定に応答して、前記一時停止時のメモリ情報及びプログラムカウンタ値を含むプログラム実行状態を退避し、前記下位サブルーチン呼び出し命令文を実行しその実行結果情報を表示画面に出力すると共に、前記退避したプログラム実行状態を復帰させるサブルーチン事前実行工程を、
前記デバッグ対象サブルーチン内の全ての前記下位サブルーチン呼び出し命令文について、前記実行結果情報がエラーを示すエラー下位サブルーチン呼び出し命令文が検出されるまで繰り返すエラー下位サブルーチン検出工程を有し、
前記エラー下位サブルーチンを前記デバッグ対象サブルーチンとして実行する前記エラー下位サブルーチン検出工程を、前記エラー下位サブルーチンが最下層のサブルーチンになるまで繰り返すデバッグ方法。
【０１１１】
（付記９）
付記８において、
前記エラー下位サブルーチン検出工程は、前記デバッグ対象サブルーチン内に前記エラー下位サブルーチンが存在しなくなるまで繰り返されるデバッグ方法。
【符号の説明】
【０１１２】
１０：コンピューター、１１：外部インターフェイス、１２：プロセッサ、１３：操作手段、１４：表示手段、１５：メモリ、２１：デバッガアプリケーションプログラム、
５０：コンピューター、５１：外部インターフェイス、５２：プロセッサ、５３：メモリ、６０：デバッグ対象プログラム
【図１】
2012256195.tif 000003
【図２】
2012256195.tif 000004
【図３】
2012256195.tif 000005
【図４】
2012256195.tif 000006
【図５】
2012256195.tif 000007
【図６】
2012256195.tif 000008
【図７】
2012256195.tif 000009
【図８】
2012256195.tif 000010
【図９】
2012256195.tif 000011
【図１０】
2012256195.tif 000012
【図１１】
2012256195.tif 000013
【図１２】
2012256195.tif 000014