(57)【特許請求の範囲】
【請求項１】
分岐命令とメモリアクセス命令をトレース対象命令として分岐トレースデータ及びメモリアクセストレースデータを出力するデータトレース方法において、
フェッチしたプログラムコードが、メモリアクセス命令の内のフレームポインタをスタックに退避するフレームポインタ操作であり、かつ直前のトレースデータが分岐命令であるとき、前記フレームポインタ操作直後の、スタックに退避する動作を実行するための命令のトレースデータ出力をマスクすることにより、トレースデータを圧縮することを特徴とするデータトレース方法。
【請求項２】
前記メモリアクセス命令が前記フレームポインタ操作ではないとき、または前記メモリアクセス命令が前記フレームポインタ操作であって且つ直前のトレースデータが分岐命令ではないときには、メモリアクセストレースデータとして出力することを特徴とする請求項１に記載のデータトレース方法。
【請求項３】
分岐命令とメモリアクセス命令をトレース対象命令として分岐トレースデータ及びメモリアクセストレースデータを出力する手段を備えたトレースモジュールにおいて、
フェッチしたプログラムコードから前記トレース対象命令を判定する第１の判定手段と、該第１の判定手段によりトレース対象命令と判定されたプログラムコードがメモリアクセスであるか否かを判定する第２の判定手段と、該第２の判定手段によりメモリアクセスと判定された前記トレース対象命令がフレームポインタをスタックに退避するフレームポインタ操作であるか否かを判定する第３の判定手段と、該第３の判定手段により前記フレームポインタ操作であると判定された前記トレース対象命令の直前のトレースデータが分岐命令であるか否かを判定する第４の判定手段と、該第４の判定手段により直前のトレースデータが分岐命令であると判定された前記フレームポインタ操作直後の、スタックに退避する動作を実行するための命令のトレースデータ出力をマスクする手段を備えていることを特徴とするトレースモジュール。
【請求項４】
前記第２の判定手段でメモリアクセスではないと判定されたトレース対象命令から分岐トレースデータを出力する手段を備えていることを特徴とする請求項３に記載のトレースモジュール。
【請求項５】
前記第３の判定手段で前記フレームポインタ操作ではないと判定されたメモリアクセス命令、および前記第３の判定手段で前記フレームポインタ操作であると判定され且つ前記第４の判定手段で前記フレームポインタ操作直前の命令が分岐命令ではないと判定されたトレース対象命令からメモリアクセストレースデータを出力する手段を備えていることを特徴とする請求項３または４に記載のトレースモジュール。
【請求項６】
コンピュータにデバッグ対象プログラムからトレースデータを出力する処理を実行させるためのプログラムであって、
フェッチしたプログラムコードが分岐命令であるとき、当該分岐命令の分岐トレースデータを出力する処理と、フェッチしたプログラムコードがメモリアクセス命令であるが、フレームポインタ操作ではないとき、当該メモリアクセスのトレースデータを出力する処理と、フェッチしたプログラムコードがメモリアクセス命令であって、かつフレームポインタをスタックに退避するフレームポインタ操作であるとき、直前のトレースデータが分岐命令であるか否かを判定する処理と、該判定の結果、直前のトレースデータが分岐命令ではないとき、前記メモリアクセスのトレースデータを出力する処理と、前記判定の結果、直前のトレースデータが分岐命令であるとき、前記フレームポインタ操作直後の、スタックに退避する動作を実行するための命令のトレースデータ（データアクセス）出力をマスクする処理を実行させることを特徴とするデータトレース用プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム組み込み機器等の開発の際に実施されるデバッグに必要なデータアクセスを記録するデータトレース方法およびトレースモジュールに関する。
【背景技術】
【０００２】
マイクロプロセッサは、半導体技術の進歩に伴い、より高速化、大規模化が図られており、また、オン・チップでのキャシュメモリが内蔵されているものも多い。このような従来の高速化、大規模化が図られたマイクロプロセッサでは、組込み用の応用システムの開発段階ではインサーキットエミュレータ（ＩＣＥ）を用いてマイクロプロセッサの実行履歴をみながらディバグする手法がとられている。
【０００３】
その際、効率よくデバッグを行う環境が必要であるが、メモリアクセスをすべて記録すると、描画処理などのメモリをコピーする処理もトレースの対象となるため、トレース用のメモリが大量に必要になり、コストアップの要因となる。また、出力するデータの量によっては、データの欠損やＣＰＵの動作を止める必要があった。
【０００４】
このように単純にデータトレースをすべて取得した場合は、トレース容量が増大し、また、仮想メモリを使用したＯＳ下では、アドレスによるフィルタもかけられないという問題もある。そのため、デバッグに必要なメモリアクセスを効率良くトレースする仕組みが要求されている。
【０００５】
そのため従来のデータトレース方式として、例えば、あらかじめトレースエリアを設けておき、どの関数が呼ばれたかをトレースするために、トレースを実施したい関数の先頭で、関数を識別するための番号及び関数に渡された引数をトレースエリアに書込む処理を追加してデータトレースを行う方式（例えば特許文献３〜４参照）が知られている。
【０００６】
また、特許文献１には、マイクロコンピュータで実行されるプログラムのデバッグを行うためのプログラムデバッグ装置において、マイクロコンピュータの実行が実行アドレスの分岐を伴うものであるか否かを判別し、分岐動作である場合には分岐実行信号を出力する判別手段と、この分岐実行信号が入力された場合に、この命令およびこの命令の前後所定ステップの命令のみを記憶する記憶手段とを備え、デバッグ上必要なトレース情報のみをトレースメモリに格納させることにより、デバッグ装置のメモリの記憶容量を小さくしてコストの低下と、デバッグ作業の効率を向上させる技術が記載されている。
【０００７】
また、特許文献２には、ＣＰＵコアとキャシュメモリを接続するＣＰＵ内部バスに、分岐命令の種類を解読する分岐命令デコーダと、解読された分岐命令の分岐アドレスをラッチする分岐アドレスラッチを接続し、また、前記分岐命令の種類と分岐アドレスを一時的に蓄えるバッファメモリと、この蓄えた情報を外部に出力するパラレルシリアル変換回路とを備え、前記バッファメモリに蓄えられた情報を、ＣＰＵのクロックに同期してトレース用のメモリに記憶させることにより、キャッシュメモリにヒットしたプログラムの実行中もプログラムの流れをトレース可能とする技術が記載されている。
【０００８】
【特許文献１】特開平０６−１８７１９３号公報
【特許文献２】特開平１１−０３９１９３号公報
【特許文献３】特開平１０−１２４３５０号公報
【特許文献４】特開平１１−０６５８８５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかし、プログラム内部にトレースを行うプログラムを埋め込み、どの関数がどのような引数で呼び出されたかをトレースするデータトレース方式では、そのプログラムが実行された時のデータしかトレースできず、特定のエリア（特定の変数）へのリードライトアクセスを行うプログラムのトレースを行うことはできないという問題がある。
【００１０】
また、特許文献１に記載の発明では、デバッグ上必要なトレース情報のみをトレースメモリに格納させることにより、デバッグ装置のメモリの記憶容量を小さくすることができ、コストの低減、デバッグ作業効率の向上を図っているが、通常、デバッグ対象のプログラムは、自らＰＣでコンパイル、リンクしてデバッグ対象のハードウェアのＲＯＭやＲＡＭに転送して実行され、ＰＣ上には、デバッグ対象のプログラムがあるので、アドレスさえ分かれば、前後の命令は後から判別可能であって特にトレースする必要はなく、従って、分岐実行命令の前後所定ステップの命令を記憶するのは無駄なトレースである。さらに特許文献１に記載の発明では、関数の引数は後から解析することができないという問題がある。
【００１１】
また、特許文献２に記載の発明の場合、ＣＰＵが分岐命令を実行することを検出し、マイクロプロセッサ外部に分岐命令と分岐アドレスを出力してトレース可能としているため、例えば、マイクロプロセッサ内部のキャッシュメモリとＣＰＵ間でアクセス処理されて外部からは見えない命令が実行された場合でも、プログラムの実行順序を外部でトレースすることが可能となるが、この発明では、トレース機能を利用してデバッグをしているため、例えば、何かの処理でエラーが返ってきたとしても、エラー処理に走ったことは分かるが、エラーの要因が分からない、あるいは関数への引数が不正でエラーとなったが、どのように不正であったのかが分からない等、分岐トレース、つまりプログラムの流れ方が分かるだけであって、デバッグのための情報が不足する場合が生ずるという問題がある。
【００１２】
そのため、デバッグの際にメモリアクセス命令（何番地にどういう値を読み書きしたか）のトレースも必要となる場合が多くなっているが、前記したようにデータアクセスを全てトレースしたのでは、不要なデータも沢山トレースしてしまうことになり、メモリの容量を大きくする必要が生じ、また、デバッグ作業の効率も悪くなるという問題がある。
【００１３】
本発明の目的は、上記の問題点に鑑み、デバッグ用の特別な命令を埋め込むことなく特定のケースのみメモリアクセスをトレースする事により、デバッグにさほど有効でないメモリアクセスのトレースを省き、リアルタイム性を損なうことなく少量のメモリで、効果的なデバッグ環境を実現することにある。
【課題を解決するための手段】
【００１４】
一般に関数の呼び出しは、まずレジスタの退避が行われ、次に目的の関数の引数がセットされたのち、目的の関数のあるアドレスへ分岐し、分岐後に、フレームポインタの操作をした後、リンクレジスタやスタックポインタをスタックに積む動作が実行される。しかし、これらは直近のメモリアクセスのトレースデータおよび分岐トレースデータがあれば復元可能である。即ち、分岐命令のトレースと、メモリアクセス（何番地にどういう値を書いたか？何番地からどういうデータを読んだか？）のトレースがあれば、プログラムがどのように動いたのかを後から解析することが可能である。
【００１５】
本発明はこの点に着目し、フェッチしたプログラムコードが、メモリアクセス命令の内のフレームポインタ操作であり、かつ直前のトレースデータが分岐命令であるときには、前記フレームポインタ操作直後のトレースデータ出力をマスクすることにより、トレースデータを圧縮することを特徴とする。このトレースデータは、分岐命令直後のフレームポインタ操作から関数の入口にジャンプしてきたと考えられるので、直後のトレースデータをマスクしても、ＬＲ（リンクレジスタ：戻り先アドレス）は分岐命令のトレースから復元可能であり、また、ＳＰ（スタックポインタ）は直前のスタック回避操作のデータトレースから復元可能である。
【００１６】
本発明のトレースモジュールは、フェッチしたプログラムコードからトレース対象命令を判定する第１の判定手段と、該判定されたトレース対象命令がメモリアクセスであるか否かを判定する第２の判定手段と、該第２の判定手段によりメモリアクセスと判定された前記トレース対象命令がフレームポインタ操作であるか否かを判定する第３の判定手段と、該第３の判定手段によりフレームポインタ操作であると判定された前記トレース対象命令の直前のトレースデータが分岐命令であるか否かを判定する第４の判定手段と、該第４の判定手段により直前のトレースデータが分岐命令であると判定された直後のトレースデータ出力をマスクする手段を備えていることを特徴とする。
【００１７】
また本発明のデータトレース用プログラムは、コンピュータにデバッグ対象プログラムからトレースデータを出力する処理を実行させるためのプログラムであって、フェッチしたプログラムコードが分岐命令であるとき、当該分岐命令の分岐トレースデータを出力する処理と、フェッチしたプログラムコードがメモリアクセス命令であるが、フレームポインタ操作ではないとき、当該メモリアクセスのトレースデータを出力する処理と、フェッチしたプログラムコードがメモリアクセス命令であって、かつフレームポインタ操作であるとき、直前のトレースデータが分岐命令であるか否かを判定する処理と、該判定の結果、直前のトレースデータが分岐命令ではないとき、前記メモリアクセスのトレースデータを出力する処理と、前記判定の結果、直前のトレースデータが分岐命令であるとき、前記フレームポインタ操作直後のトレースデータ（データアクセス）出力をマスクする処理を実行させることを特徴とする。
【００１８】
本発明では、フェッチされたプログラムコードがトレース対象命令であっても、それがメモリアクセス命令であり、フレームポインタ操作であり、かつ直前のトレースデータが分岐命令である場合には、直後のトレースデータ出力をマスク（抑止）する事により、関数コールの度に行われるレジスタ退避のトレースデータを圧縮することができる。従って、デバッグ用の特殊な命令を使用しなくても、特定の命令の組み合わせをトリガーとすることにより、トレースデータ出力を制御してデバッグに支障なくトレースデータを圧縮することが可能となる。
【発明の効果】
【００１９】
本発明は、特定の命令の組み合わせをトリガーとして出力すべきトレースデータを制御しているので、デバッグ用の特殊な命令を使用することなく、関数コールの度に行われるレジスタ退避のトレースデータを圧縮することが可能となり、リアルタイム性を損なうことなく少量のメモリで、効果的なデバッグ環境を実現することができる。
【００２０】
即ち、フェッチされたプログラムコードが、分岐命令直後かつフレームポインタの操作後のメモリアクセスに該当するときには、該データは、戻り元の番地であるリンクレジスタのデータ、スタックポインタをスタックに退避する動作を実行するためのデータであるので、分岐情報のトレースデータやメモリアクセストレース情報から復元可能である。本発明では、この復元可能な分岐命令直後かつフレームポインタの操作後のメモリアクセスデータを、トレースデータの対象から除外（マスク）するので、トレースするデータ量を減らすことができ、トレースデータを記憶するメモリ容量を減らすことが可能となる。
【発明を実施するための最良の形態】
【００２１】
図１は、本発明の実施形態を示すトレースシステムのブロック図である。
【００２２】
図１において、ＣＰＵ２０１は、ＣＰＵコア２０２、トレースモジュール２０３、キャッシュメモリ２０４からなり、トレースモジュール２０３は、外部のＩ／Ｆ２０５と接続され、Ｉ／Ｆ２０５はトレースデータ表示装置２０６と接続されている。通常、Ｉ／Ｆ２０５はＩＣＥであり、トレースデータ表示装置２０６はデバッガソフトがインストールされたＰＣである。ＣＰＵ２０１は、外部メモリ２０７と接続されている。プログラムは、外部メモリ２０７に保存されており、キャッシュメモリ２０４を通じてアクセスされる。
【００２３】
図２は、本実施形態におけるトレースモジュール２０３の動作を示すフローチャートである。この動作はハードウェア構成、あるいはトレースモジュール２０３に実装された制御プログラム構成のいずれでも実行可能である。以下図１〜図２を参照して、本実施形態の動作について説明する。
【００２４】
トレースモジュール２０３は、ＣＰＵコア２０２のバスを監視し、トレース対象命令となる分岐命令とメモリアクセス命令を検出すると、以下の処理を実行する。なお、本実施形態では、キャッシュメモリ２０４の内側にトレースモジュール２０３が接続されているため、トレースモジュール２０３はＣＰＵコア２０２のバスを直接監視することができるので、キャッシュメモリ２０４の影響は受けない。
【００２５】
トレースモジュール２０３は、外部メモリ２０７より読み出されてフェッチされたプログラムコードがトレース対象命令であるか否かを判定し（Ｓ１０１）、トレース対象命令でなければ（Ｓ１０１、ＮＯ）、次にフェッチされるプログラムコードの監視に移行する（Ｓ１０８）。一方、フェッチされたプログラムコードがトレース対象命令である場合（Ｓ１０１、ＹＥＳ）には、メモリアクセス命令と分岐命令の何れであるかを判定する（Ｓ１０２）。
【００２６】
分岐命令であれば（Ｓ１０２、ＮＯ）、分岐トレースデータ（ジャンプ元アドレス、ジャンプ先アドレス）をＩ／Ｆ２０５へ出力して（Ｓ１０３）、次にフェッチされるプログラムコードの監視に移行する（Ｓ１０８）。一方、フェッチされたプログラムコードのトレース対象命令がメモリアクセス命令である場合（Ｓ１０２、ＹＥＳ）には、次に当該命令が、フレームポインタ操作（フレームポインタの退避操作）であるか否かを判定する（Ｓ１０４）。フレームポインタ操作でない場合（Ｓ１０４、ＮＯ）には、このメモリアクセストレースデータをＩ／Ｆ２０５へ出力して（Ｓ１０５）、次にフェッチされるプログラムコードの監視に移行する（Ｓ１０８）。
【００２７】
一方、メモリアクセス命令がフレームポインタ操作である場合（Ｓ１０４、ＹＥＳ）には、次に直前のトレースデータが分岐命令であるか否かを判定する（Ｓ１０６）。フレームポインタの操作の直前のトレースデータが分岐命令ではないとき（Ｓ１０６、ＮＯ）には、このメモリアクセストレースデータ（読み込みの場合は読み取り元アドレスおよび値、書き込みの場合は書き込み先アドレスおよび値）をＩ／Ｆ２０５へ出力して（Ｓ１０５）、次にフェッチされるプログラムコードの監視に移行する（Ｓ１０８）。
【００２８】
一方、フレームポインタ操作の直前のトレースデータが分岐命令であるとき（Ｓ１０６、ＹＥＳ）には、このトレースデータは、分岐命令直後のフレームポインタ操作から関数の入口にジャンプしてきたものと考えられ、その内容はＬＲ（リンクレジスタ：戻り先アドレス）またはＳＰ（スタックポインタ）である。しかし、関数の入口にジャンプしてきた後の最初のメモリアクセスを除くこれらのトレースデータは、分岐命令のトレースデータおよび直前のスタック回避操作のデータトレースから復元可能である。
【００２９】
そこでこの直後のトレースデータ出力については、これをマスクして外部のＩ／Ｆ２０５には出力しないように制御する（Ｓ１０７）。そして次にフェッチされるプログラムコードの監視に移行する（Ｓ１０８）。これにより、後で復元可能なＬＲ（リンクレジスタ：戻り先アドレス）またはＳＰ（スタックポインタ）のデータはトレースデータ対象から除外され、デバッグに支障なくトレースデータの圧縮が行われる。
【００３０】
本実施形態によれば、トレースモジュール２０３によりフェッチされたプログラムコードがトレース対象命令であっても、それがメモリアクセス命令であり、フレームポインタ操作であり、かつ直前のトレースデータが分岐命令である場合には、直後のトレースデータは、関数コールの度に行われるレジスタ退避のトレースデータであって、再現可能であるので、その出力をマスク（抑止）する。従って、その分メモリに記録すべきトレースデータ量を圧縮することができる。
【００３１】
なお、上記実施例では、ステップ１０２，１０４，１０６を満足するトレース対象命令については、全てマスク対象としているが、図１のステップ１０７において、マスクするメモリアクセス命令の数を指定する事も可能である。
【００３２】
また、コンパイラと協調して、スタックポインタ、リンクレジスタ、フレームポインタ、プログラムカウンタなどは必ず同じ場所に置く様にして、不要なデータを効率的に出さないようにすることもできる。
【００３３】
例えば、関数の入口に以下のようなアセンブラが生成されている場合、
mov    r12,sp
push  {fp,r12,lr,pc}
（  fp：フレームポインタ、r12：汎用レジスタ、  sp：スタックポインタ、  lr：リンクレジスタ、  pc：プログラムカウンタ、  mov：代入命令、  push：スタック退避）、
｛｝に入っているレジスタをスタックに退避するが、直前にスタックポインタをr12レジスタに入れているので、毎回毎回上記のようなコードであれば、マスク可能なデータが分かる。即ち、fpの次のr12,lr,pcはマスクしても、全て後から推測可能となる。
【００３４】
しかし、時にコンパイルの結果が
mov    r12,sp
push  
となる場合には固定的な処理が出来なくなり、その場合にはr3,r4はマスクできない。
【図面の簡単な説明】
【００３５】
【図１】本発明の実施形態を示すブロック図である。
【図２】本実施形態の動作を示すフローチャートである。
【符号の説明】
【００３６】
２０１  ＣＰＵ
２０２  ＣＰＵコア
２０３  トレースモジュール
２０４  キャッシュメモリ
２０５  Ｉ／Ｆ
２０６  トレースデータ表示装置
２０７  外部メモリ
【図１】
0004725240.tif 000002
【図２】
0004725240.tif 000003