(57)【要約】【課題】マイクロコントローラに専用回路を設けることなくデバッグ効率を向上させることができるデバッグ装置を提供することである。【解決手段】本発明にかかるデバッグ装置は、デバッグ対象関数の分岐部を抽出する構造解析部１１と、抽出された分岐部に基づき走行ルート表を生成する走行ルート表生成部１２と、デバッグ対象関数の分岐部にカウンタを挿入したカウンタ関数および走行ルート表に対応した走行ルートプログラムを生成するプログラム生成部１３と、カウンタ関数および走行ルートプログラムをコンパイルするコンパイラ１４と、デバッグ対象関数の先頭にブレークポイントを設定すると共に、カウンタ関数の走行結果を取得するデバッガ制御部１５と、走行結果と走行ルート表に基づき走行ルートを解析する走行ルート解析部１６と、デバッグ対象関数の解析結果を表示する走行ルート表示部１７と、を備える。【選択図】図１
2011186806.tif 000002
【特許請求の範囲】
【請求項１】
ユーザプログラムに含まれるデバッグ対象関数を読み込み、当該デバッグ対象関数の構造解析を実施し分岐部を抽出する構造解析部と、
前記構造解析部で抽出された前記分岐部に基づき走行ルート表を生成する走行ルート表生成部と、
前記デバッグ対象関数の前記分岐部にカウンタを挿入したカウンタ関数および前記走行ルート表に対応した走行ルートプログラムを生成するプログラム生成部と、
前記プログラム生成部で生成された前記カウンタ関数および前記走行ルートプログラムをコンパイルするコンパイラと、
前記デバッグ対象関数の先頭にブレークポイントを設定すると共に、前記ユーザプログラムの実行中に前記ブレークポイントに到達した際に実行される前記カウンタ関数の走行結果を取得するデバッガ制御部と、
前記デバッガ制御部から取得した前記走行結果と前記走行ルート表に基づき走行ルートを解析する走行ルート解析部と、
前記デバッグ対象関数の解析結果を表示する走行ルート表示部と、を備えるデバッグ装置。
【請求項２】
前記デバッガ制御部は、マイクロコントローラの記憶装置に格納されている前記デバッグ対象関数の先頭に前記ブレークポイントを設定すると共に、前記コンパイル後の前記カウンタ関数および前記走行ルートプログラムを前記記憶装置の未使用領域に格納する、請求項１に記載のデバッグ装置。
【請求項３】
前記カウンタ関数の走行結果は、前記カウンタ関数の実行回数と走行ルート情報とを含み、前記走行ルート情報は前記カウンタ関数に挿入されたカウンタのカウント値と前記走行ルート表に対応した走行ルートプログラムとに基づき決定される、請求項１または２に記載のデバッグ装置。
【請求項４】
前記デバッグ対象関数は、第１のデバッグ対象関数と当該第１のデバッグ対象関数のサブプログラムである第２のデバッグ対象関数とを少なくとも含む、請求項１乃至３のいずれか一項に記載のデバッグ装置。
【請求項５】
前記カウンタ関数の走行結果は、更に前記カウンタ関数が実行されたタイミングに対応したタイムスタンプ情報を含む、請求項４に記載のデバッグ装置。
【請求項６】
前記走行ルート解析部は、前記走行結果と前記走行ルート表と前記タイムスタンプ情報とに基づき走行ルートを解析する、請求項５に記載のデバッグ装置。
【請求項７】
前記走行ルート表示部は前記解析結果として前記デバッグ対象関数のトレース情報およびカバレッジ情報の少なくとも１つを表示する、請求項１乃至６のいずれか一項に記載のデバッグ装置。
【請求項８】
ユーザプログラムに含まれるデバッグ対象関数を読み込み、当該デバッグ対象関数の構造解析を実施し分岐部を抽出し、
前記抽出された分岐部に基づき走行ルート表を生成し、
前記デバッグ対象関数の前記分岐部にカウンタを挿入したカウンタ関数および前記走行ルート表に対応した走行ルートプログラムを生成し、
前記カウンタ関数および前記走行ルートプログラムをコンパイルし、
前記デバッグ対象関数の先頭にブレークポイントを設定すると共に、前記ユーザプログラムの実行中に前記ブレークポイントに到達した際に実行される前記カウンタ関数の走行結果を取得し、
前記取得した走行結果と前記走行ルート表に基づき走行ルートを解析し、
前記デバッグ対象関数の解析結果を表示する、
デバッグ方法。
【請求項９】
マイクロコントローラの記憶装置に格納されている前記デバッグ対象関数の先頭に前記ブレークポイントを設定すると共に、前記コンパイル後の前記カウンタ関数および前記走行ルートプログラムを前記記憶装置の未使用領域に格納する、請求項８に記載のデバッグ方法。
【請求項１０】
前記カウンタ関数の走行結果は、前記カウンタ関数の実行回数と走行ルート情報とを含み、前記走行ルート情報は前記カウンタ関数に挿入されたカウンタのカウント値と前記走行ルート表に対応した走行ルートプログラムとに基づき決定される、請求項８または９に記載のデバッグ方法。
【請求項１１】
前記デバッグ対象関数は、第１のデバッグ対象関数と当該第１のデバッグ対象関数のサブプログラムである第２のデバッグ対象関数とを少なくとも含む、請求項８乃至１０のいずれか一項に記載のデバッグ方法。
【請求項１２】
前記カウンタ関数の走行結果は、更に前記カウンタ関数が実行されたタイミングに対応したタイムスタンプ情報を含む、請求項１１に記載のデバッグ方法。
【請求項１３】
前記走行結果と前記走行ルート表と前記タイムスタンプ情報とに基づき走行ルートを解析する、請求項１２に記載のデバッグ方法。
【請求項１４】
前記解析結果として前記デバッグ対象関数のトレース情報およびカバレッジ情報の少なくとも１つを表示する、請求項８乃至１３のいずれか一項に記載のデバッグ方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はデバッグ装置およびデバッグ方法に関し、特にソフトウェアトレース機能を実現することができるデバッグ装置およびデバッグ方法に関する。
【背景技術】
【０００２】
近年、マイクロコントローラ（以下、マイコンともいう）にデバッグ機能を内蔵したオンチップデバッグと呼ばれるプログラムデバッグ方式が主流となってきている。
【０００３】
特許文献１にはソフトウェアデバッグの効率を向上させるプログラム処理装置に関する技術が開示されている。図１９は特許文献１にかかるプログラム処理装置を示すブロック図である。図１９に示すプログラム処理装置は、プログラム処理装置としての制御ＬＳＩ（１１２）、デバッグ装置としてのパーソナルコンピュータ１１３を備える。制御ＬＳＩ（１１２）は、ＣＰＵコア１２１、バックトレース回路１２２、デバッグＩ／Ｆ（１２３）、外部バスＩ／Ｆ（１２４）、内部ＲＡＭ（１２５）を備える。ＣＰＵコア（１２１）はステートマシーン１３１とプログラムカウンタ１３２を備える。外部バスＩ／Ｆ（１２４）には外部バス１２９を介してプログラムメモリ１３０が接続されている。プログラムメモリ１３０にはデバッグ対象となるファームウェアがＣＰＵコア１２１にて実行可能な形態で格納されている。
【０００４】
図１９に示すプログラム処理装置において、バックトレース回路１２２は、プログラムを実行するＣＰＵコア１２１の内部バス１２６を監視して、プログラム内の予め指定された分岐命令をモニタする。そして、プログラムに分岐が発生する場合にその分岐元アドレス値を内部バス１２６を通じてプログラムカウンタ１３２より取得し、分岐発生順に内部レジスタに記憶する。デバッグツール１１４は、内部レジスタに保持されている分岐元アドレス値をＣＰＵコア１２１からデバッグＩ／Ｆ１２３を介して受け取り、該アドレス値に基づいてプログラムの実行経路を算出する。
【０００５】
特許文献１に示す方式では、マイコンそのものによるデバッグ処理のため等価性が高く、高速エミュレーションが可能であるという利点がある。しかし、この方式では内蔵のデバッグ回路がチップコストを圧迫するという欠点がある。
【０００６】
高機能なマイコンではチップ全体の面積に対するデバッグ回路の占める割合が少ないため、専用のトレース回路を内蔵し、フルまたは分岐トレース機能を実現してもチップコストへの影響は少ない。しかし、回路規模が小さくデバッグ回路を入れることでコスト的に大きな影響が出るマイコンでは価格を抑えるために専用のトレース回路を内蔵しないことがある。専用回路なしでトレース機能を実現しようとした場合、例えば次のような方法がある。
【０００７】
図２０は背景技術にかかるマイコンのデバッグ方式の一例を説明するための図である。図２０に示すように、背景技術にかかるデバッグ方式では、プログラム中にデバッグ用の表示機能やトレース機能を設定してデバッグを行うために、例えばＣ言語によるプログラムにおいてｐｒｉｎｔｆ文やトレース関数を挿入している。図２０に示すｍａｉｎ（）関数の場合、プログラム２０１にｐｒｉｎｔｆ文で示す表示機能やｔｒａｃｅ（）で示すトレース機能（２０３、２０４）を挿入したプログラム２０２を用意し、かつ別途トレース機能を持つ関数ｔｒａｃｅ（）を用意する。そして、デバッグが終了したら挿入したデバッグ用の表示機能やトレース機能（２０３、２０４）をプログラム中から削除する。
【０００８】
また、特許文献２にはタイマー割り込みを利用することにより、プログラムをトレース実行させる技術が開示されている。図２１は特許文献２にかかる技術を説明するための図である。図２１において、マイクロコンピュータは、カウンタスタート命令３４１、復帰命令３４２、第１命令３４３、および第２命令３４４を有する。カウンタスタート命令３４１と復帰命令３４２はモニタ側の命令であり、第１命令３４３と第２命令３４４はユーザプログラム側の命令である。モニタはタイマー割り込みのカウント値を、第１命令３４３の実行中にタイマー割り込み要求が発生するように設定する。すると割り込み要求信号３４５は第１命令３４３の実行中にイネーブル状態になり、実際の割り込み発生信号３４６は第１命令３４３の実行が終了するのを待ってイネーブル状態となる。これにより、プログラムをトレース実行させることができる。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２００５−７０９５１号公報
【特許文献２】特開２００４−１３８８０号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
図２０で説明した背景技術のように、プログラム中にデバッグ用の表示機能やトレース機能を設定することで、マイコンに専用回路を設けることなくトレース機能を実現することができる。しかしながら、図２０にかかる背景技術では、プログラム中にデバッグ用の表示機能やトレース機能を設定するためにソースコードを編集する必要がある。また、デバッグが終了したら挿入したデバッグ用の表示機能やトレース機能をプログラム中から削除する必要がある。このため、デバッグ作業が繁雑になるという問題がある。
【００１１】
また、図２１に示した特許文献２にかかる技術では、タイマー割り込みを利用することによりプログラムをトレース実行させることが可能となる。しかしながら、特許文献２にかかる技術では１命令毎にタイマー割り込みを発生させるためユーザプログラム命令の停止が頻発する。このため、ユーザプログラム実行のリアルタイム性が大幅にそこなわれるという問題がある。
【課題を解決するための手段】
【００１２】
本発明にかかるデバッグ装置は、ユーザプログラムに含まれるデバッグ対象関数を読み込み、当該デバッグ対象関数の構造解析を実施し分岐部を抽出する構造解析部と、前記構造解析部で抽出された前記分岐部に基づき走行ルート表を生成する走行ルート表生成部と、前記デバッグ対象関数の前記分岐部にカウンタを挿入したカウンタ関数および前記走行ルート表に対応した走行ルートプログラムを生成するプログラム生成部と、前記プログラム生成部で生成された前記カウンタ関数および前記走行ルートプログラムをコンパイルするコンパイラと、前記デバッグ対象関数の先頭にブレークポイントを設定すると共に、前記ユーザプログラムの実行中に前記ブレークポイントに到達した際に実行される前記カウンタ関数の走行結果を取得するデバッガ制御部と、前記デバッガ制御部から取得した前記走行結果と前記走行ルート表に基づき走行ルートを解析する走行ルート解析部と、前記デバッグ対象関数の解析結果を表示する走行ルート表示部と、を備える。
【００１３】
本発明にかかるデバッグ装置では、デバッグ対象関数の分岐部にカウンタを挿入し、このカウンタのカウンタ値を用いてデバッグ対象関数の分岐トレースデータを取得しているため、マイクロコントローラに専用回路を設ける必要がない。また、本発明にかかるデバッグ装置では、デバッグ対象関数の前にブレークポイントを設定し、このブレークポイントに到達するとユーザプログラムの実行を中断してカウンタ関数に移動し、このカウンタ関数において分岐トレースのデータを取得している。よって、高速に分岐トレースを実行することができる。よって、本発明にかかるデバッグ装置により、マイクロコントローラに専用回路を設けることなくデバッグ効率を向上させることができる。
【００１４】
本発明にかかるデバッグ方法は、ユーザプログラムに含まれるデバッグ対象関数を読み込み、当該デバッグ対象関数の構造解析を実施し分岐部を抽出し、前記抽出された分岐部に基づき走行ルート表を生成し、前記デバッグ対象関数の前記分岐部にカウンタを挿入したカウンタ関数および前記走行ルート表に対応した走行ルートプログラムを生成し、前記カウンタ関数および前記走行ルートプログラムをコンパイルし、前記デバッグ対象関数の先頭にブレークポイントを設定すると共に、前記ユーザプログラムの実行中に前記ブレークポイントに到達した際に実行される前記カウンタ関数の走行結果を取得し、前記取得した走行結果と前記走行ルート表に基づき走行ルートを解析し、前記デバッグ対象関数の解析結果を表示する。
【００１５】
本発明にかかるデバッグ方法では、デバッグ対象関数の分岐部にカウンタを挿入し、このカウンタのカウンタ値を用いてデバッグ対象関数の分岐トレースデータを取得しているため、マイクロコントローラに専用回路を設ける必要がない。また、本発明にかかるデバッグ方法では、デバッグ対象関数の前にブレークポイントを設定し、このブレークポイントに到達するとユーザプログラムの実行を中断してカウンタ関数に移動し、このカウンタ関数において分岐トレースのデータを取得している。よって、高速に分岐トレースを実行することができる。よって、本発明にかかるデバッグ方法により、マイクロコントローラに専用回路を設けることなくデバッグ効率を向上させることができる。
【発明の効果】
【００１６】
本発明にかかるデバッグ装置およびデバッグ方法により、マイクロコントローラに専用回路を設けることなくデバッグ効率を向上させることができる。
【図面の簡単な説明】
【００１７】
【図１】実施の形態１にかかるデバッグ装置を示すブロック図である。
【図２】実施の形態１にかかるデバッグ装置を示すブロック図である。
【図３】実施の形態１にかかるデバッグ装置のデバッガＧＵＩの一例を示す図である。
【図４】実施の形態１にかかるデバッグ装置の構造解析部の解析結果の一例を示す図である。
【図５】実施の形態１にかかるデバッグ装置の走行ルート表生成部が生成した走行ルート表の一例である。
【図６】実施の形態１にかかるデバッグ装置のプログラム生成部が作成したプログラムの一例を示す図である。
【図７】実施の形態１にかかるデバッグ装置がフラッシュＲＯＭに格納したオブジェクトモジュールおよびデバッガ制御部が設定したブレークポイントを示す図である。
【図８】実施の形態１にかかるデバッグ装置のオブジェクトモジュールの動作を説明するための図である。
【図９】実施の形態１にかかるデバッグ装置の走行結果の一例を示す表である。
【図１０】実施の形態１にかかるデバッグ装置の走行ルート表示部が表示するソースプログラムの解析結果の一例である。
【図１１】実施の形態２にかかるデバッグ装置の処理対象となるデバッグ対象関数の一例である。
【図１２】実施の形態２にかかるデバッグ装置の構造解析部の解析結果の一例を示す図である。（ａ）は、第１のデバッグ対象関数の解析結果であり、（ｂ）は第２のデバッグ対象関数の解析結果である。
【図１３】実施の形態２にかかるデバッグ装置の走行ルート表生成部が生成した走行ルート表の一例である。（ａ）は、第１のデバッグ対象関数の走行ルート表であり、（ｂ）は第２のデバッグ対象関数の走行ルート表である。
【図１４】実施の形態２にかかるデバッグ装置のプログラム生成部が作成したプログラムの一例を示す図である。
【図１５】実施の形態２にかかるデバッグ装置がフラッシュＲＯＭに格納したオブジェクトモジュールおよびデバッガ制御部が設定したブレークポイントを示す図である。
【図１６】実施の形態２にかかるデバッグ装置のコンパイラが生成したオブジェクトモジュールの動作を説明するための図である。
【図１７】実施の形態２にかかるデバッグ装置の走行結果の一例を示す表である。（ａ）は、第１のデバッグ対象関数の走行結果であり、（ｂ）は第２のデバッグ対象関数の走行結果である。
【図１８】実施の形態２にかかるデバッグ装置の走行ルート表示部が表示するソースプログラムの解析結果の一例である。
【図１９】特許文献１にかかるプログラム処理装置を示すブロック図である。
【図２０】背景技術にかかるマイコンのデバッグ方式の一例を説明するための図である。
【図２１】特許文献２にかかるデバッグ方法を説明するための図である。
【発明を実施するための形態】
【００１８】
実施の形態１
以下、図面を参照して本発明の実施の形態について説明する。
図１は本実施の形態にかかるデバッグ装置を示すブロック図である。本実施の形態にかかるデバッグ装置１は、デバッグ対象であるマイクロコントローラ３とエミュレータ２を介して接続されている。エミュレータ２は、デバッグ装置１からの命令に応答してマイクロコントローラ３との間でデータの送受信を行う。
【００１９】
本実施の形態にかかるデバッグ装置１は、構造解析部１１と、走行ルート表生成部１２と、プログラム生成部１３と、コンパイラ１４と、デバッガ制御部１５と、走行ルート解析部１６と、走行ルート表示部１７と、を備える。本実施の形態にかかるデバッグ装置１は、これらを備えるホストマシンであり、例えばパーソナルコンピュータ等である。また、図１に示すデバッグ対象となるマイクロコントローラ３は、デバッグＩ／Ｆ（４）、フラッシュＲＯＭ（記憶装置）５、ＣＰＵコア６、ＲＡＭ（７）、周辺機能８を備える。
【００２０】
デバッグＩ／Ｆ（４）はエミュレータ２およびＣＰＵコア６との間に設けられており、エミュレータ２とＣＰＵコア６との間のデータの送受信を制御する。フラッシュＲＯＭ（５）にはデバッグ（分岐トレース）の対象となるユーザプログラムが格納されている。また、フラッシュＲＯＭ（５）には後述するコンパイラ１４が生成したオブジェクトモジュール５１を格納するための未使用領域が設けられている。また、マイクロコントローラ３は一時的にデータを格納するＲＡＭ（７）、外部装置と接続するための周辺機能８を備える。ＣＰＵコア６、フラッシュＲＯＭ（５）、ＲＡＭ（７）、および周辺機能８はバスを介して接続されている。
【００２１】
次に、デバッグ装置１について説明する。図２は本実施の形態にかかるデバッグ装置１を説明するための図である。本実施の形態にかかるデバッグ装置１は、例えばデバッグＧＵＩ（Graphical User Interface）（１０）を用いてデバッグの対象となる関数、つまり分岐トレースを実施したい関数を選択し、デバッグ対象関数のファイル名、関数名などの情報を構造解析部１１に渡す。図３は、デバッガＧＵＩ（１０）の一例を示す図である。図３に示すデバッガＧＵＩ（１０）では、デバッグ対象の関数４１を表示し分岐トレースを実施するか否かを、選択ツール４２を用いてユーザが選択可能な構成としている。なお、図３に示すデバッガＧＵＩ（１０）は一例であり、ユーザがデバッグ対象となる関数を特定し、当該関数の情報を構造解析部１１に渡すことができる機能を有するものであればどのようなものでもよい。
【００２２】
以降、本実施の形態では、例としてデバッグ装置１が図３に示すデバッグ対象関数４１をデバッグする場合について説明する。
【００２３】
構造解析部１１は、デバッガＧＵＩ（１０）からデバッグ対象関数４１の情報を入力し、この情報に基づきデバッグ対象関数４１のソースファイル９を読み込む。ソースファイル９は、フラッシュＲＯＭ（５）に格納されているユーザプログラムと同一であり、例えばデバッグ装置１のハードディスク等に予め格納されている。ここで、フラッシュＲＯＭ（５）に格納されているユーザプログラムはコンパイル後のユーザプログラムである。そして、構造解析部１１は、デバッグ対象関数４１のソースファイル９の構造解析を実施し分岐部を抽出する。図４は構造解析部１１がデバッグ対象関数４１の構造解析を実施した際に作成したフローチャートの一例である。図４に示すフローチャートは分岐部３１〜３６を備えており、構造解析部１１はこの分岐部３１〜３６を抽出している。
【００２４】
走行ルート表生成部１２は、構造解析部１１で抽出された分岐部３１〜３６に基づき走行ルート表を生成する。図５（ａ）、（ｂ）は構造解析部１１で抽出された分岐部３１〜３６に基づき生成された走行ルート表４３の一例であり、図５（ａ）に示す"○"は実行される場合、"×"は実行されない場合を示している。また、図５（ｂ）に示す"１"は実行される場合、"０"は実行されない場合を示している。なお、図５（ａ）、（ｂ）に示す走行ルート表４３は表記方法が異なるのみで、実質的には同一である。
【００２５】
図５（ａ）、（ｂ）に示す表において、ルートＡは図４に示すフローチャートの分岐部３１および分岐部３６を通るルートである。また、ルートＢは図４に示すフローチャートの分岐部３１、分岐部３２、および分岐部３３を通るルートである。また、ルートＣは図４に示すフローチャートの分岐部３１、分岐部３２、および分岐部３４を通るルートである。また、ルートＤは図４に示すフローチャートの分岐部３１、分岐部３２、および分岐部３５を通るルートである。このようにして生成された走行ルート表４３はデバッグ装置１のハードディスクやＲＡＭ等の記憶装置に保存される。
【００２６】
プログラム生成部１３は、デバッグ対象関数４１の分岐部３１〜３６にカウンタを挿入したカウンタ関数４４と走行ルート表４３に対応した走行ルートプログラム４５を生成する。図６は、プログラム生成部１３が作成したプログラムの一例を示す図である。図６に示すように、プログラム生成部１３は、デバッグ対象プログラム４１の各分岐部にカウンタ４４_１〜４４_６を挿入してカウンタ関数４４を生成する。このとき、プログラム生成部１３は走行ルート表４３に基づく走行ルートプログラム４５も生成する。カウンタ関数４４および走行ルートプログラム４５はプログラム生成部１３において自動的に生成される。
【００２７】
図６に示すカウンタ関数４４において、カウンタ４４_１は図４のフローチャートの分岐部３１に対応し、カウンタ４４_２は分岐部３２に対応し、カウンタ４４_３は分岐部３３に対応し、カウンタ４４_４は分岐部３４に対応し、カウンタ４４_５は分岐部３５に対応し、カウンタ４４_６は分岐部３６に対応する。
【００２８】
また、走行ルート表４３のルートＡは、分岐部３１において"１"、分岐部３２〜３５において"０"、分岐部３６において"１"となるので、走行ルートプログラム４５のルートＡは例えば｛１，０，０，０，０，１｝と記述することができる。同様に、ルートＢは｛１，１，１，０，０，０｝、ルートＣは｛１，１，０，１，０，０｝、ルートＤは｛１，１，０，０，１，０｝と記述することができる。このようにして、走行ルート表４３に基づき走行ルートプログラム４５が生成される。
【００２９】
コンパイラ１４は、プログラム生成部１３で生成されたプログラムであるカウンタ関数４４と走行ルートプログラム４５をコンパイルし、マイクロコントローラ３が実行可能なオブジェクトモジュール５１を作成する。作成されたオブジェクトモジュール５１は、デバッガ制御部１５により、マイクロコントローラ３のフラッシュＲＯＭ（５）に格納される。このとき、既にフラッシュＲＯＭ（５）に書き込まれているユーザプログラムを書き換えないように、作成されたオブジェクトモジュール５１はフラッシュＲＯＭ（５）の未使用領域に格納される。
【００３０】
また、デバッガ制御部１５は分岐トレースを実施するデバッグ対象関数４１の先頭にブレークポイント５３を設定する。デバッグ対象関数４１の先頭にブレークポイント５３を設定することで、デバッグ対象関数４１が呼び出された際に、オブジェクトモジュール５１に移動することができる。
【００３１】
図７は上記処理が終了した後のフラッシュＲＯＭ（５）の状態を説明するための図である。図７に示すように、オブジェクトモジュール５１であるコンパイル後のカウンタ関数５５、走行ルートプログラム５６、およびモニターコード５７はフラッシュＲＯＭ（５）の未使用領域に格納されている。また、ユーザプログラムの一つであるデバッグ対象関数４１の先頭にはブレークポイント５３が設定されている。ここで、図７に示すカウンタ関数５５はコンパイル前のカウンタ関数４４に対応し、走行ルートプログラム５６はコンパイル前の走行ルートプログラム４５に対応する。
【００３２】
マイクロコントローラ３はフラッシュＲＯＭ（５）に格納されているユーザプログラムおよびオブジェクトモジュールを実行する。図８はマイクロコントローラ３がフラッシュＲＯＭ（５）に格納されているユーザプログラムを実行した場合の動作を示す図である。図８に示すように、マイクロコントローラ３がユーザプログラムを実行しブレークポイント５３に到達すると、つまりデバッグ対象関数４１が呼び出されると、モニターコード５７に移動する（ステップＳ６１）。モニターコード５７はデバッグ対象関数４１から移動してきたと判断し、カウンタ関数５５をコールする（ステップＳ６２）。
【００３３】
カウンタ関数５５が実行されると、カウンタ関数５５に挿入された各カウンタ（第１乃至第６のカウンタ）４４_１〜４４_６から、走行ルートに応じたカウンタ値（第１乃至第６のカウンタ値）が出力される。このとき出力されるカウンタ値を図９の１回目に示す。そして、カウンタ関数５５の実行後、再びモニターコード５７へ移動する（ステップＳ６３）。このとき、モニターコード５７は集計プログラムを起動する。集計プログラムは、第１乃至第６のカウンタ４４_１〜４４_６から出力された第１乃至第６のカウンタ値（カウンタ増加値）とオブジェクトモジュール５１が備える走行ルートプログラム５６とに基づき、カウンタ関数５５が実行された際の走行ルートを解析する。
【００３４】
図９に示す例では、１回目の第１カウンタの値が"１"、第２カウンタの値が"０"、第３カウンタの値が"０"、第４カウンタの値が"０"、第５カウンタの値が"０"、第６カウンタの値が"１"であることから、走行ルートはルートＡであることがわかる。このとき、走行ルートプログラム５６は図５（ｂ）に示した走行ルート表４３および図６に示した走行ルートプログラム４５に対応している。走行ルート解析後、解析結果（走行ルートＡ）と、カウンタ関数５５の実行回数（１回目）を保存し、デバッグ対象関数４１を呼び出したユーザプログラムへ戻る（ステップＳ６４）。
【００３５】
さらにユーザプログラムが実行され、再びブレークポイント５３に到達すると、再びモニターコード５７に移動する（ステップＳ６１）。モニターコード５７はデバッグ対象関数４１から移動してきたと判断し、再びカウンタ関数５５をコールする（ステップＳ６２）。カウンタ関数５５が実行されると、カウンタ関数５５に挿入された各カウンタ（第１乃至第６のカウンタ）４４_１〜４４_６から、走行ルートに応じたカウンタ値（第１乃至第６のカウンタ値）が出力される。
【００３６】
このとき出力されるカウンタ値を図９の２回目に示す。この場合、カウンタ値は１回目のカウンタ値がインクリメントされた値となる。そして、カウンタ関数５５の実行後、再びモニターコード５７へ移動する（ステップＳ６３）。このとき、モニターコード５７は集計プログラムを起動する。集計プログラムは、第１乃至第６のカウンタ４４_１〜４４_６から出力された第１乃至第６のカウンタ値（カウンタ増加値）とオブジェクトモジュール５１が備える走行ルートプログラム５６とに基づき、カウンタ関数５５が実行された際の走行ルートを解析する。
【００３７】
図９に示す例では、２回目の第１カウンタの値が"２"、第２カウンタの値が"１"、第３カウンタの値が"１"、第４カウンタの値が"０"、第５カウンタの値が"０"、第６カウンタの値が"１"である。よって、カウンタ増加値は、第１カウンタの値が"１"、第２カウンタの値が"１"、第３カウンタの値が"１"、第４カウンタの値が"０"、第５カウンタの値が"０"、第６カウンタの値が"０"であることから、走行ルートはルートＢであることがわかる。走行ルート解析後、解析結果（走行ルートＢ）と、カウンタ関数５５の実行回数（２回目）を保存し、デバッグ対象関数４１を呼び出したユーザプログラムへ戻る（ステップＳ６４）。
【００３８】
このような動作を繰り返し、例えばデバッグ対象関数４１の呼び出し回数が設定値に到達した場合、マイクロコントローラ３はユーザプログラムおよびオブジェクトモジュールの実行を停止する。なお、ユーザプログラムは設定値に到達した場合以外にも他の要因で停止することも可能である。
【００３９】
デバッガ制御部１５は、マイクロコントローラ３で実行されたユーザプログラムおよびオブジェクトモジュールの走行結果を取得する。走行結果４７は、例えば図９に示すような、カウンタ関数５５が実行された回数とこれに対応する走行ルートを含むデータである。
【００４０】
そして、走行ルート解析部１６はデバッガ制御部１５から取得した走行結果４７と走行ルート表４３とに基づき走行ルートを解析する。例えば、デバッグ対象関数の２回目のトレース情報を解析する場合、走行ルート解析部１６は走行結果４７から２回目の走行ルート情報として走行ルートＢを取得する。そして、走行ルート解析部１６は更に走行ルートＢの分岐情報を走行ルート表４３から取得する。このようにすることで、走行ルート解析部１６はデバッグ対象関数の２回目の走行ルートの分岐情報を取得することができる。なお、走行ルートの解析はこのような解析に限定されることはなく、走行結果４７と走行ルート表４３とに基づく解析であればどのような解析であってもよい。
【００４１】
また、走行ルート表示部１７は、ソースファイル９に含まれるデバッグ対象関数と走行ルート解析部１６の解析結果からデバッグ対象関数の解析結果を表示する。ここでデバッグ対象関数の解析結果とは、例えばトレース情報やカバレッジ情報である。図１０は、走行ルート表示部１７が表示するソースプログラム（デバッグ対象関数）の解析結果の一例である。図１０は、例えばデバッグ対象関数４１の２回目の走行ルートのトレース情報４８を示しており、図１０に示すように２回目の走行ルートは１行目、３行目、５行目、７〜９行目、２２行目となる。
【００４２】
以上で説明したように、本実施の形態にかかるデバッグ装置では、デバッグ対象関数の分岐部にカウンタを挿入し、このカウンタのカウンタ値を用いてデバッグ対象関数の分岐トレースデータを取得しているため、マイクロコントローラに専用回路を設ける必要がない。また、本実施の形態にかかるデバッグ装置では、デバッグ対象関数の前にブレークポイントを設定し、このブレークポイントに到達するとユーザプログラムの実行を中断してオブジェクトモジュールに移動し、このオブジェクトモジュールにおいて分岐トレースのデータを取得している。よって、高速に分岐トレースを実行することができる。
【００４３】
また、本実施の形態にかかるデバッグ装置ではプログラム生成部が自動的にユーザプログラムにカウンタを挿入するため、ユーザが誤ってオリジナルのユーザプログラムを編集することを防ぐことができる。また、カウンタが挿入されたカウンタ関数をフラッシュＲＯＭの未使用領域に格納することで、デバッグ対象であるユーザプログラムに近い環境でデバッグが可能となる。また、本実施の形態にかかるデバッグ装置を用いることで、取得したデータから関数内部のカバレッジ情報を取得することが可能となり、より実行頻度の多いコード部分を関数の先頭に移動することでプログラムの実行速度を向上することができる。
【００４４】
よって、本発明にかかるデバッグ装置およびデバッグ方法により、マイクロコントローラに専用回路を設けることなくデバッグ効率を向上させることができる。
【００４５】
実施の形態２
次に、本発明の実施の形態２について説明する。図１１は本実施の形態にかかるデバッグ装置のデバッグ対象関数を示す図である。図１１に示すように、本実施の形態のデバッグ対象関数は、第１のデバッグ対象関数７１と、第１のデバッグ対象関数７１と親子関係にあるサブプログラムである第２のデバッグ対象関数７２とで構成される。なお、本実施の形態で用いられるデバッグ装置の基本的な構成は実施の形態１で説明したデバッグ装置と同様であるので、重複した説明は省略する。
【００４６】
図１１に示す第１および第２のデバッグ対象関数７１、７２のデバッグ処理をする際、本実施の形態にかかるデバッグ装置１は、例えばデバッグＧＵＩ（Graphical User Interface）（１０）を用いてデバッグの対象となる関数、つまり分岐トレースを実施したい関数を選択し、デバッグ対象関数のファイル名、関数名などの情報を構造解析部１１に渡す。本実施の形態においても例えば図３に示すようなデバッガＧＵＩ（１０）を用いることができる。なお、デバッガＧＵＩ（１０）は、ユーザがデバッグ対象となる関数を特定し、当該関数の情報を構造解析部１１に渡すことができる機能を有するものであればどのようなものでもよい。
【００４７】
構造解析部１１は、デバッガＧＵＩ（１０）から第１および第２のデバッグ対象関数７１、７２の情報を入力し、この情報に基づき第１および第２のデバッグ対象関数７１、７２のソースファイル９を読み込む。そして、構造解析部１１は、第１および第２のデバッグ対象関数７１、７２のソースファイル９の構造解析を実施し分岐部を抽出する。図１２は構造解析部１１が第１および第２のデバッグ対象関数７１、７２の構造解析を実施した際に作成したフローチャートの一例である。図１２（ａ）は第１のデバッグ対象関数７１の構造解析結果（図４と同様）を示し、図１２（ｂ）は第２のデバッグ対象関数７２の構造解析結果を示す。図１２（ａ）に示すフローチャートは分岐部３１〜３６を備えており、構造解析部１１はこの分岐部３１〜３６を抽出している。また、図１２（ｂ）に示すフローチャートは分岐部３７〜３９を備えており、構造解析部１１はこの分岐部３７〜３９を抽出している。
【００４８】
走行ルート表生成部１２は、構造解析部１１で抽出された分岐部３１〜３９に基づき走行ルート表７３、７４を生成する。図１３（ａ）は構造解析部１１で抽出された分岐部３１〜３６に基づき生成された第１の走行ルート表７３の一例であり、図１３（ｂ）は構造解析部１１で抽出された分岐部３７〜３９に基づき生成された第２の走行ルート表７４の一例である。図１３（ｂ）に示す表において、ルートＥは図１２（ｂ）に示すフローチャートの分岐部３７および分岐部３８を通るルートである。また、ルートＦは図１２（ｂ）に示すフローチャートの分岐部３７、分岐部３９を通るルートである。このようにして生成された第１および第２の走行ルート表７３、７４はデバッグ装置１のハードディスクやＲＡＭ等の記憶装置に保存される。
【００４９】
プログラム生成部１３は、第１および第２のデバッグ対象関数７１、７２の分岐部３１〜３９にカウンタを挿入した第１および第２のカウンタ関数７５、７６と、第１および第２の走行ルート表７３、７４に対応した走行ルートプログラムを生成する。図１４は、プログラム生成部１３が作成したプログラムの一例を示す図である。図１４に示すように、プログラム生成部１３は、第１のデバッグ対象プログラム７１の各分岐部にカウンタ７５_１〜７５_６を挿入して第１のカウンタ関数７５を生成する。また、プログラム生成部１３は、第２のデバッグ対象プログラム７２の各分岐部にカウンタ７６_１〜７６_３を挿入して第２のカウンタ関数７６を生成する。このとき、プログラム生成部１３は第１および第２の走行ルート表７３、７４に基づく走行ルートプログラムも生成する。第１および第２のカウンタ関数７５、７６および走行ルートプログラムはプログラム生成部１３において自動的に生成される。
【００５０】
コンパイラ１４は、プログラム生成部１３で生成されたプログラムである第１および第２のカウンタ関数７５、７６と走行ルートプログラムをコンパイルし、マイクロコントローラ３が実行可能なオブジェクトモジュール５２を作成する。作成されたオブジェクトモジュール５２は、デバッガ制御部１５により、マイクロコントローラ３のフラッシュＲＯＭ（５）に格納される。このとき、既にフラッシュＲＯＭ（５）に書き込まれているユーザプログラムを書き換えないように、作成されたオブジェクトモジュール５２はフラッシュＲＯＭ（５）の未使用領域に格納される。
【００５１】
また、デバッガ制御部１５は分岐トレースを実施する第１および第２のデバッグ対象関数７１、７２の先頭にブレークポイント７９_１、７９_２を設定する。第１および第２のデバッグ対象関数７１、７２の先頭にブレークポイント７９_１、７９_２を設定することで、第１および第２のデバッグ対象関数７１、７２のそれぞれが呼び出された際に、オブジェクトモジュール５２に移動することができる。
【００５２】
図１５は上記処理が終了した後のフラッシュＲＯＭ（５）の状態を説明するための図である。図１５に示すように、オブジェクトモジュール５２であるコンパイル後の第１および第２のカウンタ関数７５、７６、走行ルートプログラム７７、およびモニターコード７８はフラッシュＲＯＭ（５）の未使用領域に格納されている。また、ユーザプログラムの一部である第１および第２のデバッグ対象関数７１、７２の先頭にはブレークポイント７９_１、７９_２が設定されている。
【００５３】
マイクロコントローラ３はフラッシュＲＯＭ（５）に格納されているユーザプログラムおよびオブジェクトモジュールを実行する。図１６はマイクロコントローラ３がフラッシュＲＯＭ（５）に格納されているユーザプログラムを実行した場合の動作を示す図である。なお、本実施の形態では、第１のデバッグ対象関数７１がサブプログラムである第２のデバッグ対象関数７２を呼び出す際の動作を説明するために、２回目の動作について説明する。ここで、１回目の動作は実施の形態１で説明した動作（図８参照）と同様である。
【００５４】
図１６に示すように、マイクロコントローラ３がユーザプログラムを実行しブレークポイント７９_１に到達すると、つまり第１のデバッグ対象関数７１が呼び出されると、モニターコード７８に移動する（ステップＳ８１）。モニターコード７８は第１のデバッグ対象関数７１から移動してきたと判断し、第１のカウンタ関数７５をコールする（ステップＳ８２）。
【００５５】
第１のカウンタ関数７５が実行されると、第１のカウンタ関数７５に挿入された各カウンタ（第１乃至第６のカウンタ）７５_１〜７５_６から、走行ルートに応じたカウンタ値（第１乃至第６のカウンタ値）が出力される。このとき出力されるカウンタ値を図１７（ａ）に示す表の２回目に示す。
【００５６】
また、本実施の形態では第１のデバッグ対象関数７１のサブプログラムである第２のデバッグ対象関数７２があるので、図１６に示すように第１のカウンタ関数７５が実行されている途中で第２のデバッグ対象関数７２が呼び出される（ステップＳ８３）。このとき、第２のデバッグ対象関数７２の先頭にはブレークポイント７９_２が設けられているので、モニターコード７８へ移動する（ステップＳ８４）。モニターコード７８は第２のデバッグ対象関数７２から移動してきたと判断し、第２のカウンタ関数７６をコールする（ステップＳ８５）。
【００５７】
第２のカウンタ関数７６が実行されると、第２のカウンタ関数７６に挿入された各カウンタ（第７乃至第９のカウンタ）７６_１〜７６_３から、走行ルートに応じたカウンタ値（第７乃至第９のカウンタ値）が出力される。このとき出力されるカウンタ値を図１７（ｂ）に示す表の１回目に示す。
【００５８】
そして、第２のカウンタ関数７６の実行後、再びモニターコード７８へ移動する（ステップＳ８６）。このとき、モニターコード７８は集計プログラムを起動する。集計プログラムは、第７乃至第９のカウンタ７６_１〜７６_３から出力された第７乃至第９のカウンタ値（カウンタ増加値）とオブジェクトモジュール５１が備える走行ルートプログラム７７とに基づき、第２のカウンタ関数７６が実行された際の走行ルートを解析する。走行ルート解析後、解析結果（ルートＦ）と、第２のカウンタ関数７６の実行回数（１回目）を保存する。
【００５９】
また、本実施の形態では第２のカウンタ関数７６が実行されたタイミングに対応したタイムスタンプ情報も保存する。１回目のタイムスタンプ情報は"２２"であるので、この情報を保存する（図１７（ｂ）の表の１回目に示す）。このタイムスタンプ情報は、例えばマイクロコントローラ３が内蔵しているタイマーを用いて得ることができる。また、タイムスタンプ情報は、例えば実行するカウンタ関数が呼び出されたタイミングの時間情報とすることができる。
【００６０】
その後、第２のデバッグ対象関数７２を呼び出した第１のカウンタ関数７５の、第２のデバッグ対象関数７２を呼び出した命令の直後へ移動する（ステップＳ８７）。
【００６１】
そして、第１のカウンタ関数７５の実行後、再びモニターコード７８へ移動する（ステップＳ８８）。このとき、モニターコード７８は集計プログラムを起動する。集計プログラムは、第１乃至第６のカウンタ７５_１〜７５_６から出力された第１乃至第６のカウンタ値（カウンタ増加値）とオブジェクトモジュール５１が備える走行ルートプログラム７７とに基づき、第１のカウンタ関数７５が実行された際の走行ルートを解析する（走行ルートの解析は実施の形態１と同様である）。
【００６２】
走行ルート解析後、解析結果（ルートＢ）と、第１のカウンタ関数７５の実行回数（２回目）を保存する。また、本実施の形態では第１のカウンタ関数７５が実行されたタイミングに対応したタイムスタンプ情報を保存する。２回目のタイムスタンプ情報は"２０"であるので、この情報を保存する（図１７（ａ）の表の２回目に示す）。このタイムスタンプ情報は、例えばマイクロコントローラ３が内蔵しているタイマーを用いて得ることができる。なお、１回目のタイムスタンプ情報（"１０"）についても、第１のカウンタ関数７５を１回目に実行した際に保存されている。
その後、第１のデバッグ対象関数７１を呼び出したユーザプログラムへ戻る（ステップＳ８９）。
【００６３】
なお、上記の走行ルートプログラム７７は図１３（ａ）、（ｂ）に示す第１および第２の走行ルート表７３、７４に対応している。また、集計プログラムが第１のカウンタ関数７５と第２のカウンタ関数７６の走行ルートを解析するタイミングは、上記以外にも任意に設定することができる。例えば、第１のカウンタ関数７５と第２のカウンタ関数７６の走行ルートの解析をステップＳ８８の後に同時に行なってもよい。
【００６４】
このような動作を繰り返し、例えば第１のデバッグ対象関数７１の呼び出し回数が設定値に到達した場合、マイクロコントローラ３はユーザプログラムおよびオブジェクトモジュールの実行を停止する。なお、ユーザプログラムは設定値に到達した場合以外にも他の要因で停止することも可能である。
【００６５】
デバッガ制御部１５は、マイクロコントローラ３で実行されたユーザプログラムおよびオブジェクトモジュールの走行結果を取得する。走行結果は、図１７（ａ）に示す第１のカウンタ関数７５の走行結果に対応する第１の走行結果９１と、第２のカウンタ関数７６の走行結果に対応する第２の走行結果９２であり、例えば第１および第２のカウンタ関数７５、７６が実行された回数とこれに対応する走行ルートおよびタイムスタンプ情報を含むデータである。
【００６６】
そして、走行ルート解析部１６はデバッガ制御部１５から取得した第１および第２の走行結果９１、９２と第１および第２の走行ルート表７３、７４とに基づき走行ルートを解析する。本実施の形態では、走行ルート解析部１６はタイムスタンプ情報を用いて走行ルートを解析することができる。例えば、図１７（ａ）に示すように第１のカウンタ関数７５の２回目のタイムスタンプは"２０"であり、第１のカウンタ関数７５の３回目のタイムスタンプは"３０"である。また、図１７（ｂ）に示すように第２のカウンタ関数７６の１回目のタイムスタンプは"２２"である。よって、この場合は第１のカウンタ関数７５の２回目の走行途中で、第２のカウンタ関数７６の１回目の走行が実行されたことがわかる。このように、タイムスタンプ情報を用いることで複数のカウンタ関数間の繋がりを把握することができる。
【００６７】
また、走行ルート表示部１７は、ソースファイル９に含まれるデバッグ対象関数と走行ルート解析部１６の解析結果からデバッグ対象関数の解析結果を表示する。ここでデバッグ対象関数の解析結果とは、例えばトレース情報やカバレッジ情報である。図１８は、走行ルート表示部１７が表示するソースプログラム（デバッグ対象関数）の解析結果の一例である。図１８はでは、例として第１のデバッグ対象関数７１の２回目の走行ルートのトレース情報９３と、第１のデバッグ対象関数７１の２回目の実行中に呼び出された第２のデバッグ対象関数７２の走行ルート（１回目）のトレース情報９４を示している。図１８に示すように、第１のデバッグ対象関数７１の２回目の走行ルートは１行目、３行目、５行目、７〜１０行目、２５行目であり、第２のデバッグ対象関数７２の１回目の走行ルートは１行目、３行目、７〜１０行目である。
【００６８】
以上で説明したように、本実施の形態にかかるデバッグ装置ではカウンタ関数が実行されたタイミングに対応したタイムスタンプ情報を用いて走行ルートを解析することができるので、カウンタ関数が複数ある場合に複数のカウンタ関数間の繋がりを容易に把握することができる。なお、本実施の形態にかかるデバッグ装置においても実施の形態１にかかるデバッグ装置により得られる効果と同様の効果を得ることができる。
【００６９】
以上、本発明を上記実施形態に即して説明したが、上記実施形態の構成にのみ限定されるものではなく、本願特許請求の範囲の請求項の発明の範囲内で当業者であればなし得る各種変形、修正、組み合わせを含むことは勿論である。
【符号の説明】
【００７０】
１  デバッグ装置
２  エミュレータ
３  マイクロコントローラ
４  デバッグＩ／Ｆ
５  フラッシュＲＯＭ
６  ＣＰＵコア
７  ＲＡＭ
８  周辺機能
９  ソースファイル
１０  デバッグＧＵＩ
１１  構造解析部
１２  走行ルート表生成部
１３  プログラム生成部
１４  コンパイラ
１５  デバッガ制御部
１６  走行ルート解析部
１７  走行ルート表示部
【図１】
2011186806.tif 000003
【図２】
2011186806.tif 000004
【図３】
2011186806.tif 000005
【図４】
2011186806.tif 000006
【図５】
2011186806.tif 000007
【図６】
2011186806.tif 000008
【図７】
2011186806.tif 000009
【図８】
2011186806.tif 000010
【図９】
2011186806.tif 000011
【図１０】
2011186806.tif 000012
【図１１】
2011186806.tif 000013
【図１２】
2011186806.tif 000014
【図１３】
2011186806.tif 000015
【図１４】
2011186806.tif 000016
【図１５】
2011186806.tif 000017
【図１６】
2011186806.tif 000018
【図１７】
2011186806.tif 000019
【図１８】
2011186806.tif 000020
【図１９】
2011186806.tif 000021
【図２０】
2011186806.tif 000022
【図２１】
2011186806.tif 000023