(57)【要約】【課題】プログラムを実行しても変数の値を取得できない場合でも実行されたフロー部分を表示することができるデバッグ装置を提供することを課題とする。【解決手段】プログラムで使用される変数の値を解析してプログラムに含まれる条件分岐における判定結果を判別し、プログラムのフロー構造のうち実行されたフロー部分を他のフロー部分よりも強調表示するデバッグ装置であって、プログラムを実行し、プログラムで使用される変数の値を取得し、プログラムに含まれる条件分岐における判定結果を判定するために必要な変数の値を取得できない場合には取得できた変数の値に基づいて条件分岐における判定結果を推定し、その推定した判定結果に基づいてプログラムのフロー構造のうち実行されたフロー部分を判別する。【選択図】図２４
2014203120.tif 000002
【特許請求の範囲】
【請求項１】
プログラムで使用される変数の値を解析してプログラムに含まれる条件分岐における判定結果を判別し、プログラムのフロー構造のうち実行されたフロー部分を他のフロー部分よりも強調表示するデバッグ装置であって、
プログラムを実行し、プログラムで使用される変数の値を取得する実行手段と、
プログラムに含まれる条件分岐における判定結果を判定するために必要な変数の値を前記実行手段で取得できない場合、前記実行手段で取得できた変数の値に基づいて前記条件分岐における判定結果を推定する推定手段と、
前記推定手段で推定した判定結果に基づいてプログラムのフロー構造のうち実行されたフロー部分を判別する判別手段と、
を備えることを特徴とするデバッグ装置。
【請求項２】
前記推定手段は、前記実行手段で取得できた変数の値を用いてプログラムに含まれる式から依存関係を追跡することによって前記実行手段で値を取得できない変数の値を推定し、当該推定した変数の値を用いて前記条件分岐における判定結果を推定することを特徴とする請求項１に記載のデバッグ装置。
【請求項３】
前記推定手段は、前記条件分岐の前後において値を取得できている変数間の相関関係に基づいて前記条件分岐における判定結果を推定することを特徴とする請求項１又は請求項２に記載のデバッグ装置。
【請求項４】
前記実行手段は、各時刻毎にプログラムを実行し、
前記推定手段は、各時刻毎に前記条件分岐における判定結果を推定し、
前記判別手段は、各時刻毎にプログラムのフロー構造のうち実行されたフロー部分を判別し、
各時刻について、前記判別手段で判別したプログラムのフロー構造のうち実行されたフロー部分を他のフロー部分よりも強調表示することを特徴とする請求項１〜請求項３のいずれか１項に記載のデバッグ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムのデバッグを支援するためのデバッグ装置に関する。
【背景技術】
【０００２】
制御等のプログラム（ソフトウェア）を開発した場合、プログラムが正常に動作するかを検証する必要があり、その支援装置としてデバッグ装置がある。特許文献１には、プログラムを実行し、実際に実行された命令をトレースして履歴をとり、ソースリストとともに実行履歴を表示するデバッガが開示されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平６−１３９１０４号公報
【特許文献２】特開２００３−１０８４４０４０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
プログラムを実際に実行して命令を一つずつトレースする場合、その実行履歴は膨大なステップ数となる。そのような実行履歴を表示しても、膨大なステップ数からなる実行履歴を追跡して異常箇所を特定し、異常箇所とプログラムのソースコードとを対応付けるのは非常に困難な作業であり、現実的でない。また、プログラムを実際に実行することによってプログラムで使用される変数の値を時系列データとして取得できるので、その変数の値を用いてプログラムにおいて実行されたフロー部分を表示することも考えられる。しかし、プログラムで使用される変数の中には実際に実行しても値を取得困難な変数もあり、そのような変数に関連する部分については実行されたフロー部分を正確に表示することができない。そのため、実行されていないフロー部分もデバッグ対象となり、デバッグ効率が低下する。
【０００５】
そこで、本発明は、プログラムを実行しても変数の値を取得できない場合でも実行されたフロー部分を表示することができるデバッグ装置を提供することを課題とする。
【課題を解決するための手段】
【０００６】
本発明に係るデバッグ装置は、プログラムで使用される変数の値を解析してプログラムに含まれる条件分岐における判定結果を判別し、プログラムのフロー構造のうち実行されたフロー部分を他のフロー部分よりも強調表示するデバッグ装置であって、プログラムを実行し、プログラムで使用される変数の値を取得する実行手段と、プログラムに含まれる条件分岐における判定結果を判定するために必要な変数の値を実行手段で取得できない場合、実行手段で取得できた変数の値に基づいて条件分岐における判定結果を推定する推定手段と、推定手段で推定した判定結果に基づいてプログラムのフロー構造のうち実行されたフロー部分を判別する判別手段とを備えることを特徴とする。
【０００７】
このデバッグ装置では、実行手段によって実際にプログラムを実行する。このプログラムの実行によって、プログラムで使用される変数のうち値を取得できる変数と値を取得できない変数がある。さらに、プログラムに含まれる条件分岐の中には、この値を取得できない変数の値によって条件分岐を判定するものがある。このように判定に必要な変数の値を取得できない条件分岐の場合、どちらに分岐するかを判定できず、その条件分岐に関して実行されたフロー部分と実行されていないフロー部分とを判別できない。そこで、デバッグ装置では、推定手段によって、判定に必要な変数の値を取得できない条件分岐については、取得できている変数の値に基づいてその条件分岐における判定結果を推定する。さらに、デバッグ装置では、判別手段によって、その推定した条件分岐の判定結果に基づいて、プログラムのフロー構造において実行されたフロー部分と実行されていないフロー部分とを判別する。そして、デバッグ装置では、その判別結果に基づいて、プログラムのフロー構造のうち実行されたフロー部分を他のフロー部分よりも強調表示する。このように、デバッグ装置は、プログラムを実行しても判定に必要な変数の値を取得できない条件分岐については取得できる変数の値を用いて判定結果を推定することにより、その条件分岐についても実行されたフロー部分を判別でき、プログラムを実行しても変数の値を取得できない場合でも実行されたフロー部分を強調表示することができる。実行されたフロー部分を強調表示するので、開発者はその強調表示されたフロー部分だけをデバッグ対象とすることができ、デバッグ効率が向上する。
【０００８】
なお、プログラムのフロー構造としては、例えば、プログラムのソースコード、フローチャート、データフローがある。強調表示としては、例えば、強調する部分をハイライト表示、強調する部分のみを表示してそれ以外の部分を省略する表示がある。
【０００９】
本発明の上記デバッグ装置では、実行手段で取得できた変数の値を用いてプログラムに含まれる式から依存関係を追跡することによって実行手段で値を取得できない変数の値を推定し、当該推定した変数の値を用いて条件分岐における判定結果を推定する構成としてもよい。この構成により、値を取得できない変数がある場合でも、その変数の値を推定することでき、その変数の値を用いて条件分岐を判定できる。これによって、未確定の条件分岐を低減でき、デバッグ効率が更に向上する。
【００１０】
本発明の上記デバッグ装置では、推定手段は、条件分岐の前後において値を取得できている変数間の相関関係に基づいて条件分岐における判定結果を推定する構成としてもよい。この構成により、値を取得できない変数がある場合でも、値を取得できている変数の値を用いて条件分岐を判定できる。特に、プログラムに含まれる式から依存関係を追跡することによって変数の値を取得できない場合でも、条件分岐を判定できる。これによって、未確定の条件分岐を更に低減でき、デバッグ効率が更に向上する。
【００１１】
本発明の上記デバッグ装置では、実行手段は各時刻毎にプログラムを実行し、推定手段は各時刻毎に条件分岐における判定結果を推定し、判別手段は各時刻毎にプログラムのフロー構造のうち実行されたフロー部分を判別し、各時刻について、判別手段で判別したプログラムのフロー構造のうち実行されたフロー部分を他のフロー部分よりも強調表示する構成としてもよい。この構成により、各時刻（各時刻範囲も含む）について強調表示されるので、各時刻についてのプログラムのフロー構造のうち実行されたフロー部分が判る。開発者は各時刻についてその強調表示された部分だけを追跡して異常箇所を特定すればよいので、デバッグ効率が向上する。
【発明の効果】
【００１２】
本発明によれば、プログラムを実行しても判定に必要な変数の値を取得できない条件分岐については取得できる変数の値を用いて判定結果を推定することにより、その条件分岐についても実行されたフロー部分を判別でき、プログラムを実行しても変数の値を取得できない場合でも実行されたフロー部分を強調表示することができる。
【図面の簡単な説明】
【００１３】
【図１】本実施の形態に係る制御プログラム開発環境の構成図である。
【図２】従来の制御プログラム開発環境の構成図である。
【図３】本実施の形態に係るデバッグ時のデータの流れを示す図である。
【図４】一般的なデバッグの手順の一例を示すフローチャートである。
【図５】改善したデバッグの手順の一例を示すフローチャートである。
【図６】第１、第５、第７の実施の形態に係るデバッグの手順を示すフローチャートである。
【図７】第１の実施の形態に係るハイライト生成処理の流れを示すフローチャートである。
【図８】解析対象のサンプルプログラムの一例である。
【図９】図８のサンプルプログラムのフローチャートの一例である。
【図１０】図８のサンプルプログラムのデータフローの一例である。
【図１１】図８のサンプルプログラムの実行時の変数の時系列データの一例である。
【図１２】第１の実施の形態に係るハイライト生成処理（ソースコード）の適用例であり、（ａ）が解析処理の途中経過であり、（ｂ）が解析結果である。
【図１３】第１の実施の形態に係るハイライト生成処理（フローチャート）の適用例であり、（ａ）が解析処理の途中経過であり、（ｂ）が解析結果である。
【図１４】第２、第６、第８の実施の形態に係るデバッグの手順を示すフローチャートである。
【図１５】第２の実施の形態に係るハイライト生成処理の流れを示すフローチャートである。
【図１６】第２の実施の形態に係るハイライト生成処理（データフロー）の適用例であり、（ａ）が解析処理の途中経過であり、（ｂ）が解析結果である。
【図１７】第３の実施の形態に係るデバッグの手順を示すフローチャートである。
【図１８】第３の実施の形態に係るサブプログラム生成処理の流れを示すフローチャートである。
【図１９】第３の実施の形態に係るサブプログラム生成処理の適用例であり、（ａ）が解析処理の途中経過であり、（ｂ）が解析結果である。
【図２０】第３の実施の形態に係るサブフローチャート生成処理の適用例であり、（ａ）が解析処理の途中経過であり、（ｂ）が解析結果である。
【図２１】第４の実施の形態に係るデバッグの手順を示すフローチャートである。
【図２２】第４の実施の形態に係るサブデータフロー生成処理の流れを示すフローチャートである。
【図２３】第４の実施の形態に係るサブデータフロー生成処理の適用例であり、（ａ）が解析処理の途中経過であり、（ｂ）が解析結果である。
【図２４】第５の実施の形態に係るハイライト生成処理の流れを示すフローチャートである。
【図２５】解析対象のサンプルプログラムの他の例である。
【図２６】図２５のサンプルプログラムのフローチャートの一例である。
【図２７】図２５のサンプルプログラムのデータフローの一例である。
【図２８】図２５のサンプルプログラムの実行時の変数の時系列データの一例である。
【図２９】第５の実施の形態に係るハイライト生成処理（フローチャート）の適用例における解析処理の途中経過である。
【図３０】第５の実施の形態に係るハイライト生成処理（フローチャート）の適用例における解析処理の途中経過である。
【図３１】第５の実施の形態に係るハイライト生成処理（フローチャート）の適用例における解析結果である。
【図３２】第５の実施の形態に係るハイライト生成処理（フローチャート）の適用例における解析結果である。
【図３３】第６の実施の形態に係るハイライト生成処理の流れを示すフローチャートである。
【図３４】第６の実施の形態に係るハイライト生成処理（データフロー）の適用例における解析処理の途中経過である。
【図３５】第６の実施の形態に係るハイライト生成処理（データフロー）の適用例における解析結果である。
【図３６】第６の実施の形態に係るハイライト生成処理（データフロー）の適用例における解析結果である。
【図３７】第７の実施の形態に係るハイライト生成処理の流れを示すフローチャートである。
【図３８】図２４のサンプルプログラムの実行時の変数の時系列データの他の例である。
【図３９】第７の実施の形態に係るハイライト生成処理（フローチャート）の適用例における解析処理の途中経過である。
【図４０】第７の実施の形態に係るハイライト生成処理（フローチャート）の適用例における解析処理の途中経過である。
【図４１】第７の実施の形態に係るハイライト生成処理（フローチャート）の適用例における解析結果である。
【図４２】第７の実施の形態に係るハイライト生成処理（フローチャート）の適用例における解析結果である。
【図４３】第８の実施の形態に係るハイライト生成処理の流れを示すフローチャートである。
【図４４】第８の実施の形態に係るハイライト生成処理（データフロー）の適用例における解析処理の途中経過である。
【図４５】第８の実施の形態に係るハイライト生成処理（データフロー）の適用例における解析処理の途中経過である。
【図４６】第８の実施の形態に係るハイライト生成処理（データフロー）の適用例における解析結果である。
【図４７】第８の実施の形態に係るハイライト生成処理（データフロー）の適用例における解析結果である。
【図４８】第９の実施の形態に係るデバッグの手順を示すフローチャートである。
【図４９】第９の実施の形態に係るハイライト生成処理の流れを示すフローチャートである。
【図５０】第９の実施の形態に係るハイライト生成処理（データフロー）の適用例における解析結果である。
【発明を実施するための形態】
【００１４】
以下、図面を参照して、本発明に係るデバッグ装置の実施の形態を説明する。なお、各図において同一又は相当する要素については同一の符号を付し、重複する説明を省略する。
【００１５】
本実施の形態では、本発明に係るデバッグ装置を、車両等の開発中の制御プログラム（制御ソフトウェア）をデバッグするための制御プログラム開発環境（特に、ホストパソコン）に適用する。本実施の形態に係る制御プログラム開発環境では、制御プログラムを実際に実行し、実行して取得できた変数の値を解析してプログラムに含まれる条件分岐における判定結果を判別し、プログラムのフロー構造のうち実行されたフロー部分を他のフロー部分よりも強調表示する。本実施の形態では、プログラムのフロー構造として、ソースコード、フローチャート、データフローがある。また、本実施の形態では、強調表示として、実行されたフロー部分をハイライト表示しかつ実行されていないフロー部分をグレーアウトする強調表示、実行されたフロー部分のみを表示するサブソースコード、サブフローチャート、サブデータフローとした強調表示がある。本実施の形態には、強調表示の方法の違い、強調表示するフロー構造の違い、実行されているフロー部分の判断方法の違いなどにより、９つの実施の形態がある。
【００１６】
図１を参照して、本実施の形態に係る制御プログラム開発環境１について説明する。図１は、本実施の形態に係る制御プログラム開発環境の構成図である。制御プログラム開発環境１は、ホストパーソナルコンピュータ（以下、「ホストパソコン」と記載）２、制御コンピュータ３、制御対象４からなる。ホストパソコン２は、プログラム（ソフトウェア）をコーディング／デバッグするためのコンピュータである。制御コンピュータ３は、制御対象４を制御するためのターゲットのコンピュータであり、例えば、車両の場合にはエンジンやブレーキ等を制御するためのＥＣＵ[Electronic Control Unit]である。制御対象４は、例えば、車両の場合にはエンジンやブレーキである。プログラムは、ホストパソコン２上で作成される。作成（開発）されたプログラムは、制御コンピュータ３に書き込み、実行させることにより、正常に動作しているかを確認する。なお、以下で第１〜第９の実施の形態について説明するが、ホストパソコン２は各実施の形態に対応して構成される。本実施の形態では、ホストパソコン２における各処理が特許請求の範囲に記載する推定手段及び判別手段に相当し、制御コンピュータ３が特許請求の範囲に記載する実行手段に相当する。
【００１７】
ここで、本実施の形態に係る制御プログラム開発環境１と対比するために、図２を参照して、従来の制御プログラム開発環境１０１の一例を説明しておく。図２は、従来の制御プログラム開発環境の構成図である。従来の制御プログラム開発環境１０１では、開発したプログラムに従って制御対象１０４を制御する制御コンピュータ（マイコン）１０３の動作を記録（トレース）し、その記録に基づいて低レベルの（マイコン内の実行ステップに対応した）プログラムのフローを作成する。さらに、作成した低レベルのフローに従って、低レベル（マイコンのレジスタやアドレスでの表現）のデータフローを作成する。この従来の制御プログラム開発環境１０１では、低レベルのマイコンの詳細な動作の記録が必要となるので、ＩＣＥ[In Circuit Emulator]１０５等の機器をホストパソコン１０２と制御コンピュータ１０３との間に接続し、制御コンピュータ１０３で実際に実行されたアドレスを１つずつ追跡し、そのデータをＩＣＥ１０５によってホストパソコン１０２に取り込む。このように、従来の制御プログラム開発環境１０１では、追加の機器が必要でありかつそれを制御対象１０４や制御コンピュータ１０３に接続する必要がある。そのため、車両の走行制御等のデバッグには不向きである。ＩＣＥ１０５を用いた制御コンピュータ（マイコン）１０３の実行動作のトレースでは、１つの実行ステップ毎に記録する。そのため、昨今のマイコンでは数Ｇステップ／秒程度のトレースとなり、制御動作のデバッグ／動作確認（数ｍｓ〜数秒〜数時間）のトレースを行うことは困難である。
【００１８】
図３を参照して、本実施の形態に係る制御プログラム開発環境１でのデバッグを行う際のデータの流れを説明する。図３は、本実施の形態に係るデバッグ時のデータの流れを示す図である。デバッグ対象のプログラムを、制御コンピュータ３で実行し、その実行した結果をプログラムで使用される各変数の値の時系列データとして取得する。この際、プログラムで使用される変数のうち、値を取得できる変数もあれば、値を取得できない変数もある。ホストパソコン２では、取得した変数の値の時系列データ及び実行したデバッグ対象のプログラムのソースコード、実行時のメモリアドレスと変数の関係等を取り込み、実際に実行されているフロー部分のソースコード上、フローチャート上、データフロー上の該当箇所を解析して出力（強調表示）する。図３の例では、実行されているフロー部分をハイライト表示したデータフローを示している。
【００１９】
ここで、以下で説明する本実施の形態に係るプログラムのデバッグ手順と対比するために、図４を参照して、従来の一般的なプログラムのデバッグ手順について説明しておく。図４は、一般的なデバッグの手順の一例を示すフローチャートである。開発者が、ホストパソコン上で制御用のプログラムをコーディングする(P1000)。
【００２０】
そして、そのデバッグ対象のプログラムが、制御コンピュータに書き込まれ、実行され、評価される(P1001)。この評価によって、開発者が、バグがあるか否か（問題のある挙動があるか否か）を判断する(P1002)。P1002にてバグがないと判断した場合には、デバッグを終了する。P1002にてバグがあると判断した場合（問題のある挙動がある場合）、その異常波形（信号）を確認し(P1003)、その異常波形に該当する変数を確認し(P1004)、問題が発生している範囲の時刻等を抽出する(P1005)。
【００２１】
そして、開発者は、ソースコード上において該当する変数の計算箇所を確認し(P1006)、その計算箇所が異常の原因箇所か否かを推測する（P1007）。P1007にて原因箇所でないと推測した場合、他の計算箇所を探して（P1008）、P1006に戻る。このように、原因となっている計算箇所にたどり着くまで一つずつ追いかけていく作業を行う。
【００２２】
P1007にて原因となっている計算箇所と推定した場合（問題の波形を計算している箇所を見つけた場合）、開発者は、その問題の発生している変数の前後の変数を一つずつ確認し（P1009）、その各変数の波形を一つずつ確認し（P1010）、確認している変数が原因箇所か否かを推測する（P1011）。P1011にて原因となっている変数でない場合、他の計算箇所を探して（P1008）、P1006に戻る。このように、原因となっている変数にたどり着くまで一つずつ追いかけていく作業を行う。
【００２３】
P1011にて原因となっている変数と推定した場合（問題のある挙動の変数を見つけた場合）、開発者は、それが真因箇所か否かを判断する（P1012）。P1012にて真因箇所と判断した場合、開発者は、その原因に基づいてソースコードを修正する（P1013）。
【００２４】
P1012にて真因箇所でない判断した場合、開発者は、その変数が参照している変数（依存変数）を１つずつ特定し（P1014）、その依存変数の計算箇所を検索し（P1015）、その依存変数の波形を一つずつ確認し（P1016）、確認している依存変数が原因箇所か否かを推測する（P1017）。P1017にて原因となっている変数でない場合、他の計算箇所を探して（P1018）、P1006に戻る。このように、原因となっている計算箇所や変数にたどり着くまで一つずつ追いかけていく作業を行う。ここで、開発者のスキルに依存する二重のループが二箇所発生する。
【００２５】
このように、従来の一般的なデバッグでは、原因箇所（真因箇所）を特定するまでに、開発者のスキルに依存した二重のループの繰り返しの作業が必要である。そのため、デバッグの作業工数が非常に多い。また、プログラムのフローを全て追跡していく必要があるので、デバッグの作業工数が非常に多くなる。したがって、デバッグの効率化が必要である。
【００２６】
図５を参照して、二重のループを無くした従来のプログラムのデバッグ手順についても説明しておく。図５は、改善したデバッグの手順の一例を示すフローチャートである。このデバッグ手順では、P1020〜P1025の手順は上記のP1000〜P1005の手順と同じである。問題が発生している範囲の時刻等を抽出すると(P1025)、その問題となっている箇所の実行アドレスを取得する（P1026）。但し、この実行アドレスの取得過程は、非常に困難である。次に、このデバッグ手順では、P1027〜P1032の手順は上記のP1006〜P1011の手順と同じである。
【００２７】
そして、開発者は、P1026で取得した実行アドレスを追跡し（P1033）、その実行アドレスの変数が参照している変数（依存変数）を１つずつ追跡し（P1034）、その依存変数の波形を一つずつ確認し（P1035）、確認している依存変数が原因箇所か否かを推測する（P1036）。P1036にて原因となっている変数でない場合、P1033に戻る。このように、原因となっている変数にたどり着くまで一つずつ追いかけていく作業を行う。
【００２８】
P1036にて原因となっている変数と推定した場合（問題のある挙動の変数を見つけた場合）、開発者は、それが真因箇所か否かを判断する（P1037）。P1037にて真因箇所と判断した場合、開発者は、ソースコードを修正する（P1038）。P1037にて真因箇所でないと判断した場合、P1033に戻る。このように、取得した実行アドレスを用いて原因となっている変数にたどり着くまで一つずつ追いかけていく作業を行う。
【００２９】
このデバッグ手順では、実行アドレスを取得することによって、実際のプログラムの動作を追跡することができるため、最初に原因となる計算箇所を見つけ、その後に実行アドレス（実行結果）をひたすら追跡することにより正確に動作した軌跡を追跡することが可能となる。しかし、一般的な制御プログラムの場合、少なくとも数ｍ秒〜数秒程度の実行を行うなかで、問題となる動作が発生する。マイコン（制御コンピュータ）では、１秒間に数千万命令〜数十億命令もの命令を実行するため、実際に実行した実行アドレスを制御プログラムに対して追跡するのは現実的ではない。さらに、正確な動作を追跡するためにＩＣＥ等の機器を接続する必要があるため、車両等の制御プログラムのデバッグのように机上での実行ができない環境では、適用することが困難である。
【００３０】
以上を鑑みて、本実施の形態では、実時間実行を行い、その際の変数の内容を定期的に取得した結果（以降、「試験データ」と記載）とプログラムを静的に解析した結果（フローチャート、データフロー等）から、実際に動作した解析結果上の範囲を強調表示する。開発者はこの強調表示された部分だけを確認すればよいので、デバッグ作業が効率化する。そこで、本実施の形態では、試験データの着目する時間範囲のデータをプログラムに適用し、プログラム内の条件分岐（ｉｆ文等）の分岐を確定し、実際に有効な（アクティブな）フロー部分を強調表示する。
【００３１】
まず、図６を参照して、第１の実施の形態に係るデバッグの手順について説明する。図６は、第１の実施の形態に係るデバッグの手順を示すフローチャートである。第１の実施の形態では、解析対象のプログラムのソースコード又はフローチャートを用いたデバッグであり、デバッグを効率化するためにソースコード又はフローチャートでアクティブな部分のみをハイライト表示させる。フローチャートは、プログラムを静的に解析することによって得ることができる。まず、開発者が、ホストパソコン２上で制御用のプログラムをコーディングする(P10)。
【００３２】
そして、その解析対象（デバッグ対象）のプログラムが、制御コンピュータ３に書き込まれ、実行され、評価される(P11)。この実行によって、制御対象４をプログラムに従って実際に動作させ、制御コンピュータ３で各変数の時系列の試験データを取得し、この試験データをホストパソコン２に取り込む。この試験データを用いた評価によって、開発者が、バグがあるか否か（問題のある挙動があるか否か）を判断する(P12)。P12にてバグがないと判断した場合には、デバッグを終了する。P12にてバグがあると判断した場合（問題の挙動がある場合）、試験データからその異常波形（信号）を確認し(P13)、その異常波形に該当する変数を確認し(P14)、問題が発生している範囲の時刻等を抽出する(P15)。そして、開発者は、下記で説明する第１の実施の形態に係る解析処理をホストパソコン２上で行わせ、該当時刻に実際に動作したソースコード上又はフローチャート上でアクティブ部分をハイライトさせる（P16）。
【００３３】
そして、開発者は、ハイライトしているソースコード上又はフローチャート上の部分から該当する変数の計算箇所を確認し(P17)、その計算箇所が異常の原因箇所か否かを推測する（P18）。P18にて原因となっている計算箇所でない場合、他の計算箇所を探して（P19）、P17に戻る。ここで、該当する計算箇所にたどり着くまで一つずつ追いかけていく作業を行う。しかし、ハイライト表示されているアクティブな部分だけを確認するので、そのデバッグ工数は低減される。
【００３４】
P18にて原因となっている計算箇所と推定した場合（問題の波形を計算している箇所を見つけた場合）、開発者は、その問題の発生している変数の前後の変数を一つずつ確認し（P20）、その変数の波形を一つずつ確認し（P21）、確認している変数が原因箇所か否かを推測する（P22）。P22にて原因となっている変数でない場合、他の計算箇所を探して（P19）、P17に戻る。ここで、原因となっている変数にたどり着くまで一つずつ追いかけていく作業を行う。ここでも、ハイライト表示されている部分だけを確認するので、そのデバッグ工数は低減される。
【００３５】
P22にて原因となっている変数と推定した場合（問題のある挙動の変数を見つけた場合）、開発者は、ハイライトの内容に従ってプログラムのフロー（ソースコード上又はフローチャートの条件分岐）を追跡して(P23)、その変数が参照している変数（依存変数）を１つずつ追跡し（P24）、その依存変数の波形を一つずつ確認し（P25）、確認している依存変数が原因箇所か否かを推測する（P26）。P26にて原因となっている変数でない場合、P23に戻る。ここで、原因となっている変数にたどり着くまで一つずつ追いかけていく作業を行う。ここでは、ソースコード上の実行箇所を逆に辿っていくことにより、問題となる箇所を探す。このとき、各条件分岐の箇所については、P16の解析処理によるハイライトの内容により試験データの値から有効な部分が確定されているため、基本的には検討が不要である。ここでも、ハイライト表示されている部分だけを確認するので、そのデバッグ工数は低減される。但し、試験データがない変数については確定されていないので、開発者が判断する。
【００３６】
P26にて原因となっている変数と推定した場合（問題のある挙動の変数を見つけた場合）、開発者は、それが真因箇所か否かを判断する（P27）。P27にて真因箇所と判断した場合、開発者は、ソースコードを修正する（P28）。P27にて真因箇所でないと判断した場合、P23に戻る。ここでも、原因となっている変数にたどり着くまで一つずつ追いかけていく作業を行う。このデバッグ手順では、ハイライト表示によってアクティブな部分が示されているので、それ以外の部分の確認作業が不要であり、デバッグ作業の短縮化を図ることができる。
【００３７】
図７を参照して、第１の実施の形態に係るホストパソコン２における上記のP16のソースコード上又はフローチャート上のアクティブ部分のハイライト生成処理について説明する。図７は、第１の実施の形態に係るハイライト生成処理の流れを示すフローチャートである。第１の実施の形態では、制御コンピュータ３（マイコン）内に読み込まれたＲＡＭの時系列データ（試験データ）を変数値としてサンプリングしたデータ列とプログラム（ソースコード又はフローチャート）とを組み合わせ、実際に実行されているソースコード上又はフローチャート上のアクティブ部分を判別してハイライト表示する。この処理では、バストレースを使わずに、可視化の周期をよりマクロ的に行っている。なお、以下の説明では、ソースコードの場合で説明するが、フローチャートの場合も同様である。
【００３８】
ホストパソコン２では、解析対象の時系列データ（試験データ）を制御コンピュータ３から読み込み(S10)、変数名の一覧を作成する(S11)。次に、ホストパソコン２では、解析対象のプログラムのソースコードを読み込む（S12）。ホストパソコン２では、このソースコード上に変数があるか否かをチェックする(S13)。
【００３９】
S13にて変数があると判断した場合、ホストパソコン２では、変数毎に、変数に該当する時系列データ（試験データ）があるかをチェックする（S14）。S14にて時系列データがあると判断した場合、ホストパソコン２では、その変数の値を該当するデータに応じて設定する（S15）。S14にて時系列データがないと判断した場合、ホストパソコン２では、その変数の値に不明を設定する(S16）。そして、ホストパソコン２では、その設定結果をソースコード上の変数に紐付ける（S17）。以上の処理を、プログラムで使用される全ての変数について行う。
【００４０】
S17で全ての変数について紐付けが終了した場合又はS13にて変数がないと判断した場合、ホストパソコン２では、ソースコード上に条件分岐があるかをチェックする（S18）。S18にて条件分岐があると判断した場合、ホストパソコン２では、条件分岐毎に、S17での変数に対する設定結果の紐付けに基づいて、条件分岐を判断するために必要な変数の値が不明か否かを判定する(S19)。S19にて不明と判定した場合、ホストパソコン２では、その条件分岐の判定結果を不明に設定する（S20）。S19にて不明でないと判定した場合、ホストパソコン２では、条件分岐を判断するために必要な変数の値に基づいてその条件分岐の成否を判定し（S21）、その判定結果を条件分岐の成否に設定する（S22）。そして、ホストパソコン２では、ソースコード上の条件分岐に判定結果を紐付ける（S23）。以上の処理を、プログラムに含まれる全ての条件分岐について行う。
【００４１】
全ての紐付けが終了した場合、ホストパソコン２では、ソースコード上の各条件分岐に紐付けられている判定結果に基づいてソースコード上で実際に実行されている部分（アクティブな部分）を判定し、ソースコード上でアクティブな部分をハイライトに設定する（S24）。そして、ホストパソコン２では、解析処理が全て完了したか否かを判定し(S25)、完了した場合にはハイライト設定に従ってソースコード上でアクティブな部分をＧＵＩ[Graphical User Interface]等により提示して処理を終了し、完了していない場合にはS12の処理に戻る。
【００４２】
ここで、この第１の実施の形態に係る解析処理によるアクティブな部分のハイライト生成処理を適用した一例を説明する。図８には、解析対象のサンプルのプログラム（ソースコード）の一例を示す。図９には、そのサンプルプログラムを静的に解析したフローチャートの一例を示す。図１０には、出力変数をｘとして、サンプルプログラムを静的に解析したデータフローの一例を示す。
【００４３】
図１１には、このサンプルプログラムを実行した結果である各変数の時系列データ（試験データ）の一例を示す。この例では、５ｍｓ毎に制御演算を行っているものとし、サンプルプログラムを実行して、１ｍｓ周期で内部の変数の値を取得した。
【００４４】
図１２を参照して、ソースコードに対する解析過程と解析結果について説明する。図１２は、第１の実施の形態に係るハイライト生成処理（ソースコード）の適用例であり、（ａ）が解析処理の途中経過であり、（ｂ）が解析結果である。まず、解析条件として、解析対象の時間＝２〜４ｍｓを設定した。次に、変数名の一覧として、ｆ、ｘ、ｇ＿ａ、ｇ＿ｂを作成した。次に、図１２（ａ）に示すように、ソースコードを読み込み、ソースコード上に変数があるかをチェックする。次に、図１２（ａ）に示すように、図１１に示す２〜４ｍｓの各変数のデータを用いて、ソースコード上の各変数に値を紐付ける。ここでは、変数ｆに１が紐付けられ、変数ｘに１０が紐付けられている。次に、図１２（ａ）に示すように、ソースコード上に条件分岐があるかをチェックする。ここでは、条件分岐としてｉｆ（ｆ＝＝１）がある。次に、図１２（ａ）に示すように、上記の各変数に対する紐付けを用いて、条件分岐の成否を判定する。ここでは、ｆ＝１を用いて、条件分岐ｉｆ（ｆ＝＝１）が「ｔｒｕｅ」と判定される。次に、その条件分岐の判定結果に基づいて、ソースコード上で実際に実行されている部分（アクティブな部分）を判定する。ここでは、ｆ＝ｆｕｎｃＦ（）；、ｘ＝ｆｕｎｃＡ（）；がアクティブ部分と判定される。次に、このアクティブな部分をハイライト表示する。図１２（ｂ）には、ソースコードにおいて、アクティブ部分をハイライト表示し、それ以外の無効部分をグレーアウトしたものを示している。この例では、確定した条件分岐については、グレーアウトしている。
【００４５】
図１３を参照して、フローチャートに対する解析過程と解析結果について説明する。図１３は、第１の実施の形態に係るハイライト生成処理（フローチャート）の適用例であり、（ａ）が解析処理の途中経過であり、（ｂ）が解析結果である。まず、上記と同様に、解析条件を設定し、変数名の一覧を作成した。次に、図１３（ａ）に示すように、フローチャートを読み込み、変数があるかをチェックする。次に、図１３（ａ）に示すように、図１１に示す２〜４ｍｓの各変数のデータを用いて、フローチャート上の各変数に値を紐付ける。ここでは、変数ｆに１が紐付けられ、変数ｘに１０が紐付けられている。次に、図１３（ａ）に示すように、フローチャート上に条件分岐があるかをチェックする。ここでは、条件分岐としてｆ＝＝１がある。次に、図１３（ａ）に示すように、上記の各変数に対する紐付けを用いて、条件分岐の成否を判定する。ここでは、ｆ＝１を用いて、条件分岐ｆ＝＝１が「ｔｒｕｅ」と判定される。次に、その条件分岐の判定結果に基づいて、フローチャート上で実際に実行されている部分（アクティブな部分）を判定する。ここでは、ｆ＝ｆｕｎｃＦ（）、ｘ＝ｆｕｎｃＡ（）の各処理がアクティブ部分と判定される。次に、このアクティブな部分をハイライト表示する。図１３（ｂ）には、フローチャートにおいて、アクティブ部分をハイライト表示し、それ以外の無効部分をグレーアウトしたものを示している。この例では、確定した条件分岐については、グレーアウトしている。
【００４６】
この第１の実施の形態によれば、実際に実行して得られた時系列データ（試験データ）における特定の時刻範囲のデータを各変数の値として紐付け、その各変数の値に基づいて条件分岐の成否を判定してアクティブな部分を判別することにより、アクティブな部分だけをハイライト表示したソースコードやフローチャートを提示できる。このアクティブな部分をハイライト表示したソースコードやフローチャートにより、開発者は、そのアクティブな部分だけをデバッグ対象とすることができ、デバッグ効率が向上し、迅速かつ容易に原因となっているバグのある変数に到達できる。
【００４７】
次に、図１４を参照して、第２の実施の形態に係るデバッグの手順について説明する。図１４は、第２の実施の形態に係るデバッグの手順を示すフローチャートである。第２の実施の形態では、解析対象のプログラムの条件付きのデータフローを用いたデバッグであり、デバッグを効率化するためにデータフローでアクティブな部分のみをハイライト表示させる。条件付きのデータフローは、プログラムを静的に解析することによって得ることができる。このデバッグ手順では、P30〜P35の手順は第１の実施の形態に係るデバッグ手順のP10〜P15の手順と同じである。問題が発生している範囲の時刻等を抽出すると(P35)、開発者は、下記で説明する第２の実施の形態に係る解析処理をホストパソコン２上で行わせ、該当時刻に実際に動作したデータフローのアクティブ部分をハイライトさせる（P36）。
【００４８】
そして、開発者は、ハイライトしているデータフロー上の部分から該当する変数が参照している変数（依存変数）を１つずつ確認し（P37）、その依存変数の波形を一つずつ確認し（P38）、確認している依存変数が真因となる変数か否かを推測する（P39）。P39にて真因変数でないと推定した場合、P37に戻る。ここで、他の依存変数を確認し、真因変数が特定されるまで一つずつ追いかけていく作業を行う。しかし、ハイライト表示されているアクティブな部分だけを確認するので、そのデバッグ工数は低減される。また、そのループも小さい。
【００４９】
P39にて真因変数と推定した場合、開発者は、その変数の計算箇所を確認し(P40)、その計算箇所が異常の原因箇所か否かを推測する（P41）。P41にて原因となっている計算箇所でない場合、他の計算箇所を探して（P42）、P40に戻る。ここで、原因となっている計算箇所にたどり着くまで一つずつ追いかけていく作業を行う。ここでも、ハイライト表示されているアクティブな部分だけを確認するので、そのデバッグ工数は低減される。
【００５０】
P41にて原因となっている計算箇所と推定した場合（問題の波形を計算している箇所を見つけた場合）、開発者は、その問題の発生している変数の前後の変数を一つずつ確認し（P43）、その変数の波形を一つずつ確認し（P44）、確認している変数が原因箇所か否かを推測する（P45）。P45にて原因となっている変数でない場合、他の計算箇所を探して（P42）、P40に戻る。ここで、原因となっている変数にたどり着くまで一つずつ追いかけていく作業を行う。ここでも、ハイライト表示されているアクティブな部分だけを確認するので、そのデバッグ工数は低減される。また、真因変数を探す必要がないので、ループが小さい。P45にて原因となっている変数と推定した場合（問題のある挙動の変数を見つけた場合）、開発者は、ソースコードを修正する（P46）。このデバッグ手順では、繰り返しのループは小さな２回のループだけであり、デバッグ作業の短縮化を図ることができる。
【００５１】
図１５を参照して、第２の実施の形態に係るホストパソコン２における上記のP36のデータフロー上のアクティブ部分のハイライト生成処理について説明する。図１５は、第２の実施の形態に係るハイライト生成処理の流れを示すフローチャートである。第２の実施の形態では、制御コンピュータ３（マイコン）内に読み込んだＲＡＭの時系列データ（試験データ）を変数値としてサンプリングしたデータ列と条件の明示されたデータフローとを組み合わせ、実際に実行されている有効なデータフローのアクティブ部分をジャン別してハイライト表示する。
【００５２】
ホストパソコン２では、解析対象の時系列データ（試験データ）を制御コンピュータ３から読み込み(S30)、変数名の一覧を作成する(S31)。さらに、ホストパソコン２では、成立条件付きのデータフローを生成する(S32)。この成立条件付きのデータフローの生成手法は、従来の手法を適用する。そして、S34〜S44の処理については、第１の実施の形態で説明したS13〜S23と同様の処理を行う。
【００５３】
次に、ホストパソコン２では、条件分岐に関連する計算式があるかをチェックする(S45)。S45にて計算式があると判断した場合、ホストパソコン２では、S38での変数に対する紐付けやS44での条件分岐に対する紐付けに基づいて、その計算式が有効か否かを判定する(S46)。S46にて不明と判定した場合、ホストパソコン２では、条件分岐に対する計算式の依存関係として不明にセットする(S47)。S46にて有効と判定した場合、ホストパソコン２では、条件分岐に対する計算式の依存関係として有効にセットする（S48）。S46にて無効と判定した場合、ホストパソコン２では、条件分岐に対する計算式の依存関係として無効にセットする（S49）。そして、ホストパソコン２では、その判定結果を条件分岐に紐付ける（S50）。
【００５４】
全ての紐付けが終了した場合、ホストパソコン２では、S44及びS50で各条件分岐に紐付けられている判定結果に基づいてデータフロー上で実際に実行されている部分（アクティブな部分）のノード及びリンクを判定し、データフロー上でアクティブな部分なノード及びリンクをハイライトに設定する（S51）。そして、ホストパソコン２では、解析処理が全て完了したか否かを判定し(S52)、完了した場合にはハイライト設定に従ってデータフロー上でアクティブな部分をＧＵＩ等により提示して処理を終了し、完了していない場合にはS33の処理に戻る。
【００５５】
ここで、この第２の実施の形態に係る解析処理によるアクティブな部分のハイライト生成処理を適用した一例を説明する。この例では、図８の解析対象のサンプルのプログラム（ソースコード）及び図１０のデータフローに適用し、図１１に示す時系列データを用いた。
【００５６】
図１６を参照して、データフローに対する解析過程と解析結果について説明する。図１６は、第２の実施の形態に係るハイライト生成処理（データフロー）の適用例であり、（ａ）が解析処理の途中経過であり、（ｂ）が解析結果である。まず、第１の実施の形態の適用例と同様に、解析条件を設定し、変数名の一覧を作成した。次に、図１６（ａ）に示すように、ソースコードを読み込み、変数があるかをチェックする。次に、図１６（ａ）に示すように、図１１に示す２〜４ｍｓの各変数のデータを用いて、ソースコード上の各変数に値を紐付ける。ここでは、変数ｆに１が紐付けられ、変数ｘに１０が紐付けられている。次に、図１６（ａ）に示すように、ソースコード上に条件分岐があるかをチェックする。ここでは、条件分岐としてｉｆ（ｆ＝＝１）がある。次に、図１６（ａ）に示すように、上記の各変数に対する紐付けを用いて、条件分岐の成否を判定する。ここでは、ｆ＝１を用いて、条件分岐ｉｆ（ｆ＝＝１）が「ｔｒｕｅ」と判定される。次に、条件分岐の成否の判定結果を用いて、各計算式についての有効／無効を判定する。ここでは、ｆ＝ｆｕｎｃＦ（）は有効（条件）と判定され、ｘ＝ｆｕｎｃＡ（）は有効と判定され、ｘ＝ｆｕｎｃＢ（）は無効と判定（さらに、この呼び出し先も無効と判定）される。次に、条件分岐の判定結果及び計算式の有効／無効に基づいて、データフロー上で実際に実行されている部分（アクティブな部分）のノード及びリンクを判定する。ここでは、ｆｕｎｃＦ（）のノード、ｆｕｎｃＡ（）のノードや変数ｘのノード等がアクティブ部分と判定される。次に、このアクティブな部分のノードやリンクをハイライト表示する。図１６（ｂ）には、データフローにおいて、アクティブ部分をハイライト表示し、それ以外の無効部分をグレーアウトしたものを示している。ここでは、確定した条件分岐については、グレーアウトしている。また、解析の必要性により、有効（条件）はハイライト表示している。
【００５７】
この第２の実施の形態によれば、実際に実行して得られた時系列データにおける特定の時刻範囲のデータを各変数の値として紐付け、その各変数の値に基づいて条件分岐の成否を判定するとともに各計算式の有効／無効を判定してアクティブな部分を判別することにより、アクティブな部分だけをハイライト表示したデータフローを提示できる。このアクティブな部分をハイライト表示したデータフローにより、開発者は、そのアクティブな部分だけをデバッグ対象とすることができ、デバッグ効率が向上し、迅速かつ容易に原因となっているバグのある変数に到達できる。
【００５８】
次に、図１７を参照して、第３の実施の形態に係るデバッグの手順について説明する。図１７は、第３の実施の形態に係るデバッグの手順を示すフローチャートである。第３の実施の形態では、解析対象のプログラムのソースコード又はフローチャートを用いたデバッグであり、デバッグを効率化するためにソースコード又はフローチャートでアクティブな部分のみを抽出したサブソースコード又はサブフローチャートを表示させる。このデバッグ手順では、P50〜P55の手順は第１の実施の形態に係るデバッグ手順のP10〜P15の手順と同じである。問題が発生している範囲の時刻等を抽出すると(P55)、開発者は、下記で説明する第３の実施の形態に係る解析処理をホストパソコン２上で行わせ、該当時刻に実際に動作したソースコード又はフローチャートのアクティブ部分を抽出したサブプログラム又はサブフローチャートを生成させる（P56）。そして、開発者は、サブプログラム又はサブフローチャートから該当する変数の計算箇所を確認する(P57)。この後のP58〜P67の手順は第１の実施の形態に係るデバッグ手順のP18〜P28の手順と略同様の手順である。但し、このデバッグ手順では、アクティブな部分しか表示されないので、第１の実施の形態のデバッグ手順におけるP23のようにプログラムフローを追跡（分岐部分でのロジック追跡）する必要がない。したがって、第１の実施の形態よりも更に確認追跡作業が削減され、デバッグ作業の短縮化を図ることができる。
【００５９】
図１８を参照して、第３の実施の形態に係るホストパソコン２における上記のP56のソースコード上又はフローチャート上のアクティブ部分を抽出したサブプログラム生成処理（サブフローチャート生成処理）について説明する。図１８は、第３の実施の形態に係るサブプログラム生成処理の流れを示すフローチャートである。第３の実施の形態では、制御コンピュータ３（マイコン）内に読み込んだＲＡＭの時系列データ（試験データ）を変数値としてサンプリングしたデータ列とプログラム（ソースコード又はフローチャート）とを組み合わせ、実際に実行されているソースコード又はフローチャートのアクティブ部分だけを抽出してサブプログラム又はサブフローチャートを生成して表示する。なお、以下の説明では、サブプログラムの生成の場合で説明するが、サブフローチャートの生成の場合も同様である。このS60〜S75の処理については、第１の実施の形態で説明したS10〜S25と同様の処理を行う。ホストパソコン２では、S75にて解析処理が完了したと判定した場合、ハイライト設定に従ってソースコード上でアクティブな部分を抽出し、それ以外の不成立な条件部分のソースコードを削除し、抽出したアクティブな部分のソースコードだけでサブプログラムとして生成し、そのサブプログラムをＧＵＩ等により提示して処理を終了する（S76）。
【００６０】
ここで、図１９を参照して、この第３の実施の形態に係る解析処理によるアクティブな部分を抽出したサブプログラム生成処理を適用した一例を説明する。図１９は、第３の実施の形態に係るサブプログラム生成処理の適用例であり、（ａ）が解析処理の途中経過であり、（ｂ）が解析結果である。この例では、図８の解析対象のサンプルのプログラム（ソースコード）に適用し、図１１に示す時系列データを用いた。図１９（ａ）には、第１の実施の形態での適用例で図１２（ｂ）に示したハイライト設定に従ってハイライト表示及びグレーアウトしたソースコードを示している。ここで、図１９（ｂ）に示すように、このグレーアウトしている箇所を削除し（ハイライト表示している箇所だけを残し）、サブプログラムを生成する。
【００６１】
また、図２０を参照して、この第３の実施の形態に係る解析処理によるアクティブな部分を抽出したサブフローチャート生成処理を適用した一例を説明する。図２０は、第３の実施の形態に係るサブフローチャート生成処理の適用例であり、（ａ）が解析処理の途中経過であり、（ｂ）が解析結果である。この例では、図８の解析対象のサンプルのプログラム（ソースコード）及び図９のフローチャートに適用し、図１１に示す時系列データを用いた。図２０（ａ）には、第１の実施の形態での適用例で図１３（ｂ）に示したハイライト設定に従ってハイライト表示及びグレーアウトしたフローチャートを示している。ここで、図２０（ｂ）に示すように、このグレーアウトしている箇所を削除し（ハイライト表示している箇所だけを残し）、サブフローチャートを生成する。
【００６２】
この第３の実施の形態によれば、実際に実行して得られた時系列データにおける特定の時刻範囲のデータを各変数の値として紐付け、その各変数の値に基づいて条件分岐の成否を判定してアクティブな部分を判別することにより、アクティブな部分だけを抽出したサブプログラムやサブフローチャートを生成して提示できる。このアクティブな部分だけを抽出したサブプログラムやサブフローチャートにより、開発者は、そのアクティブな部分だけをデバッグ対象とすることができ、デバッグ効率が向上し、迅速かつ容易に原因となっているバグのある変数に到達できる。特に、第１の実施の形態と比較して、サブソースコードやサブフローチャートにおいて分岐部の追跡が不要となるので、デバッグ工数を削減でき、更にデバッグ効率を向上できる。
【００６３】
次に、図２１を参照して、第４の実施の形態に係るデバッグの手順について説明する。図２１は、第４の実施の形態に係るデバッグの手順を示すフローチャートである。第４の実施の形態では、解析対象のプログラムのデータフローを用いたデバッグであり、デバッグを効率化するためにデータフローでアクティブな部分のみを抽出したサブデータフローを表示させる。このデバッグ手順では、P70〜P75の手順は第２の実施の形態に係るデバッグ手順のP30〜P35の手順と同じである。問題が発生している範囲の時刻等を抽出すると(P75)、開発者は、下記で説明する第４の実施の形態に係る解析処理をホストパソコン２上で行わせ、該当時刻に実際に動作したデータフローのアクティブ部分を抽出したサブデータフローを生成させる（P76）。そして、開発者は、サブデータフロー上の変数の波形を確認する(P77)。この後のP78〜P85の手順は第２の実施の形態に係るデバッグ手順のP39〜P46の手順と同じである。このデバッグ手順では、アクティブな部分しか表示されないので、第２の実施の形態のデバッグ手順におけるP37のようにデータフロー上の変数の依存性の有無の追跡が不要となる。したがって、第２の実施の形態よりも更に確認追跡作業が削減され、デバッグ作業の短縮化を図ることができる。
【００６４】
図２２を参照して、第４の実施の形態に係るホストパソコン２における上記のP76のデータフロー上のアクティブ部分を抽出したサブデータフロー生成処理について説明する。図２２は、第４の実施の形態に係るサブデータフロー生成処理の流れを示すフローチャートである。第４の実施の形態では、制御コンピュータ３（マイコン）内に読み込まれたＲＡＭの時系列データ（試験データ）を変数値としてサンプリングしたデータ列と条件の明示されたデータフローとを組み合わせ、実際に実行されているデータフローのアクティブ部分だけを抽出してサブデータフローを生成して表示する。このS80〜S102の処理については、第２の実施の形態で説明したS30〜S52と同様の処理を行う。ホストパソコン２では、S102にて解析処理が完了したと判定した場合、紐付けに応じたハイライト設定に従ってデータフロー上でアクティブな部分を抽出し、それ以外の不成立な条件部分のノード及びリンクを削除し、抽出したノード及びリンクだけでサブデータフローを生成し、そのサブデータフローをＧＵＩ等により提示して処理を終了する（S103）。
【００６５】
ここで、図２３を参照して、この第４の実施の形態に係る解析処理によるアクティブな部分を抽出したサブデータフロー生成処理を適用した一例を説明する。図２３は、第４の実施の形態に係るサブデータフロー生成処理の適用例であり、（ａ）が解析処理の途中経過であり、（ｂ）が解析結果である。この例では、図８の解析対象のサンプルのプログラム（ソースコード）及び図１０のデータフローに適用し、図１１に示す時系列データを用いた。図２３（ａ）には、第２の実施の形態での適用例で図１６（ｂ）に示したハイライト設定に従ってハイライト表示及びグレーアウトしたデータフローを示している。ここで、図２３（ｂ）に示すように、このグレーアウトしている箇所を削除し（ハイライト表示している箇所だけを残し）、サブデータフローを生成する。さらに、その右側には、条件を確定させ、条件部分のｆｕｎｃＦのノード等を削除したサブデータフローを生成している。
【００６６】
この第４の実施の形態によれば、実際に実行して得られた時系列データにおける特定の時刻範囲のデータを各変数の値として紐付け、その各変数の値に基づいて条件分岐の成否を判定してアクティブな部分を判別することにより、アクティブな部分だけを抽出したサブデータフローを生成して提示できる。このアクティブな部分だけを抽出したサブデータフローにより、開発者は、そのアクティブな部分だけをデバッグ対象とすることができ、デバッグ効率が向上し、迅速かつ容易に原因となっているバグのある変数に到達できる。特に、第２の実施の形態と比較して、データフロー上の変数の依存性の追跡が不要となるので、デバッグ工数を削減でき、更にデバッグ効率を向上できる。
【００６７】
次に、図６を参照して、第５の実施の形態に係るデバッグの手順について説明する。図６は、第５の実施の形態に係るデバッグの手順を示すフローチャートである。第５の実施の形態に係るデバッグ手順は、第１の実施の形態に係るデバッグ手順と同様の手順である。特に、第５の実施の形態の場合、第１の実施の形態の場合よりも、P16においてホストパソコン２でさせる解析処理によるソースコード又はフローチャートのアクティブ部分をハイライトさせる処理において未確定な条件分岐が削減されるので、原因となる計算箇所や変数を追跡する確認作業を削減でき、デバッグ作業を短縮できる。また、P23のハイライトの内容に従ってプログラムのフロー（ソースコード上の条件分岐）の追跡においても、条件分岐の変数をロギングしていない場合も計算式を追跡して有効／無効を判定済みであるので、追跡可能である。
【００６８】
図２４を参照して、第５の実施の形態に係るホストパソコン２における上記のP16のソースコード上又はフローチャート上のアクティブ部分のハイライト生成処理について説明する。図２４は、第５の実施の形態に係るハイライト生成処理の流れを示すフローチャートである。第５の実施の形態では、取得できていない変数のデータ列や取得できない変数のデータ列に対応するために、制御コンピュータ３（マイコン）内に読み込まれているＲＡＭの時系列データ（試験データ）を変数値としてサンプリングしたデータ列を用いて計算式を追跡／逆追跡して、プログラム上の計算式（依存関係の追跡）を用いて条件分岐の成否を判定し、実際に実行されているソースコード又はフローチャートのアクティブ部分をハイライト表示する。なお、以下の説明では、ソースコードの場合で説明するが、フローチャートの場合も同様である。
【００６９】
S110〜S114の処理については、第１の実施の形態で説明したS10〜S14と同様の処理を行う。S114にて時系列データがあると判断した場合、ホストパソコン２では、その変数の値を該当するデータに応じて設定する（S115）。さらに、ホストパソコン２では、その変数の値が計算式の中にあるか否かを判定する(S116)。S116にて計算式の中あると判定した場合、ホストパソコン２では、その計算式を解釈し、解釈した結果(左辺の変数等)の状態に値を設定し、ホストパソコン２のＲＡＭの所定の領域の構成される変数値データベースに格納する（S117）。ここでは、実際に実行して取得できている時系列データと同様に、変数値データベースにおいて各変数の値のデータ列として追加していく。S114にて時系列データがないと判断した場合、ホストパソコン２では、その変数の値に不明を設定する(S118）。そして、ホストパソコン２では、その設定結果をソースコード上の変数に紐付ける（S119）。そして、ホストパソコン２では、変数の値が確定したか否かを判定する(S120)。S120にて確定したと判定した場合、ホストパソコン２では、更新フラグに１をプラスする（S121）。S120にて確定していないと判定した場合、ホストパソコン２では、未確定フラグに１をプラスする（S122）。そして、ホストパソコン２では、未確定フラグが０より大きいかつ更新フラグが０より大きいか否かを判定し（S123）、S123にて未確定フラグが０より大きいかつ更新フラグが０より大きいと判定した場合にはS112の処理に戻る。これをプログラムで使用される各変数について行い、全ての変数の値が確定するまで行う。S123にて未確定フラグが０以下又は更新フラグが０以下と判定した場合、S124〜S131の処理については、第１の実施の形態で説明したS18〜S25と同様の処理を行う。なお、更新フラグ及び未確定フラグの初期値は、０である。
【００７０】
ここで、この第５の実施の形態に係る解析処理によるアクティブな部分のハイライト生成処理を適用した一例を説明する。図２５には、解析対象のサンプルのプログラム（ソースコード）の一例を示す。図２６には、そのサンプルのプログラムを静的に解析したフローチャートの一例を示す。図２７は、出力変数をｘとして、サンプルプログラムを静的に解析したデータフローの一例を示す。
【００７１】
図２８には、このサンプルプログラムを実行した結果である時系列データ（試験データ）の一例を示す。この例では、５ｍｓ毎に制御演算を行っているものとし、サンプルプログラムを実行して、１ｍｓ周期で内部の変数の値を取得した。この例では、変数ｉｎ１、ｉｎ２、ｘ、ｇ＿ａ、ｇ＿ｂについて時系列データを取得できているが、条件分岐の成否を判定に必要な変数ｆについてデータを取得できていない。そこで、この変数ｆのデータを得るために、取得できている時系列データを用いて計算式を追跡／逆追跡して変数ｆの値を確定させる。
【００７２】
図２９〜図３２を参照して、フローチャートに対する解析過程と解析結果について説明する。図２９、図３０は、第５の実施の形態に係るハイライト生成処理（フローチャート）の適用例における解析処理の途中経過である。図３１、図３２は、第５の実施の形態に係るハイライト生成処理（フローチャート）の適用例における解析結果である。まず、解析条件として解析対象の時間＝２〜４ｍｓを設定し、変数名の一覧を作成した。なお、この例では、フローチャートに適用した例を示すが、ソースコードに対しても同様に適用できる。
【００７３】
図２９には、各変数の値からなる変数値データベースを示している。この変数値データベースに格納されている各変数の値をフローチャートの各変数に割り当てる。そして、割り当てられた各値を元に、計算式の左辺値が確定するかをチェックする。左辺の値が確定する場合には、確定した値を用いて変数値データベースを更新する。そして、更新値が無くなるまで繰り返し、変数ｆの値を確定させる。
【００７４】
具体的には、初回は、解析対象の時間＝２〜４ｍｓで値を取得できている変数ｉｎ１、ｉｎ２、ｘ、ｇ＿ａ、ｇ＿ｂの各値（ｉｎ１＝１、ｉｎ２＝０、ｘ＝１０、ｇ＿ａ＝１０、ｇ＿ｂ＝２０）を変数値データベースの各変数に割り当てる。更新１回目は、ｇ＿ａの１０を用いて計算式ｒｅｔ＝ｇ＿ａの左辺のｒｅｔの値（ひいては、ｒｅｔｕｒｎ値（ｆｕｎｃＡ（）））を１０に確定するとともに、ｇ＿ｂの２０を用いて計算式ｒｅｔ＝ｇ＿ｂの左辺のｒｅｔの値（ひいては、ｒｅｔｕｒｎ値（ｆｕｎｃＢ（）））を２０に確定し、また、ｉｎ１の１を用いてｒｅｔｕｒｎ値（ｉｎｐ１（））を１に確定するとともに、ｉｎ２の０を用いてｒｅｔｕｒｎ値（ｉｎｐ２（））を０に確定し、変数値データベースを更新する。更新２回目は、ｆｕｎｃＡ（）のｒｅｔｕｒｎ値の１０を用いて計算式ｙ＝ｆｕｎｃＡ（）の左辺のｙの値を１０に確定するとともに、ｆｕｎｃＢ（）のｒｅｔｕｒｎ値の２０を用いて計算式ｚ＝ｆｕｎｃＢ（）の左辺の変数ｚの値を２０に確定し、また、ｉｎｐ１（）のｒｅｔｕｒｎ値の１を用いて計算式ｒｅｔ＝ｉｎｐ１（）の左辺のｒｅｔを１に確定するとともに、ｉｎｐ２（）のｒｅｔｕｒｎ値の０を用いて計算式ｒｅｔ＝ｉｎｐ２（）の左辺のｒｅｔを０に確定し、変数値データベースを更新する。更新３回目は、ｙの１０を用いて計算式ｘ＝ｙの右辺のｙの値を１０に確定するとともに、ｚの２０を用いて計算式ｘ＝ｚの右辺の変数ｚの値を２０に確定し、また、ｆｕｎｃＦ１（）においてｒｅｔの１を用いてそのｒｅｔｕｒｎ値（ｆｕｎｃＦ１（））を１に確定するとともに、ｆｕｎｃＦ２（）においてｒｅｔの０を用いてそのｒｅｔｕｒｎ値（ｆｕｎｃＦ２（））を０に確定し、変数値データベースを更新する。更新４回目は、ｆｕｎｃＦ１（）のｒｅｔｕｒｎ値の１を用いて計算式ｆ１＝ｆｕｎｃＦ１（）の左辺のｆ１の値を１に確定するとともに、ｆｕｎｃＦ２（）のｒｅｔｕｒｎ値の０を用いて計算式ｆ２＝ｆｕｎｃＦ２（）の左辺のｆ２の値を０に確定し、変数値データベースを更新する。更新５回目では、ｆ１の値の１とｆ２の値の０を用いて計算式ｆ＝ｆ１ｘｏｒｆ２の左辺のｆの値を１に確定し、変数値データベースを更新する。このように、変数ｆの値を確定し、この変数ｆの値を用いて条件分岐の成否を判定する。
【００７５】
図３０に示すように、上記の変数値データベースにおける確定されている各変数の値をフローチャート上の各変数に紐付ける。そして、次に、フローチャート上に条件分岐があるかをチェックする。ここでは、条件分岐としてｆ＝＝１？がある。次に、上記の各変数に対する紐付け（特に、変数ｆに対する１）を用いて、条件分岐の成否を判定する。ここでは、ｆ＝１により、条件分岐ｆ＝＝１？が「ｔｒｕｅ」と判定される。したがって、ｘ＝ｚは、実行されない。次に、条件分岐の判定結果に基づいて、フローチャート上で実際に実行されている部分（アクティブな部分）を判定する。次に、この上でアクティブな部分をハイライト表示する。図３１には、フローチャートにおいてアクティブ部分をハイライト表示し、それ以外の無効部分をグレーアウトしたものを示している。ここでは、条件部も含めてハイライトしている。さらに、図３２には、条件部もグレーアウトし、演算部のみをハイライト表示したものを示している。ここでは、条件に用いられている変数の値を確定しているものとしてグレーアウトすることにより、直接演算に係る部分のみを有効部分としてハイライトしている。
【００７６】
この第５の実施の形態によれば、実際に実行して得られた時系列データにおける特定の時刻範囲のデータを各変数の値として紐付け、その各変数の値に基づいて計算式を追跡／逆追跡して取得できていない変数の値を確定し、その確定した変数の値を用いて条件分岐の成否を判定してアクティブな部分を判別することにより、アクティブな部分だけをハイライト表示したソースコードやフローチャートを提示できる。このアクティブな部分をハイライト表示したソースコードやフローチャートにより、開発者は、そのアクティブな部分だけをデバッグ対象とすることができ、デバッグ効率が向上し、迅速かつ容易に原因となっているバグのある変数に到達できる。特に、条件分岐を判定するために必要な変数の値を取得できない場合でも、その変数の値を計算式を追跡／逆追跡して値を確定することによってソースコード上又はフローチャート上の条件分岐の成否を判定しているので（ソースコード上又はフローチャート上の未確定の条件分岐が低減されているので）、条件分岐の確認作業が低減し、デバッグ効率が更に向上する。
【００７７】
次に、図１４を参照して、第６の実施の形態に係るデバッグの手順について説明する。図１４は、第６の実施の形態に係るデバッグの手順を示すフローチャートである。第６の実施の形態に係るデバッグ手順は、第２の実施の形態に係るデバッグ手順と同様の手順である。特に、第６の実施の形態の場合、第２の実施の形態の場合よりも、P36においてホストパソコン２でさせる解析処理によるデータフローのアクティブ部分をハイライトさせる処理において未確定な条件分岐が削減されるので、原因となる計算箇所や変数を追跡する確認作業を短縮できる。また、P37のハイライト内容に従った依存変数の確認において、条件分岐の変数をロギングしていない場合も計算式を追跡して有効／無効を判定済みであるので、確認作業を低減できる。
【００７８】
図３３を参照して、第６の実施の形態に係るホストパソコン２における上記のP36のデータフロー上のアクティブ部分のハイライト生成処理について説明する。図３３は、第６の実施の形態に係るハイライト生成処理の流れを示すフローチャートである。第６の実施の形態では、取得できていない変数のデータ列や取得できない変数のデータ列に対応するために、制御コンピュータ３（マイコン）内に読み込まれているＲＡＭの時系列データ（試験データ）を変数値としてサンプリングしたデータ列を用いて追跡／逆追跡して、プログラム上の計算式（依存関係の追跡）を用いて条件分岐の成否を判定し、実際に実行されている有効なデータフローのアクティブ部分をハイライト表示する。
【００７９】
S140〜S145の処理については、第２の実施の形態で説明したS30〜S35と同様の処理を行う。S145にて時系列データがあると判断した場合、ホストパソコン２では、その変数の値を該当するデータに応じて設定する（S146）。さらに、ホストパソコン２では、その変数の値が計算式の中にあるか否かを判定する(S147)。S147にて計算式の中あると判定した場合、ホストパソコン２では、その計算式を解釈し、解釈した結果(左辺の変数等)の状態に値を設定し、変数値データベースに格納する(S148)。S145にて時系列データがないと判断した場合、ホストパソコン２では、その変数の値に不明を設定する(S149）。そして、ホストパソコン２では、その設定結果をソースコード上の変数に紐付ける（S150）。そして、ホストパソコン２では、変数の値が確定したか否かを判定する(S151)。S151にて確定したと判定した場合、ホストパソコン２では、更新フラグに１をプラスする（S152）。S151にて確定していないと判定した場合、ホストパソコン２では、未確定フラグに１をプラスする（S153）。そして、ホストパソコン２では、未確定フラグが０より大きいかつ更新フラグが０より大きいか否かを判定し（S154）、S154にて未確定フラグが０より大きいかつ更新フラグが０より大きいと判定した場合にはS143の処理に戻る。これをプログラムで使用される各変数について行い、全ての変数の値が確定するまで行う。S154にて未確定フラグが０以下又は更新フラグが０以下と判定した場合、S155〜S168の処理については、第２の実施の形態で説明したS39〜S52と同様の処理を行う。
【００８０】
ここで、図３４〜図３６を参照して、この第６の実施の形態に係る解析処理によるアクティブな部分のハイライト生成処理を適用した一例を説明する。図３４は、第６の実施の形態に係るハイライト生成処理（データフロー）の適用例における解析処理の途中経過である。図３５、図３６は、第６の実施の形態に係るハイライト生成処理（データフロー）の適用例における解析結果である。この例では、図２５の解析対象のサンプルのプログラム（ソースコード）及び図２７のデータフローに適用し、図２８に示す時系列データを用いた。この取得できている時系列データ（試験データ）を用いて、計算式を追跡／逆追跡することによって取得できていない変数の値を確定して（最終的に、条件分岐の成否を判定するための変数ｆの値を確定）、変数値データベースの更新については、図２９を参照した第５の実施の形態と同様であるので、説明を省略する。
【００８１】
図３４に示すように、上記の変数値データベースにおける確定されている各変数の値をデータフロー上の各ノードの各変数に紐付ける。そして、次に、データフロー上に条件分岐があるかをチェックする。ここでは、条件分岐としてｆ＝＝１ｏｒｆ＝＝０がある。次に、上記の各変数に対する紐付け（特に、変数ｆに対する１）を用いて、条件分岐の成否を判定する。ここでは、ｆ＝１を用いて、条件分岐のｆ＝＝１が成立と判定される。次に、条件分岐の判定結果に基づいて、データフロー上で実際に実行されている部分（アクティブな部分）のノード及びリンクを判定する。次に、このアクティブな部分のノードやリンクをハイライト表示し、無効なノードやリンクをグレーアウトする。図３５には、データフローにおいてアクティブ部分をハイライト表示し、それ以外の無効部分をグレーアウトしたものを示している。ここでは、条件部も含めてハイライトしている。さらに、図３６には、条件部もグレーアウトし、演算部のみをハイライト表示したものを示している。ここでは、条件判定に用いられているノードを確定しているものとしてグレーアウトすることにより、直接演算に係る部分のみを有効部分としてハイライトしている。
【００８２】
この第６の実施の形態によれば、実際に実行して得られた時系列データにおける特定の時刻範囲のデータを各変数の値として紐付け、その各変数の値に基づいて計算式を追跡／逆追跡して取得できていない変数の値を確定し、その確定した変数の値を用いて条件分岐の成否を判定してアクティブな部分を判別することにより、アクティブな部分だけをハイライト表示したデータフローを提示できる。このアクティブな部分をハイライト表示したデータフローにより、開発者は、そのアクティブな部分だけをデバッグ対象とすることができ、デバッグ効率が向上し、迅速かつ容易に原因となっているバグのある変数に到達できる。特に、条件分岐を判定するために必要な変数の値を取得できない場合でも、その変数の値を計算式を追跡／逆追跡して値を確定することによってデータフローにおける条件分岐の成否を判定しているので（データフロー上の未確定の条件分岐が低減されているので）、条件分岐の確認作業が低減し、デバッグ効率が更に向上する。
【００８３】
次に、図６を参照して、第７の実施の形態に係るデバッグの手順について説明する。図６は、第７の実施の形態に係るデバッグの手順を示すフローチャートである。第７の実施の形態に係るデバッグ手順は、第１の実施の形態に係るデバッグ手順と同様の手順である。特に、第７の実施の形態の場合、第１の実施の形態の場合よりも、P16においてホストパソコン２でさせる解析処理によるソースコード又はフローチャートのアクティブ部分をハイライトさせる処理において未確定な条件分岐が削減されるので、原因となる計算箇所や変数を追跡する確認作業を短縮できる。また、P23のハイライトの内容に従ってプログラムのフロー（ソースコード上の条件分岐）の追跡においても、条件分岐の変数をロギングしていない場合も条件分岐の前後の変数の値を用いて各条件の変数間の相関関係によって有効／無効を判定済みであるので、追跡可能である。
【００８４】
図３７を参照して、第７の実施の形態に係るホストパソコン２における上記のP16のソースコード上又はフローチャート上のアクティブ部分のハイライト生成処理について説明する。図３７は、第７の実施の形態に係るハイライト生成処理の流れを示すフローチャートである。第７の実施の形態では、取得できていない変数のデータ列だけでアクティブな部分を抽出するために、制御コンピュータ３（マイコン）内に読み込まれたＲＡＭの時系列データ（試験データ）を変数値としてサンプリングしたデータ列を用いて第１の実施の形態と同様の変数の値の割り当てと第５の実施の形態と同様の計算式の追跡／逆追跡を行った後に、未確定な条件分岐がある場合には条件分岐の各条件についての変数間の相関関係の優位差に基づいて条件分岐の成否を判定し、実際に実行されているソースコード又はフローチャートのアクティブ部分をハイライト表示する。なお、以下の説明では、フローチャートの場合で説明するが、ソースコードの場合も同様である。
【００８５】
S170〜S185の処理については、第５の実施の形態で説明したS110〜S125と同様の処理を行う。S185にて条件分岐の成否を判定するための変数の値が不明と判断した場合、ホストパソコン２では、その条件分岐の前後の変数間の相関関係を算出し（S186）、その相関関係に基づいて優位差があるか否かを判定する（S187）。S187にて優位差があると判定した場合、ホストパソコン２では、相関関係の高い変数のほうの条件を成立として設定する（S188）。S187にて優位差がないと判定した場合、ホストパソコン２では、その条件は不明とする（S189）。S185にて条件分岐の成否を判定するための変数の値が不明でないと判断した場合、ホストパソコン２では、その変数の値を用いて条件分岐の成否を判定し(S190)、その判定結果を条件分岐の成否に設定する（S191）。そして、ホストパソコン２では、その判定結果を条件分岐に紐付ける（S192）。
【００８６】
次に、ホストパソコン２では、条件分岐に関連する計算式があるかをチェックする(S193)。S193にて計算式があると判断した場合、ホストパソコン２では、S179での変数に対する紐付けやS192での条件分岐に対する判定結果の紐付けに基づいて、その計算式が有効か否かを判定する(S194)。S194にて不明と判定した場合、ホストパソコン２では、計算式の左辺と右辺の各変数の相関関係を算出し（S195）、変数間に優位差があるか否かを判定する（S196）。S196にて優位差があると判定した場合、ホストパソコン２では、関連のある変数に合わせて条件を紐付ける（S197）。S196にて優位差がないと判定した場合、ホストパソコン２では、その条件は不明とする（S198）。S194にて有効と判定した場合、ホストパソコン２では、条件分岐に対する計算式の依存関係を有効にセットする（S199）。S194にて無効と判定した場合、ホストパソコン２では、条件分岐に対する計算式の依存関係を無効にセットする（S200）。そして、ホストパソコン２では、その判定結果を条件分岐に紐付ける（S201）。
【００８７】
全ての条件分岐について紐付けが終了した場合、ホストパソコン２では、各条件分岐に紐付けられている判定結果に基づいてフローチャート上で実際に実行されている部分（アクティブな部分）を判定し、フローチャート上でアクティブな部分をハイライトに設定する（S202）。そして、ホストパソコン２では、解析処理が全て完了したか否かを判定し(S203)、完了した場合にはハイライト設定に従ってフローチャート上でアクティブな部分をＧＵＩ等により提示して処理を終了し、完了していない場合にはS172の処理に戻る。
【００８８】
なお、相関関係の優位差を判定する方法としては、例えば、条件分岐の前後の変数の各値を用いて、条件分岐の各条件における計算式の右辺と左辺の各変数の値を比較することによって相関関係の優位差を判定する方法、条件分岐の前後の変数の各値の時系列データを用いて、共分散行列等を利用して、条件分岐の各条件における計算式の右辺の変数の時系列データの波形と左辺の変数の時系列データの波形との相関関係をそれぞれ計算し、各条件についての相関関係の値を比較することによって優位差を判断する方法がある。
【００８９】
ここで、この第７の実施の形態に係る解析処理によるアクティブな部分のハイライト生成処理を適用した一例を説明する。この例では、図２５の解析対象のサンプルのプログラム（ソースコード）及び図２６のフローチャートに適用し、図３８に示す時系列データを用いた。この図３８には、このサンプルプログラムを実行した結果である時系列データ（試験データ）の一例を示す。この例では、５ｍｓ毎に制御演算を行っているものとし、サンプルプログラムを実行して、１ｍｓ周期で内部の変数の値を取得した。この例では、変数ｘ、ｇ＿ａ、ｇ＿ｂについて時系列データを取得できているが、条件分岐の成否を判定に必要な変数ｆ及び変数ｉｎ１、ｉｎ２についてはデータを取得できていない。そこで、取得できている時系列データを用いて計算式を追跡／逆追跡して変数の値を確定させ、それによって条件分岐の成否を判定に必要な変数ｆの値を確定できない場合には条件分岐の前後の変数間の相関関係に基づいて条件分岐の成否を判定する。
【００９０】
図３９〜図４２を参照して、フローチャートに対する解析過程と解析結果について説明する。図３９、図４０は、第７の実施の形態に係るハイライト生成処理（フローチャート）の適用例における解析処理の途中経過である。図４１、図４２は、第７の実施の形態に係るハイライト生成処理（フローチャート）の適用例における解析結果である。まず、解析条件として解析対象の時間＝２〜４ｍｓを設定し、変数名の一覧を作成した。なお、この例では、フローチャートに適用した例を示すが、ソースコードに対しても同様に適用できる。
【００９１】
図３９には、各変数の値からなる変数値のデータベースを示している。この変数値データベースの更新については、第５の実施の形態で説明した方法と同様に行う。具体的には、初回は、解析対象の時間＝２〜４ｍｓの変数ｘ、ｇ＿ａ、ｇ＿ｂの各値（ｘ＝１０、ｇ＿ａ＝１０、ｇ＿ｂ＝２０）を変数値データベースの各変数に割り当てる。更新１回目は、ｇ＿ａの１０を用いて計算式ｒｅｔ＝ｇ＿ａの左辺のｒｅｔの値（ひいては、ｒｅｔｕｒｎ値（ｆｕｎｃＡ（）））を１０に確定するとともに、ｇ＿ｂの２０を用いて計算式ｒｅｔ＝ｇ＿ｂの左辺のｒｅｔの値（ひいては、ｒｅｔｕｒｎ値（ｆｕｎｃＢ（）））を２０に確定し、変数値データベースを更新する。更新２回目は、ｆｕｎｃＡ（）のｒｅｔｕｒｎ値の１０を用いて計算式ｙ＝ｆｕｎｃＡ（）の左辺のｙの値を１０に確定するとともに、ｆｕｎｃＢ（）のｒｅｔｕｒｎ値の２０を用いて計算式ｚ＝ｆｕｎｃＢ（）の左辺の変数ｚの値を２０に確定し、変数値データベースを更新する。更新３回目は、ｙの１０を用いて計算式ｘ＝ｙの右辺のｙの値を１０に確定するとともに、ｚの２０を用いて計算式ｘ＝ｚの右辺の変数ｚの値を２０に確定し、変数値データベースを更新する。
【００９２】
これ以上の更新ができないので、条件分岐の各条件についての計算式の左辺と右辺の変数の値の比較による相関関係の優位差で条件分岐（ｆ＝＝１）の成否を判定する。変数値データベースから、変数ｘの値は１０であり、変数ｙの値は１０であり、ｚの値は２０である。ここで、条件分岐で分岐する一方の条件での計算式ｘ＝ｙの左辺の変数ｘの値（＝１０）と右辺の変数ｙの値（＝１０）との相関関係と、条件分岐で分岐する他方の条件での計算式ｘ＝ｚの左辺の変数ｘの値（＝１０）と右辺の変数ｚの値（＝２０）との相関関係との優位差を判断すると、計算式ｘ＝ｙの左辺の変数ｘの値と右辺の変数ｙの値との相関関係のほうが高い。そこで、条件分岐（ｆ＝＝１）の成否については、条件分岐を判定するための変数ｆの値は不明であるが、計算式ｘ＝ｙのほうの条件を成立として設定する。
【００９３】
図４０に示すように、上記の変数値データベースにおける確定されている各変数の値をフローチャート上の各変数に紐付けるとともに上記の条件分岐の成否の判定結果を紐付ける。ここでは、条件が不成立の側の計算式ｘ＝ｚをグレーアウトして示している。次に、アクティブな部分をハイライト表示する。図４１には、フローチャートにおいてアクティブ部分をハイライト表示し、無効部分をグレーアウトしたものを示している。ここでは、条件部も含めてハイライトしている。さらに、図４２には、条件部もグレーアウトし、演算部のみをハイライト表示したものを示している。ここでは、条件に用いられている変数の値を確定しているものとしてグレーアウトすることにより、直接演算に係る部分のみを有効部分としてハイライトしている。
【００９４】
この第７の実施の形態によれば、実際に実行して得られた時系列データにおける特定の時刻範囲のデータを各変数の値として紐付け、その各変数の値に基づいて計算式を追跡／逆追跡して取得できていない変数の値を確定した上で、条件分岐を判定できない場合にはその前後の変数間の相関関係に基づいて条件分岐の成否を判定してアクティブな部分を判別することにより、アクティブな部分だけをハイライト表示したソースコードやフローチャートを提示できる。このアクティブな部分をハイライト表示したソースコードやフローチャートにより、開発者は、そのアクティブな部分だけをデバッグ対象とすることができ、デバッグ効率が向上し、迅速かつ容易に原因となっているバグのある変数に到達できる。特に、ソースコード上又はフローチャート上の条件分岐を判定するために必要な変数の値を取得できない場合でも、その条件分岐の前後の変数の値を用いて各条件についての変数間の相関関係で条件分岐の成否を判定しているので（ソースコード上又はフローチャート上の未確定の条件分岐が低減されているので）、条件分岐の確認作業が低減し、デバッグ効率が更に向上する。
【００９５】
次に、図１４を参照して、第８の実施の形態に係るデバッグの手順について説明する。図１４は、第８の実施の形態に係るデバッグの手順を示すフローチャートである。第８の実施の形態に係るデバッグ手順は、第２の実施の形態に係るデバッグ手順と同様の手順である。特に、第８の実施の形態の場合、第２の実施の形態の場合よりも、P36においてホストパソコン２でさせる解析処理によるデータフローのアクティブ部分をハイライトさせる処理において未確定な条件分岐が削減されるので、原因となる計算箇所や変数を追跡する確認作業を短縮できる。また、P37のハイライト内容に従った依存変数の確認において、条件分岐の変数をロギングしていない場合も条件分岐の前後の変数の値を用いて各条件の変数間の相関関係によって有効／無効を判定済みであるので、確認作業を低減できる。
【００９６】
図４３を参照して、第８の実施の形態に係るホストパソコン２における上記のP36のデータフロー上のアクティブ部分のハイライト生成処理について説明する。図４３は、第８の実施の形態に係るハイライト生成処理の流れを示すフローチャートである。第８の実施の形態では、取得できていない変数のデータ列だけでアクティブな部分を抽出するために、制御コンピュータ３（マイコン）内に読み込まれたＲＡＭの時系列データ（試験データ）を変数値としてサンプリングしたデータ列を用いて第２の実施の形態と同様の変数の値の割り当てと第６の実施の形態と同様の計算式の追跡／逆追跡を行った後に、未確定な条件分岐がある場合には条件分岐の各条件についての変数間の相関関係の優位差に基づいて条件分岐の成否を判定し、実際に実行されているデータフローのアクティブ部分をハイライト表示する。
【００９７】
S210〜S224の処理については、第６の実施の形態で説明したS140〜S154と同様の処理を行う。また、S225〜S242の処理については、第７の実施の形態で説明したS184〜S201と同様の処理を行う。
【００９８】
全ての条件分岐について紐付けが終了した場合、ホストパソコン２では、各条件分岐に紐付けられている判定結果に基づいてデータフロー上で有効な（アクティブな）ノードやリンクを判定する(S243)。この際、ホストパソコン２では、有効／無効の判定不明なノード等があるか否かを判定する（S244）。S244にて判定不明なものがあると判定した場合、ホストパソコン２では、判定不明のノードの前後のノード間の相関関係を算出し（S245）、その相関関係に基づいて優位差があるか否かを判定する（S246）。S246にて優位差があると判定した場合、ホストパソコン２では、相関関係の高いノード間のほうのノードを有効と設定し、相関関係の低いノード間のほうのノードを無効と設定する（S247）。そして、ホストパソコン２では、S243での紐付けによる判定結果とS247でのノード間の相関関係による有効／無効の判定結果に従ってデータフロー上で有効な（アクティブな）ノード及びリンクをハイライトに設定する（S248）。そして、ホストパソコン２では、解析処理が全て完了したか否かを判定し(S249)、完了した場合にはハイライト設定に従ってデータフロー上でアクティブな部分をＧＵＩ等により提示して処理を終了し、完了していない場合にはS213の処理に戻る。
【００９９】
ここで、図４４〜図４７を参照して、この第８の実施の形態に係る解析処理によるアクティブな部分のハイライト生成処理を適用した一例を説明する。図４４、図４５は、第８の実施の形態に係るハイライト生成処理（データフロー）の適用例における解析処理の途中経過である。図４６、図４７は、第８の実施の形態に係るハイライト生成処理（データフロー）の適用例における解析結果である。この例では、図２５の解析対象のサンプルのプログラム（ソースコード）及び図２７のデータフローに適用し、図３８に示す時系列データを用いた。この取得できている時系列データ（試験データ）を用いて、計算式を追跡することによって取得できていない変数の値を確定しての変数値データベースの更新については、図３９を参照した第７の実施の形態と同様であるので、説明を省略する。
【０１００】
図４４に示すように、上記の変数値データベースにおける確定されている各変数の値をデータフロー上の各ノードの各変数に紐付ける。そして、次に、データフロー上に条件分岐があるかをチェックする。ここでは、条件分岐としてｆ＝＝１ｏｒｆ＝＝０がある。次に、図４５に示すように、この条件分岐の前の変数ｙの値は１０であり、ｚの値は２０である。また、条件分岐の後の変数ｘの値は１０である。ここで、条件分岐で分岐する一方の条件（ｆ＝＝１）での変数ｙの値（＝１０）と変数ｘの値（＝１０）との相関関係と、条件分岐で分岐する他方の条件（ｆ＝＝０）での変数ｚの値（＝２０）と変数ｘの値（＝１０）との相関関係との優位差を判断すると、一方の条件（ｆ＝＝１）での変数ｙの値と変数ｘの値との相関関係のほうが高い。そこで、条件分岐の成否については、変数ｆの値は不明であるが、一方の条件（ｆ＝＝１）のほうの条件を成立として設定し、こちら側のノード及びリンクを有効な部分とする。次に、図４６には、その判定結果に従って、データフローにおいて有効部分をハイライト表示し、無効部分をグレーアウトしたものを示している。ここでは、条件部も含めてハイライトしている。さらに、図４７には、条件部もグレーアウトし、演算部のみをハイライト表示したものを示している。ここでは、条件判定に用いられているノードを確定しているものとしてグレーアウトすることにより、直接演算に係る部分のみを有効部分としてハイライトしている。
【０１０１】
この第８の実施の形態によれば、実際に実行して得られた時系列データにおける特定の時刻範囲のデータを各変数の値として紐付け、その各変数の値に基づいて計算式を追跡／逆追跡して取得できていない変数の値を確定した上で、条件分岐を判定できない場合にはその前後の変数間の相関関係に基づいて条件分岐の成否を判定してアクティブな部分を判別することにより、アクティブな部分だけをハイライト表示したデータフローを提示できる。このアクティブな部分をハイライト表示したデータフローにより、開発者は、そのアクティブな部分だけをデバッグ対象とすることができ、デバッグ効率が向上し、迅速かつ容易に原因となっているバグのある変数に到達できる。特に、データフロー上の条件分岐を判定するために必要な変数の値を取得できない場合でも、その条件分岐の前後の変数の値を用いて各条件についての変数間の相関関係で条件分岐の成否を判定しているので（データフロー上の未確定の条件分岐が低減されているので）、条件分岐の確認作業が低減し、デバッグ効率が更に向上する。
【０１０２】
次に、図４８を参照して、第９の実施の形態に係るデバッグの手順について説明する。図４８は、第９の実施の形態に係るデバッグの手順を示すフローチャートである。第１〜第８の実施の形態での特定に時刻間でのデバッグであったが、第９の実施の形態では、長時間に適用したデバッグである。第９の実施の形態では、第８の実施の形態に係るデバッグを長時間に適用した形態で説明する。したがって、第９の実施の形態では、解析対象のプログラムの条件付きのデータフローを用いたデバッグであり、デバッグを効率化するために、データフローにおいて時間パラメータを切り替えながら各時刻帯でアクティブな部分のみをハイライト表示させる。このデバッグ手順では、P90〜P95の手順は第２の実施の形態に係るデバッグ手順のP30〜P35の手順と同じであるが、長時間の時系列データに対してデバッグを行う。問題が発生している範囲の時刻を順次抽出すると(P95)、開発者は、下記で説明する第９の実施の形態に係る解析処理をホストパソコン２上で行わせ、各時刻毎（タイミング毎）に実際に動作したデータフローのアクティブ部分をハイライトさせる（P96）。そして、開発者は、ハイライトしているデータフロー上の部分から該当する変数が参照している変数（依存変数）を１つずつ時系列で確認する（P97）。ここでは、時系列データの変化に従い、各時刻（各時刻間）でアクティブ（有効）になっているデータフローを算出し、問題となっている時刻に依存しているデータ、問題となっている時刻のデータが影響を与えているデータのフローが判断可能となる。そして、P98〜P106の手順も第２の実施の形態に係るデバッグ手順のP38〜P46の手順と同じであるが、長時間の時系列データに対してデバッグを行う。このデバッグでは、個別の信号の変化が見えなくなる代わりに、特定の条件の制御に関連している全範囲を摘出可能となる。
【０１０３】
図４９を参照して、第９の実施の形態に係るホストパソコン２における上記のP96のデータフロー上のアクティブ部分のハイライト生成処理について説明する。図４９は、第９の実施の形態に係るハイライト生成処理の流れを示すフローチャートである。第９の実施の形態に係る処理は、第８の実施の形態に係る処理を長時間の時系列データの範囲に拡張した処理であり、第８の実施の形態に係る処理による各時刻（区切られた各時刻範囲）での結果とアクティブ（有効）な部分を蓄積し、その全蓄積データを用いて各時刻毎（各時刻範囲毎）のアクティブ（有効）な部分のデータフローをハイライト表示する。例えば、各時刻毎（タイミング毎）に可視化を行い、変化点の判断等のデバッグが容易に可能となる。タイミングを色等で識別してもよいし、時間パラメータで切り替えて表示（アニメーション的に）してもよい。
【０１０４】
この第９の実施の形態におけるS260〜S299の処理は、基本的には第８の実施の形態におけるS210〜S249の処理と同様の処理であるが、長時間の時系列データに拡張した処理となっている。例えば、S268の処理では、時系列データに対して計算式を解釈し、遅延も考慮して解釈する。また、S277の処理では条件分岐前後の変数間の相関関係を各時刻に対してそれぞれ算出し、S278の処理で各時刻について優位差をそれぞれ判定し、S279の処理で各時刻での優位差から相関関係の高い変数の時刻範囲を設定する。S286〜S288の処理やS295〜S297の処理についても、同様である。そして、最終的には、各時刻毎にデータフロー上で有効な（アクティブな）ノード及びリンクをハイライトに設定し（S298）し、各時刻毎（各タイミング毎）にデータフロー上でアクティブな部分をＧＵＩ等により提示する。
【０１０５】
図５０には、第９の実施の形態に係る解析処理によるアクティブな部分のハイライト生成処理を適用した場合の表示例を示している。図５０は、第９の実施の形態に係るハイライト生成処理（データフロー）の適用例における解析結果である。この例は、第８の実施の形態で説明した適用例をある程度長い時間に適用した例である。この表示例では、右下に時刻を指定するスライドバーがあり、このスライドバーで示す時刻（時刻間）においてアクティブ部分のデータフローが表示される。例えば、時刻３秒付近では実線で示したノード（ｆｕｎｃＡ（）等）やリンクの部分がアクティブな部分としてハイライト表示され、時刻８秒付近では破線で示したノード（ｆｕｎｃＢ（）等）やリンクの部分がアクティブな部分としてハイライト表示される。さらに、ＧＵＩによるスライドバーに対する操作によって、この２つの間の時刻６秒付近でこのハイライト表示が切り替えられる。
【０１０６】
この第９の実施の形態によれば、長時間の時系列データに対して第１〜第８の実施の形態と同様の処理を行って、各時刻（各タイミング）でのアクティブな部分だけをハイライト表示したものを提示できる。このアクティブな部分をハイライト表示したデータフローにより、開発者は、デバッグ効率が向上するとともに、時系列でアクティブな部分を確認することができる。特に、時間経過に沿った変化点の判断等のデバッグが可能である。
【０１０７】
なお、本実施の形態に係るデバッグは、ＩＣＥ等の機器を用いずにデバッグが可能であり、実時間で実行できる。そのため、車両の制御プログラムのデバッグを行う場合、実車にホストパソコンを持ち込んで、ホストパソコンをターゲットのＥＣＵに接続し、実車でデバッグを行うことができる。
【０１０８】
以上、本発明に係る実施の形態について説明したが、本発明は上記実施の形態に限定されることなく様々な形態で実施される。
【０１０９】
例えば、本実施の形態では車両等の制御用のプログラムのデバッグに適用したが、他の様々なプログラムに適用できる。また、本実施の形態では制御プログラム開発環境の一例を示したが、他の様々な開発環境に適用できる。
【０１１０】
また、第９の実施の形態では第８の実施の形態を長時間範囲で適用して各タイミングでのアクティブ部分を強調表示するようにしたが、第１〜第７の実施の形態のうちのいずれかの実施の形態を長時間範囲で適用して各タイミングでのアクティブ部分を強調表示するようにしてもよい。
【符号の説明】
【０１１１】
１…制御プログラム開発環境、２…ホストパソコン、３…制御コンピュータ、４…制御対象。
【図１】
2014203120.tif 000003
【図２】
2014203120.tif 000004
【図４】
2014203120.tif 000005
【図５】
2014203120.tif 000006
【図６】
2014203120.tif 000007
【図７】
2014203120.tif 000008
【図８】
2014203120.tif 000009
【図９】
2014203120.tif 000010
【図１０】
2014203120.tif 000011
【図１４】
2014203120.tif 000012
【図１５】
2014203120.tif 000013
【図１７】
2014203120.tif 000014
【図１８】
2014203120.tif 000015
【図２１】
2014203120.tif 000016
【図２２】
2014203120.tif 000017
【図２４】
2014203120.tif 000018
【図２５】
2014203120.tif 000019
【図２６】
2014203120.tif 000020
【図２７】
2014203120.tif 000021
【図２９】
2014203120.tif 000022
【図３０】
2014203120.tif 000023
【図３３】
2014203120.tif 000024
【図３４】
2014203120.tif 000025
【図３７】
2014203120.tif 000026
【図３９】
2014203120.tif 000027
【図４３】
2014203120.tif 000028
【図４４】
2014203120.tif 000029
【図４８】
2014203120.tif 000030
【図４９】
2014203120.tif 000031
【図３】
2014203120.tif 000032
【図１１】
2014203120.tif 000033
【図１２】
2014203120.tif 000034
【図１３】
2014203120.tif 000035
【図１６】
2014203120.tif 000036
【図１９】
2014203120.tif 000037
【図２０】
2014203120.tif 000038
【図２３】
2014203120.tif 000039
【図２８】
2014203120.tif 000040
【図３１】
2014203120.tif 000041
【図３２】
2014203120.tif 000042
【図３５】
2014203120.tif 000043
【図３６】
2014203120.tif 000044
【図３８】
2014203120.tif 000045
【図４０】
2014203120.tif 000046
【図４１】
2014203120.tif 000047
【図４２】
2014203120.tif 000048
【図４５】
2014203120.tif 000049
【図４６】
2014203120.tif 000050
【図４７】
2014203120.tif 000051
【図５０】
2014203120.tif 000052