(57)【要約】【課題】ソフトウェア上の問題の早期解決を図るべく、トレースログの記録においてトレースログの効果的な絞り込みを行い、もって、再現性が低く解析が難しい問題の特定を迅速・容易化する。【解決手段】ＣＰＵ１によるプログラム実行処理の任意状態を定義するイベントを管理し、プログラム実行処理の状態と比較して等価・非等価の判別結果であるイベント成立状態を出力するイベント制御手段２と、ＣＰＵによるプログラム実行処理のトレースログを記録しておくためのトレースメモリ１１と、イベント制御手段によるイベント成立状態が有効のときにＣＰＵによるプログラム実行処理のトレースログをトレースメモリに仮記録するトレース制御手段３と、トレース制御手段によるトレースログ仮記録処理時間Ｔが現在までにおいて最長か否かに応じて、トレースメモリにおけるトレースログの仮記録を本記録として確定するか破棄するかを制御するトレースログ記録確定制御手段４を備える。【選択図】図１
2010186361.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを実行するＣＰＵと、
前記ＣＰＵによるプログラム実行処理の任意状態を定義するイベントを管理し、前記ＣＰＵによるプログラム実行処理の状態と比較して等価・非等価の判別結果であるイベント成立状態を出力するイベント制御手段と、
前記ＣＰＵによるプログラム実行処理のトレースログを記録しておくためのトレースメモリと、
前記イベント制御手段による前記イベント成立状態が有効のときに前記ＣＰＵによるプログラム実行処理のトレースログを前記トレースメモリに仮記録するトレース制御手段と、
前記トレース制御手段による前記トレースログ仮記録処理時間が現在までにおいて最長か否かに応じて、前記トレースメモリにおける前記トレースログの仮記録を本記録として確定するか破棄するかを制御するトレースログ記録確定制御手段とを備えたプログラムデバッグ装置。
【請求項２】
前記トレースログ記録確定制御手段は、現在記録アドレスと前回記録アドレスを管理するもので、前記トレース制御手段による前記トレースログ仮記録処理時間が現在までにおいて最長のときは、前記トレースメモリにおける次の現在記録アドレスとして更新後の現在記録アドレスを設定し、前記トレースログ仮記録処理時間が現在までにおいて最長でないときは、次の現在記録アドレスとして前回記録アドレスを設定することにより、現在記録アドレスの調整を行うトレースメモリアドレス管理手段を備えている請求項１に記載のプログラムデバッグ装置。
【請求項３】
前記トレースメモリアドレス管理手段は、前記トレース制御手段による前記トレースログ仮記録処理時間が現在までにおいて最長のときは、前記トレースメモリにおける更新後の現在記録アドレスを前回記録アドレスにコピーし、前記トレースログ仮記録処理時間が現在までにおいて最長でないときは、前回記録アドレスを現在記録アドレスにコピーするものとして構成されている請求項２に記載のプログラムデバッグ装置。
【請求項４】
さらに、前記トレース制御手段による前記トレースログ仮記録処理時間が現在までにおいて最長か否かを判断し、その判断結果に基づいて前記トレースメモリアドレス管理手段をタイミング制御する更新タイミング制御手段を備えている請求項２または請求項３に記載のプログラムデバッグ装置。
【請求項５】
前記トレースログ記録確定制御手段は、その都度の現在記録アドレスをトレース開始アドレスとして更新するように構成されている請求項１から請求項４までのいずれかに記載のプログラムデバッグ装置。
【請求項６】
前記トレースログ記録確定制御手段は、現在記録アドレスと前回記録アドレスとトレース開始アドレスを管理するもので、前記トレース制御手段による前記トレースログ仮記録処理時間が現在までにおいて最長のときは、前記前回記録アドレスを前記トレース開始アドレスに設定した上で、前記トレースメモリにおける更新後の現在記録アドレスを前回記録アドレスにコピーし、前記トレースログ仮記録処理時間が現在までにおいて最長でないときは、前回記録アドレスを現在記録アドレスにコピーするものとして構成されている請求項５に記載のプログラムデバッグ装置。
【請求項７】
さらに、前記イベント制御手段による前記イベント成立状態を入力してイベント成立間の最長時間を測定し、最長時間を更新したかしていないかを判別し、その判別結果である最長時間更新情報を前記更新タイミング制御手段に出力する時間測定手段を備え、
前記更新タイミング制御手段は、前記時間測定手段から入力する前記最長時間更新情報によって、前記トレースログ仮記録処理時間が現在までにおいて最長か否かを判断し、その判断結果に基づいて前記トレースメモリアドレス管理手段をタイミング制御するように構成されている請求項４に記載のプログラムデバッグ装置。
【請求項８】
前記更新タイミング制御手段は、時刻情報を付帯するトレースログを入力し、前記トレースログが付帯する前記時刻情報から前記トレースログ仮記録処理時間が最長時間を更新したか更新していないかを判別し、その判別結果である最長時間更新トレース情報に基づいて前記トレースメモリアドレス管理手段をタイミング制御するように構成されている請求項４に記載のプログラムデバッグ装置。
【請求項９】
前記更新タイミング制御手段は、入力されてくるトレースログと、前記イベント制御手段が管理するイベントとに基づいて、前記トレースログ仮記録処理時間が最長時間を更新したか更新していないかを判別し、その判別結果である最長時間更新イベントトレース情報に基づいて前記トレースメモリアドレス管理手段をタイミング制御するように構成されている請求項４に記載のプログラムデバッグ装置。
【請求項１０】
さらに、前記更新タイミング制御手段による現在記録アドレスの更新制御の有効／無効を設定する更新タイミングマスク制御手段を備えている請求項１から請求項９までのいずれかに記載のプログラムデバッグ装置。
【請求項１１】
前記更新タイミング制御手段は、現在記録アドレスの更新／非更新を示すアドレス更新情報を出力する機能を備え、さらに、前記更新タイミング制御手段から更新を示す前記アドレス更新情報を入力したときに任意の波形信号を外部トリガとして出力する外部トリガ出力手段を備えている請求項１から請求項１０までのいずれかに記載のプログラムデバッグ装置。
【請求項１２】
前記更新タイミング制御手段は、現在記録アドレスの更新／非更新を示すアドレス更新情報を出力する機能を備え、さらに、前記更新タイミング制御手段から更新を示す前記アドレス更新情報を入力したときに前記ＣＰＵの動作を停止させるブレーク制御手段を備えている請求項１から請求項１１までのいずれかに記載のプログラムデバッグ装置。
【請求項１３】
請求項１から請求項１２までのいずれかに記載のプログラムデバッグ装置を搭載しているエミュレータシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はトレース機能とイベント機能を備えたプログラムデバッグ装置にかかわり、特には多重割り込み等を多用した製品のプログラムのデバッグに有効なプログラムデバッグ装置に関する。
【背景技術】
【０００２】
近年、組み込みプログラムの開発環境等において、プログラムデバッグ装置であるエミュレータやオンボードデバッガが広く利用されている。組み込みプログラムにおいては、高機能化に伴うソフトウェアの肥大化や複雑化が進むと同時に、高い品質のソフトウェアが望まれている。特にカーナビゲーションや携帯電話のソフトウェアにおいては、高い機能を実現するために多重割り込み等が多用され、ＣＰＵ（Central Processing Unit）の機能を最大限に利用しているため、割り込み処理時間の確実な設計やメモリアクセスの排他性の設計が必要である。
【０００３】
確実な設計については、ソフトウェアの肥大化や複雑化が進むことで難解な作業となり、割り込み処理時間の確認やメモリアクセスの排他性に問題が発生しがちで、プログラムデバッグ装置のトレース機能とイベント機能を用いて解析しなければならない状況に陥ることがよくある。このような問題に直面したときは、プログラムデバッグ装置のトレース機能とイベント機能を用いて取得したトレースログ（プログラムを実行した処理の記録）を解析する。
【０００４】
図２０は従来技術のトレース機能とイベント機能を備えたプログラムデバッグ装置の構成を示すブロック図である。このプログラムデバッグ装置は、ＣＰＵ１、イベント制御モジュール２、トレース制御モジュール３およびトレースメモリ１１で構成されている。
【０００５】
ＣＰＵ１は、プログラムを実行する。イベント制御モジュール２は、ＣＰＵ１がプログラムを実行中に実行した処理の状態を監視し、イベントとして設定した状態と等価であるか非等価であるかを判別し、判別した結果をイベント成立状態としてトレース制御モジュール３に出力する。トレース制御モジュール３は、トレースログを取得し、イベント成立状態が開始イベントや終了イベントと等価であるかを判別してトレース記録実行情報３ａを作成し、トレースログ記録の指示があったときに、トレースログをトレースメモリ１１に記録する。
【０００６】
このプログラムデバッグ装置を用いて、ソフトウェア上の問題があると推測できる箇所に開始イベントと終了イベントを設定し、開始イベントから終了イベントまでのトレースログを取得し、トレースログを解析する。このようにイベントによって問題があると推測できる箇所に絞り、トレースメモリ１１に記録するトレースログを取得し、トレースログを解析する。以上の処理を繰り返し、最終的に問題の発生箇所を特定する。
【０００７】
一般的に、開始イベントから終了イベントまでの処理時間が長いほど、ソフトウェア上の問題が大きいイベントであると考えられる。開始イベントから終了イベントまでの処理時間が最長のときは、問題が最も大きいイベントであり、そのようなイベントを解析することが早期の問題解決に有効であると考えられる。
【０００８】
イベント成立間の最長時間を測定する方法は、特許文献１において提案されている。また、トレースログの記録方法については、特許文献２で提案されている。
【特許文献１】特開平３−９２９４０号公報
【特許文献２】特開平５−２４１８７８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
特許文献２の方法によれば、開始イベントから終了イベントまでのトレースログを累積して記録することができるが、開始イベントから終了イベントまでの処理時間が最長であるときのトレースログに絞り込むことができない。この処理時間が最長であるときとは、割り込みが多重に発生した場合や、想定外の割り込みが発生した場合や、処理量が異常に多い場合や、複数のタスクが変数をライトアクセスした結果、排他性の問題が発生しタスクの処理時間が異常に長くなる場合等を想定している。割り込みが入らない状態であれば、処理時間が短く、問題が発生しないことが多い。
【００１０】
このことを、図２０の時間測定機能を追加した図２１に示すプログラムデバッグ装置で説明する。時間測定モジュール７は、イベント成立状態が開始イベントや終了イベントと等価であるかを判別して時間測定を行い、すでに保持している現在までにおいて最長の処理時間と比較し、測定時間の方が長い場合には、測定時間を最長の処理時間として更新し、保持する。時間測定モジュール７は、トレース制御モジュール３とは独立して動作する。一方でトレース制御モジュール３はトレースログを蓄積し、他方で時間測定モジュール７が開始イベントから終了イベントまでの最長の処理時間を測定し、この動作を繰り返す。
【００１１】
長時間使用するようなシステムや再現性の低いソフトウェア上の問題を解析する場合、ＣＰＵ１を長時間実行させてトレースログを蓄積する。しかし、蓄積されたトレースログが膨大なものとなるため、トレースログの解析自体が難しく、多くの時間がかかる。さらに、トレースメモリ１１の容量に限りがあるため、トレースログを記録する領域をロールオーバーしてトレースログが上書きされ、解析できないことが多発している。このような理由により、想定以上に時間がかかったときのトレースログを特定することは現実的には不可能である。割り込みが多重に発生した場合や想定外の割り込みが発生し、想定していた以上に時間がかかったときには、一層困難となる。
【００１２】
一例として、トレースログのデータの１つの単位が２０バイトであり、トレースを取得開始して終了するまでのトレースログのデータ数の平均が５，０００個ある場合、トレースを取得開始して終了するまでのトレースログのデータサイズは１００，０００バイトとなる。さらにトレースを取得開始して終了するまでのサイクルが１秒に１０回実行され、トレースメモリ１１の容量が１，０００，０００バイトである場合、記録できるトレースログはたかだか約１秒間のデバッグ分でしかない。このような不都合の原因として、開始イベントから終了イベントまでの処理時間が最長のときのトレースログに絞り込むことができていないということがある。
【００１３】
本発明は、このような事情に鑑みて創作したものであり、ソフトウェア上の問題の早期解決を図るべく、トレースログの記録においてトレースログの効果的な絞り込みを行い、もって、再現性が低く解析が難しい問題の特定を迅速・容易化することを目的としている。
【課題を解決するための手段】
【００１４】
（１）本発明によるプログラムデバッグ装置は、
プログラムを実行するＣＰＵと、
前記ＣＰＵによるプログラム実行処理の任意状態を定義するイベントを管理し、前記ＣＰＵによるプログラム実行処理の状態と比較して等価・非等価の判別結果であるイベント成立状態を出力するイベント制御手段と、
前記ＣＰＵによるプログラム実行処理のトレースログを記録しておくためのトレースメモリと、
前記イベント制御手段による前記イベント成立状態が有効のときに前記ＣＰＵによるプログラム実行処理のトレースログを前記トレースメモリに仮記録するトレース制御手段と、
前記トレース制御手段による前記トレースログ仮記録処理時間が現在までにおいて最長か否かに応じて、前記トレースメモリにおける前記トレースログの仮記録を本記録として確定するか破棄するかを制御するトレースログ記録確定制御手段とを備えたものである。
【００１５】
この構成において、イベント制御手段は、ＣＰＵによるプログラム実行処理を監視し、これをあらかじめ管理しているイベントと比較して等価か非等価を判別し、等価であるときはイベント成立状態を有効にし、非等価であるときはイベント成立状態を無効にし、トレース制御手段に通知する。イベント成立状態を受け取ったトレース制御手段は、イベント成立状態が有効のときにＣＰＵによるプログラム実行処理のトレースログをトレースメモリに仮記録し、仮記録が済んだので現在記録アドレスを更新する。次いで、トレースログ記録確定制御手段は、トレース制御手段によるトレースログの仮記録に要したトレースログ仮記録処理時間が現在までにおいて最長か否か（前回仮記録時よりも長いか否か）に応じて、トレースメモリにおけるトレースログの仮記録を本記録として確定するか破棄するかを制御する。すなわち、トレースログはイベント成立状態が有効でありさえすればとりあえずはトレースメモリに一旦記録する（仮記録）。その上で、トレースログ仮記録処理時間が現在までにおいて最長か否かに応じて選択・破棄を行い、トレースログを絞り込む。トレースログの仮記録に要したトレースログ仮記録処理時間が現在までにおいて最長のときは仮記録を本記録として確定し、トレースログ仮記録処理時間が最長でないときは仮記録を破棄する。破棄することにより、トレースメモリに残されるトレースログの数を絞り込むことが可能となる。なお、「現在までにおいて最長」というのは、実態としては「前回よりも長い」ということであり、ただ１つということを意味するものではない。トレースメモリに残されるトレースログは、トレースログ仮記録処理時間が比較的長いものであり、より重大なソフトウェア上の問題を含んでいる可能性が高いイベントに関係するトレースログである。したがって、このような絞り込みによってトレースメモリに残されたトレースログを解析すれば、最終的な問題発生箇所の特定を迅速・容易に進めることが可能となる。また、記録するトレースログの絞り込みは、トレースメモリの容量の過大な増加を回避する上でも有効である。
【００１６】
（２）上記構成のプログラムデバッグ装置において、前記トレースログ記録確定制御手段は、現在記録アドレスと前回記録アドレスを管理するもので、前記トレース制御手段による前記トレースログ仮記録処理時間が現在までにおいて最長のときは、前記トレースメモリにおける次の現在記録アドレスとして更新後の現在記録アドレスを設定し、前記トレースログ仮記録処理時間が現在までにおいて最長でないときは、次の現在記録アドレスとして前回記録アドレスを設定することにより、現在記録アドレスの調整を行うトレースメモリアドレス管理手段を備えているという態様がある。
【００１７】
トレースログの仮記録に要したトレースログ仮記録処理時間が現在までにおいて最長であれば、次の現在記録アドレスとして更新後の現在記録アドレスを設定する。すると、次のトレースログが記録されることになるのは、更新後の現在記録アドレスにおいてであり、１回前に仮記録が行われたアドレスである前回記録アドレスにおいてではないので、１回前に仮記録が行われたアドレスに対する上書きは行われることはなく、結果として、１回前に仮記録が行われたアドレスにおけるトレースログの記録は本記録として確定されたものとなる。一方、トレースログの仮記録に要したトレースログ仮記録処理時間が現在までにおいて最長でないのであれば、次の現在記録アドレスとして前回記録アドレスを設定する。すると、次のトレースログが記録されることになるのは、１回前に仮記録が行われたアドレスである前回記録アドレスにおいてであり、その１回前に仮記録が行われた前回記録アドレスに対する上書きとなって、結果として、１回前に仮記録が行われたアドレスにおけるトレースログの記録は破棄されてしまい、代わりに今回の仮記録にかかわるトレースログの記録となる。
【００１８】
（３）また上記構成のプログラムデバッグ装置において、前記トレースメモリアドレス管理手段は、前記トレース制御手段による前記トレースログ仮記録処理時間が現在までにおいて最長のときは、前記トレースメモリにおける更新後の現在記録アドレスを前回記録アドレスにコピーし、前記トレースログ仮記録処理時間が現在までにおいて最長でないときは、前回記録アドレスを現在記録アドレスにコピーするものとして構成されているという態様がある。
【００１９】
仮記録から本記録または破棄への制御を、更新後の現在記録アドレスの前回記録アドレスへのコピーまたは前回記録アドレスの更新後の現在記録アドレスへのコピーによって実現するので、仮記録から本記録または破棄への制御を簡易な構成で容易に実現することが可能となる。更新後の現在記録アドレスを前回記録アドレスにコピーすれば、前回記録アドレスに設定されたアドレスは、この直前に仮記録されたトレースログの記録先アドレスであり、それが前回記録アドレスに存在しているということは、仮記録が本記録に昇格したことに相当する。一方、前回記録アドレスを現在記録アドレスにコピーすれば、仮記録後に更新した現在記録アドレスを元に戻すことになり、そのアドレスへの次のトレースログの上書きを許容することになるので、先の仮記録は破棄されることになる。
【００２０】
（４）また上記構成のプログラムデバッグ装置において、さらに、前記トレース制御手段による前記トレースログ仮記録処理時間が現在までにおいて最長か否かを判断し、その判断結果に基づいて前記トレースメモリアドレス管理手段をタイミング制御する更新タイミング制御手段を備えているという態様がある。
【００２１】
更新タイミング制御手段は、トレースログの仮記録に要したトレースログ仮記録処理時間が現在までにおいて最長か否かを判断し、判断結果をトレースメモリアドレス管理手段に与えるものであり、更新タイミング制御手段をもっぱらタイミングの管理をつかさどるものとして構成することが可能となる。
【００２２】
（５）また上記構成のプログラムデバッグ装置において、前記トレースログ記録確定制御手段は、その都度の現在記録アドレスをトレース開始アドレスとして更新するように構成されているという態様がある。
【００２３】
これは、現在記録アドレス、前回記録アドレスに加えてさらにトレース開始アドレスを用いるものである。その都度の現在記録アドレスを更新的にトレース開始アドレスとして保持するようにしているので、トレース開始アドレスには常に最終のトレースログ記録にかかわる現在記録アドレスが設定されていることになる。最終の記録にかかわるトレースログ仮記録処理時間は、記録されているトレースログ群の各トレースログ仮記録処理時間のうち最長時間となる。
【００２４】
トレースログのトレースメモリに対する記録が完了すると、トレースメモリにはその都度のトレースログ仮記録処理時間が現在までにおいて最長のイベントにかかわるトレースログが複数記録されていることになる。解析に際してトレースメモリからトレースログを読み出すに当たり、トレース開始アドレスにアクセスして読み出せば、記録されているトレースログ群全体のうちでトレースログ仮記録処理時間が現在までにおいて最長の１つの（最長中の最長の）トレースログが読み出されることになる。トレースログ群全体のうちでトレースログ仮記録処理時間が現在までにおいて最長のトレースログは、最も重大なソフトウェア上の問題を含んでいる可能性が高いイベントに関係するトレースログである。したがって、このただ１つのトレースログへの絞り込み解析によって、問題発生箇所の特定をさらに迅速・容易に進めることが可能となる。
【００２５】
（６）上記のトレース開始アドレスを有するプログラムデバッグ装置において、前記トレースログ記録確定制御手段は、現在記録アドレスと前回記録アドレスとトレース開始アドレスを管理するもので、前記トレース制御手段による前記トレースログ仮記録処理時間が現在までにおいて最長のときは、前記前回記録アドレスを前記トレース開始アドレスに設定した上で、前記トレースメモリにおける更新後の現在記録アドレスを前回記録アドレスにコピーし、前記トレースログ仮記録処理時間が現在までにおいて最長でないときは、前回記録アドレスを現在記録アドレスにコピーするものとして構成されているという態様がある。
【００２６】
これは、上記の（５）を実現するに当たり、アドレスの調整をコピー方式とするものである。
【００２７】
（７）上記の更新タイミング制御手段を備えたプログラムデバッグ装置において、さらに、前記イベント制御手段による前記イベント成立状態を入力してイベント成立間の最長時間を測定し、最長時間を更新したかしていないかを判別し、その判別結果である最長時間更新情報を前記更新タイミング制御手段に出力する時間測定手段を備え、前記更新タイミング制御手段は、前記時間測定手段から入力する前記最長時間更新情報によって、前記トレースログ仮記録処理時間が現在までにおいて最長か否かを判断し、その判断結果に基づいて前記トレースメモリアドレス管理手段をタイミング制御するように構成されているという態様がある。このように構成すれば、時間測定手段を更新タイミング制御手段から分離した状態で構成することが可能となる。本構成の場合、時間測定手段を追加することで、トレース機能をもつ従来技術のプログラムデバッグ装置への応用展開を容易なものにする。
【００２８】
（８）また上記の構成のプログラムデバッグ装置において、前記更新タイミング制御手段は、時刻情報を付帯するトレースログを入力し、前記トレースログが付帯する前記時刻情報から前記トレースログ仮記録処理時間が最長時間を更新したか更新していないかを判別し、その判別結果である最長時間更新トレース情報に基づいて前記トレースメモリアドレス管理手段をタイミング制御するように構成されているという態様がある。
【００２９】
トレースメモリアドレス管理手段は、トレースログ仮記録処理時間が現在までにおいて最長のときは、次の現在記録アドレスとして更新後の現在記録アドレスを設定することにより、トレースメモリにおけるトレースログの仮記録を本記録として確定する一方、最長でないときは、次の現在記録アドレスとして前回記録アドレスを設定することにより、トレースログの仮記録を破棄するものである。そして、更新タイミング制御手段は、トレースログ仮記録処理時間が現在までにおいて最長か否かを判断し、その判断結果に基づいてトレースメモリアドレス管理手段をタイミング制御するものである。この更新タイミング制御手段でのトレースログ仮記録処理時間が最長か否かの判断において、トレースログが付帯する時刻情報を利用するのが本構成である。トレースログの仮記録を開始したときのトレースログの時刻情報と仮記録を終了したときのトレースログの時刻情報からトレースログ仮記録処理時間を求め、これを最長時間更新トレース情報としてトレースメモリアドレス管理手段をタイミング制御すればよい。本構成によれば、（７）のような時間測定手段を含まないプログラムデバッグ装置においても、本発明が実現可能となる。
【００３０】
（９）また上記の構成のプログラムデバッグ装置において、前記更新タイミング制御手段は、入力されてくるトレースログと、前記イベント制御手段が管理するイベントとに基づいて、前記トレースログ仮記録処理時間が最長時間を更新したか更新していないかを判別し、その判別結果である最長時間更新イベントトレース情報に基づいて前記トレースメモリアドレス管理手段をタイミング制御するように構成されているという態様がある。
【００３１】
更新タイミング制御手段でのトレースログ仮記録処理時間が最長か否かの判断において、トレースログとイベントとの２つの要素を利用するのが本構成である。トレースログの仮記録を開始したときのイベントとトレースログを比較して一致したときの時刻情報と仮記録を終了したときのイベントとトレースログを比較して一致したときの時刻情報からトレースログ仮記録処理時間を求め、これを最長時間更新イベントトレース情報としてトレースメモリアドレス管理手段をタイミング制御すればよい。本構成によれば、（７）のような時間測定手段を含まないプログラムデバッグ装置においても、本発明が実現可能となる。
【００３２】
（１０）また上記の構成のプログラムデバッグ装置において、さらに、前記更新タイミング制御手段による現在記録アドレスの更新制御の有効／無効を設定する更新タイミングマスク制御手段を備えているという態様がある。
【００３３】
ソフトウェア上の問題を再現するパターンが事前にある程度特定できている場合には、トレースメモリへのトレースログの仮記録をそのようなパターンにかかわるトレースログに絞り込むのが合理的である。問題を再現することが事前にある程度特定できているパターン以外については、そのときのトレースログはトレースメモリへの記録の対象外とすればよい。例えば、プログラム実行直後は、最長となるトレースログ仮記録処理時間が更新されやすい。しかし、それが問題を再現するパターンではない場合が多い。そこで、このようなトレースログは破棄することにすればよい。問題を再現することがないと事前にある程度分かっているパターンについては、更新タイミングマスク制御手段において、更新タイミング制御手段による現在記録アドレスの更新制御を無効に設定しておく。そうすることにより、問題を再現することがないと事前にある程度分かっているパターンについてトレースメモリへのトレースログの仮記録を破棄させることが可能となる。問題を再現することが事前にある程度特定できているパターンについては、現在記録アドレスの更新制御を有効に設定しておく。そうすると、問題を再現することが事前にある程度特定できているパターンに限定して、トレースメモリへのトレースログの仮記録を本記録として確定することが可能となる。結果として、問題発生箇所のトレースログの収集が効率化される。
【００３４】
（１１）また上記の構成のプログラムデバッグ装置において、前記更新タイミング制御手段は、現在記録アドレスの更新／非更新を示すアドレス更新情報を出力する機能を備え、さらに、前記更新タイミング制御手段から更新を示す前記アドレス更新情報を入力したときに任意の波形信号を外部トリガとして出力する外部トリガ出力手段を備えているという態様がある。
【００３５】
プログラム上に発生した問題の解析に当たっては、収集したトレースログの解析だけでなく、問題発生箇所または問題発生時の出力状態等の波形を取得して、その波形も併せて解析すれば、問題解決を効果的に進めることが可能となる。現在記録アドレスを更新するのは、トレースログ仮記録処理時間が最長を更新したときであり、この場合に外部トリガ出力手段を活性化して問題解決に供する任意の波形信号を外部トリガとして出力させる。結果として、最長となるトレースログ仮記録処理時間が更新されたときに、外部トリガ出力手段が外部へ所望の波形を出力することができる。例えば、ユーザターゲットシステムにおけるアクチュエータ等の出力状態等の波形をオシロスコープ等によって取得する。問題発生時の波形とトレースログとを併せて解析すれば、問題解決が迅速・容易なものとなる。
【００３６】
（１２）また上記の構成のプログラムデバッグ装置において、前記更新タイミング制御手段は、現在記録アドレスの更新／非更新を示すアドレス更新情報を出力する機能を備え、さらに、前記更新タイミング制御手段から更新を示す前記アドレス更新情報を入力したときに前記ＣＰＵの動作を停止させるブレーク制御手段を備えているという態様がある。
【００３７】
最長となるトレースログ仮記録処理時間が更新されたときにＣＰＵを停止させれば、そのとき取得したトレースログを用いて、直ちに問題発生時の変数の状態や処理の状態をデバッグすることが可能となり、問題解決の迅速化を図ることが可能となる。
【００３８】
（１３）また、本発明によるエミュレータシステムは、上記のいずれかのプログラムデバッグ装置を搭載したものであり、プログラムや周辺装置上の問題のデバッグを効率良く進めることが可能となる。
【発明の効果】
【００３９】
本発明によれば、イベント成立状態が有効となるトレースログはすべて一旦はトレースメモリに仮記録した上で、トレースログ仮記録処理時間が現在までにおいて最長となるトレースログに限定して残すようにしているので、トレースログの記録においてトレースログの効果的な絞り込みが行われ、再現性が低く解析が難しいソフトウェア上の問題の特定を迅速・容易化することができる。
【発明を実施するための最良の形態】
【００４０】
以下、本発明にかかわるプログラムデバッグ装置の実施の形態を図面を用いて詳細に説明する。
【００４１】
（実施の形態１）
図１は本発明の実施の形態１におけるプログラムデバッグ装置の構成を示すブロック図である。このプログラムデバッグ装置は、ＣＰＵ１、イベント制御モジュール２、トレース制御モジュール３、トレースログ記録確定制御手段４（トレースメモリアドレス管理モジュール５、更新タイミング制御モジュール６）およびトレースメモリ１１から構成されている。以下、それらの各ブロックを説明する。図２０の従来技術のプログラムデバッグ装置と比較して、トレースメモリアドレス管理モジュール５および更新タイミング制御モジュール６からなるトレースログ記録確定制御手段４が追加されたものに相当する構成となっている。
【００４２】
ＣＰＵ１は、ハードウェアあるいはソフトウェアで構成され、プログラムコードを実行するものである。
【００４３】
イベント制御モジュール２は、ＣＰＵ１がプログラムを実行する処理の任意の状態を定義できるイベントを１つ以上管理する。イベントは、ＣＰＵ１がプログラムを実行する処理の任意の状態であり、ＣＰＵ１がプログラムを実行したときのアドレスや、リードまたはライトするアドレス等を定義することができる。さらにイベント制御モジュール２は、管理しているイベントとＣＰＵ１がプログラムを実行する処理の状態を比較し、イベント毎に等価であるか非等価であるかを判別し、その判別結果をイベント成立状態として出力する。
【００４４】
トレースメモリ１１は、ＣＰＵ１がプログラムを実行した処理の記録であるトレースログを記録する。トレースログの内容は、ＣＰＵ１が実行したアドレスやリードまたはライトしたアドレス等が代表的なものである。プログラムデバッグ装置によって、トレースログの内容は異なるものである。
【００４５】
トレース制御モジュール３は、イベント制御モジュール２によるイベント成立状態が有効のときにＣＰＵ１によるトレースログをトレースメモリ１１に仮記録するものとして構成されている。一例として、イベント制御モジュール２が管理する任意の１つのイベントを開始イベントとし、さらに任意の１つのイベントを終了イベントとして設定でき、開始イベントが成立してから終了イベントが成立するまでのトレースログ仮記録処理時間Ｔに対応するトレースログを仮記録することができる。
【００４６】
トレースログ記録確定制御手段４は、トレース制御モジュール３によるトレースログの仮記録に要したトレースログ仮記録処理時間Ｔが現在までにおいて最長か否かに応じて、トレースメモリ１１におけるトレースログの仮記録を本記録として確定するか破棄するかを制御するものであり、本実施の形態では、トレースメモリアドレス管理モジュール５と更新タイミング制御モジュール６とから構成されている。
【００４７】
トレースメモリアドレス管理モジュール５は、現在記録アドレスＡと前回記録アドレスＢを管理するものである。これらは例えばレジスタで構成される。現在記録アドレスＡは、現在のトレースログを仮記録すべきトレースメモリ１１でのアドレスであり、仮記録が完了する都度に、インクリメント等の処理により更新されるようになっている。前回記録アドレスＢは、仮記録が完了する都度に、元の現在記録アドレスＡをコピーしておくものである。トレースメモリアドレス管理モジュール５は、トレース制御モジュール３によるトレースログ仮記録処理時間Ｔが現在までにおいて最長のとき（前回よりも長いとき）は、トレースメモリ１１における次の現在記録アドレスＡとして更新後の現在記録アドレスＡを設定し、トレースログ仮記録処理時間Ｔが現在までにおいて最長でないときは、次の現在記録アドレスＡとして前回記録アドレスＢを設定することにより、現在記録アドレスＡの調整を行うように構成されている。すなわち、トレース制御モジュール３によるトレースログ仮記録処理時間Ｔが現在までにおいて最長のときは、トレースメモリ１１における更新後の現在記録アドレスＡを前回記録アドレスＢにコピーし、トレースログ仮記録処理時間Ｔが現在までにおいて最長でないときは、更新後の前回記録アドレスＢを現在記録アドレスＡにコピーする。トレースログ仮記録処理時間Ｔが現在までにおいて最長の場合に更新後の現在記録アドレスＡを前回記録アドレスＢにコピーするのは、いままさに仮記録が完了したばかりのトレースログの仮記録を本記録として確定していることになる。トレースログ仮記録処理時間Ｔが現在までにおいて最長でない場合に更新後の前回記録アドレスＢを現在記録アドレスＡにコピーするのは、いままさに仮記録が完了したばかりのトレースログの記録アドレスへの次のトレースログの上書きを許容し、いままさに仮記録が完了したばかりのトレースログの仮記録を破棄することに相当する。
【００４８】
更新タイミング制御モジュール６は、トレース制御モジュール３によるトレースログ仮記録処理時間Ｔが現在までにおいて最長か否かを判断し、その判断結果をトレースメモリアドレス管理モジュール５に与えるタイミングを制御するものとして構成されている。これが、上記のアドレスコピーのタイミングに利用される。なお、更新タイミング制御モジュール６における時間の管理については種々の方式があり、詳細は他の実施の形態において説明する。
【００４９】
図２は実施の形態１のプログラムデバッグ装置のトレースログを仮記録する動作を示すフローチャートである。
【００５０】
最初に、ＣＰＵ１がプログラムコードを実行する（ステップＳ０１）。
【００５１】
次に、トレース制御モジュール３は、ＣＰＵ１がプログラムを実行した処理の記録であるトレースログを取得する（ステップＳ０２）。
【００５２】
次に、トレース制御モジュール３は、イベント制御モジュール２からイベント成立状態を取得する（ステップＳ０３）。ＣＰＵ１によるプログラム実行処理があらかじめ管理しているイベントと等価であるときはイベント成立状態は有効であり、非等価であるときはイベント成立状態は無効である。
【００５３】
次に、トレース制御モジュール３は、取得したイベント成立状態からトレースログを仮記録するかしないかを判定する指示を作成する（ステップＳ０４）。イベント成立状態が有効のときはトレースログ仮記録の指示を作成し、イベント成立状態が無効のときはトレースログを仮記録しない指示を作成する。
【００５４】
次に、トレース制御モジュール３は、トレースログを仮記録する指示がＯＮか否かを判断し（ステップＳ０５）、トレースログを仮記録する指示がＯＮのとき、トレースメモリ１１の現在記録アドレスＡにトレースログを仮記録し、現在記録アドレスＡのインクリメント等によって更新する（ステップＳ０６）。現在記録アドレスＡをインクリメント等で更新するのは、トレースログ書き込み後に、次のトレースログを別のアドレスに書き込む準備をするためである。
【００５５】
一方、トレースログを仮記録する指示がＯＦＦのとき、トレースログを仮記録しない（ステップＳ０７）。
【００５６】
図３は実施の形態１のプログラムデバッグ装置のトレースメモリ１１のアドレスを操作する動作を示すフローチャートである。
【００５７】
最初に、任意の１つのイベントが成立してトレースログの仮記録を開始してから、さらに任意の１つのイベントが成立してトレースログの仮記録を終了したとき、トレースログの仮記録を開始してから終了するまでのプログラムのトレースログ仮記録処理時間Ｔが現在までにおいて最長か否かを判別する（ステップＳ１０）。
【００５８】
そして、トレースログ仮記録処理時間Ｔが現在までにおいて最長か否かに応じて処理を分岐する（ステップＳ２０）。
【００５９】
次に、トレースログ仮記録処理時間Ｔが現在までにおいて最長のとき、トレースログ記録確定制御手段４における更新タイミング制御モジュール６は、更新後の現在記録アドレスＡを前回記録アドレスＢにコピーするようトレースメモリアドレス管理モジュール５に出力する（ステップＳ３０）。このコピーにより、本記録が確定したトレースログのアドレスが前回記録アドレスＢとしてバックアップされたことになる。
【００６０】
一方、トレースログ仮記録処理時間Ｔが現在までにおいて最長ではないとき、更新タイミング制御モジュール６は、更新後の前回記録アドレスＢを現在記録アドレスＡにコピーするようトレースメモリアドレス管理モジュール５に出力する（ステップＳ４０）。このコピーによりアドレスを戻して上書きを許容して、いままさに仮記録が完了したばかりのトレースログの仮記録を破棄するためである。
【００６１】
すなわち、図２において、任意の１つのイベントが成立してトレースログの仮記録を開始し、さらに任意の１つのイベントが成立するまで現在記録アドレスＡに対して記録を行い、図３において、任意の１つのイベントが成立してトレースログの仮記録を開始し、さらに任意の１つのイベントが成立するまでのトレースログ仮記録処理時間Ｔが現在までにおいて最長であるときのみ、更新後の現在記録アドレスＡを前回記録アドレスＢにコピーし、トレースログの記録を確定する。また、トレースログ仮記録処理時間Ｔが現在までにおいて最長ではないとき、更新後の前回記録アドレスＢを現在記録アドレスＡにコピーし、アドレスを戻すことにより、仮記録したトレースログを破棄へと進める。
【００６２】
上記において、トレースログ仮記録処理時間Ｔが現在までにおいて最長であるときといっているが、記録されるトレースログの数が１つだけということにはならない。最長となるトレースログ仮記録処理時間Ｔが時間経過とともに長くなっていく。その都度の最長時間を見つけてはトレースログを仮記録している。結果として、トレースメモリ１１には複数のトレースログが記録されていることになる。記録時刻があとのトレースログほどトレースログ仮記録処理時間Ｔが長いものとなっている。この様子を図４に示す。
【００６３】
図４（ａ）はトレースログ仮記録処理時間Ｔの変遷を示し、図４（ｂ）はトレースメモリ１１に記録され残っているトレースログのトレースログ仮記録処理時間Ｔを示す。○印のトレースログが選択されてトレースメモリ１１に残り、×印のトレースログは破棄されている。
【００６４】
いま、動作の一例として、トレースログを記録すべきアドレスである現在記録アドレスＡとして、アドレス〔０１００〕が設定されているとする。そして、この現在記録アドレスＡ〔０１００〕においてトレースメモリ１１にトレースログＬ１が記録されたとする。記録されたので、アドレス〔０１００〕がインクリメントされてアドレス〔０２００〕になる。これで、次にトレースログを仮記録すべき記録先のアドレスの候補は、アドレス〔０２００〕と１回前のアドレス〔０１００〕となる。ここで、アドレス〔０２００〕が更新後の現在記録アドレスＡであり、アドレス〔０１００〕が更新後の前回記録アドレスＢである。次に更新後の現在記録アドレスＡと前回記録アドレスＢのいずれを設定するかは、トレースログ仮記録処理時間Ｔが現在までにおいて最長であるか否かの判断による。トレースログ仮記録処理時間Ｔが現在までにおいて最長であるとき更新後の現在記録アドレスＡのアドレス〔０２００〕が現在記録アドレスＡとして設定され、トレースログ仮記録処理時間Ｔが現在までにおいて最長ではないときは更新後の前回記録アドレスＢのアドレス〔０１００〕が現在記録アドレスＡとして設定される。更新後の現在記録アドレスＡが現在記録アドレスＡとして設定されたということは、前のアドレスがトレースログ記録の確定アドレスとされ、そこには上書きを許さないということを意味する。つまり、確定アドレスでの記録トレースログは、トレースログ仮記録処理時間Ｔが現在までにおいて最長のトレースログとして記録が確定されたものとなる。一方、更新後の前回記録アドレスＢが現在記録アドレスＡとして設定されたということは、そのアドレスにおいて上書きを許容するということであり、前に記録されていたトレースログは破棄されてもよいことを意味する。
【００６５】
（ａ１）さて、トレースログＬ１について前者のトレースログ仮記録処理時間Ｔが現在までにおいて最長であるときで更新後の現在記録アドレスＡのアドレス〔０２００〕が現在記録アドレスＡとして設定された場合、次のトレースログＬ２はその現在記録アドレスＡ〔０２００〕においてトレースメモリ１１に記録される。これで、トレースメモリ１１にはトレースログＬ１とトレースログＬ２とが記録されていることになる。ただし、トレースログＬ２についてはまだトレースログ仮記録処理時間Ｔが現在までにおいて最長か否かの判断はしていないので、その記録は確定的なものとはなっていない。記録されたので、アドレス〔０２００〕がインクリメントされてアドレス〔０３００〕になる。
【００６６】
（ｂ１）一方、トレースログＬ１について後者のトレースログ仮記録処理時間Ｔが現在までにおいて最長ではないときで更新後の前回記録アドレスＢのアドレス〔０１００〕が現在記録アドレスＡとして設定された場合、次のトレースログＬ２はその現在記録アドレスＡ〔０１００〕においてトレースメモリ１１に記録される。これで、トレースメモリ１１のアドレス〔０１００〕では、それまで記録されていたトレースログＬ１に対する上書きとしてトレースログＬ２が記録されることになる。すなわち、前に記録されていたトレースログＬ１は結果的に破棄されたことになる。記録されたので、アドレス〔０１００〕がインクリメントされてアドレス〔０２００〕になる。
【００６７】
（ａ２）上記の（ａ１）の続きで、トレースログＬ２についてトレースログ仮記録処理時間Ｔが現在までにおいて最長であれば、更新後の現在記録アドレスＡのアドレス〔０３００〕が現在記録アドレスＡとして設定され、こうなるとアドレス〔０２００〕は現在記録アドレスＡにはなりえないから、アドレス〔０２００〕におけるトレースログＬ２の記録は確定したことになる。トレースメモリ１１におけるトレースログ仮記録処理時間Ｔが現在までにおいて最長のトレースログは、トレースログＬ１とトレースログＬ２の２つとなる。
【００６８】
（ｂ２）上記の（ｂ１）の続きで、トレースログＬ２についてトレースログ仮記録処理時間Ｔが現在までにおいて最長であれば、更新後の現在記録アドレスＡのアドレス〔０２００〕が現在記録アドレスＡとして設定され、こうなるとアドレス〔０１００〕は現在記録アドレスＡにはなりえないから、アドレス〔０１００〕におけるトレースログＬ２の記録は確定したことになる。トレースメモリ１１におけるトレースログ仮記録処理時間Ｔが現在までにおいて最長のトレースログは、トレースログＬ２となる。
【００６９】
以上のように、トレースログを仮記録する指示が活性化されると、そのトレースログは一旦は必ずトレースメモリ１１に記録される。ただし確定ではなく、仮記録である。確定は、次のトレースログ仮記録処理時間Ｔが現在までにおいて最長か否かの判断に委ねられる。そして、確定するか破棄するかは、現在記録アドレスＡの調整の処理においてなされる。すなわち、トレースログ仮記録処理時間Ｔが現在までにおいて最長のときは、現在記録アドレスＡを更新後の現在記録アドレスＡ（一旦記録に伴ってインクリメントされたアドレス）とするとともに、仮記録を本記録として確定するために更新後の現在記録アドレスＡを前回記録アドレスＢにコピーする。トレースログ仮記録処理時間Ｔが現在までにおいて最長でないときは、現在記録アドレスＡを更新後の前回記録アドレスＢとする。このような方式が、本実施の形態の技術ポイントである。
【００７０】
本形態のプログラムデバッグ装置を用いることで、任意の１つのイベントが成立して、さらに任意の１つのイベントが成立するまでの最長となるトレースログ仮記録処理時間Ｔが更新されたときのトレースログを本記録することができ、不要なトレースログを破棄することができる。
【００７１】
多数にのぼるトレースログ群全体のうちからトレースログ仮記録処理時間Ｔが短時間側のトレースログ群を破棄し、トレースログ仮記録処理時間Ｔが長時間側のトレースログに絞り込んでトレースメモリに記録するようにしたので、トレースメモリ１１の容量に制限がある状態でも、ソフトウェア上の問題の可能性の高い側のトレースログを集約的に記録することができる。その結果、問題の発見および解決を迅速・容易化する上できわめて有効な対策となる。
【００７２】
また、記録するトレースログを絞り込むので、トレースメモリ１１の容量の過大な増加を回避することが可能となる。
【００７３】
（実施の形態２）
本発明の実施の形態２にかかわるプログラムデバッグ装置は、トレースメモリ１１に記録された複数のトレースログのうちからトレースログ仮記録処理時間Ｔが最も長い（最長中の最長の）トレースログを１つ指定できるように構成されたもので、さらにトレース開始アドレスを備えたものである。
【００７４】
図５は本発明の実施の形態２におけるプログラムデバッグ装置の構成を示すブロック図である。図５において、実施の形態１の図１におけるのと同じ符号は同一構成要素を指している。本実施の形態に特有の構成は、次のとおりである。トレースメモリアドレス管理モジュール５において、トレースメモリ１１のアドレスについて、さらに前回記録アドレスＢをバックアップコピーしておくためのトレース開始アドレスＣを保持している。前回記録アドレスＢをトレース開始アドレスＣにコピーするタイミングは、トレースログ仮記録処理時間Ｔが現在までにおいて最長となった場合である。更新タイミング制御モジュール６は、前回記録アドレスＢをトレース開始アドレスＣにコピーするタイミングを制御できる機能をさらに備えている。その他の構成については、実施の形態１と同様であるので説明を省略する。
【００７５】
図６は実施の形態２のプログラムデバッグ装置のトレースメモリ１１のアドレスを操作する動作を示すフローチャートであり、これは実施の形態１の場合の図３のフローチャートにステップＳ２１を追加したものに相当する。実施の形態１の場合の図２のフローチャートは本実施の形態に踏襲される。
【００７６】
ステップＳ２１において、更新タイミング制御モジュール６は前回記録アドレスＢをトレース開始アドレスＣにコピーするようトレースメモリアドレス管理モジュール５に出力する。すなわち、前回記録アドレスＢがコピーで変化してしまう前に、前回記録アドレスＢをトレース開始アドレスＣにコピーしてバックアップしておき、トレースログを仮記録したときのトレース開始アドレスＣを確保する。
【００７７】
いま、トレースログＬ１が現在記録アドレスＡ＝０１００に記録され、次いで現在記録アドレスＡが更新されて、現在記録アドレスＡ＝０２００になったとする。すると、前回記録アドレスＢは、繰り替わって、Ｂ＝０１００となる。このトレースログＬ１のトレースログ仮記録処理時間Ｔが現在までにおいて最長相当であれば、前回記録アドレスＢ＝０１００をトレース開始アドレスＣにコピーするので、トレース開始アドレスＣ＝０１００となる。これは、現在のトレースログ仮記録処理時間Ｔが現在までにおいて最長のトレースログＬ１の格納アドレスが〔０１００〕であることを意味している。次いで、更新後の現在記録アドレスＡ＝０２００を前回記録アドレスＢ（＝０１００）にコピーして更新するので、前回記録アドレスＢ＝０２００となる。
【００７８】
次にトレースログＬ２が現在記録アドレスＡ＝０２００に記録され、次いで現在記録アドレスＡが更新されて、現在記録アドレスＡ＝０３００になったとする。このトレースログＬ２のトレースログ仮記録処理時間Ｔが現在までにおいて最長相当であれば、前回記録アドレスＢ＝０２００をトレース開始アドレスＣにコピーして更新するので、トレース開始アドレスＣ＝０２００となる。これは、現在のトレースログ仮記録処理時間Ｔが現在までにおいて最長のトレースログＬ２の格納アドレスが〔０２００〕であることを意味している。次いで、更新後の現在記録アドレスＡ＝０３００を前回記録アドレスＢ（＝０２００）にコピーして更新するので、前回記録アドレスＢ＝０３００となる。
【００７９】
以上で明らかなように、仮記録から本記録として確定記録されたトレースログ群全体のうち最終に確定記録された１つのトレースログの記録先アドレスがトレース開始アドレスＣに保持されていることになる。
【００８０】
本実施の形態によれば、トレースメモリ１１に記録されているトレースログ群全体のうちでトレースログ仮記録処理時間Ｔが現在までにおいて最長の１つの（最長中の最長の）トレースログの記録先アドレスを特定することができる。その結果として、問題箇所のいち早い発見と解決を実現することができる。
【００８１】
なお、トレース開始アドレスＣを、Ｃ１，Ｃ２，…Ｃｎとｎ個保持する構成も考えられる。トレースログ仮記録処理時間Ｔが現在までにおいて最長となる第１回目において、そのときの確定記録のアドレスをトレース開始アドレスＣ１に記録する。
【００８２】
トレースログ仮記録処理時間Ｔが現在までにおいて最長となる第２回目において、第１回目の確定記録のトレース開始アドレスＣ１にあるアドレスをトレース開始アドレスＣ２にコピーし、現在の確定記録のアドレスをトレース開始アドレスＣ１に記録する。
【００８３】
同様に、トレースログ仮記録処理時間Ｔが現在までにおいて最長となる第３回目において、第１回目の確定記録のトレース開始アドレスＣ２にあるアドレスをトレース開始アドレスＣ３にコピーし、第２回目の確定記録のトレース開始アドレスＣ１にあるアドレスをトレース開始アドレスＣ２にコピーし、現在の確定記録のアドレスをトレース開始アドレスＣ１に記録する。
【００８４】
このような処理を繰り返すと、トレースログ仮記録処理時間Ｔが長いトレースログとして、最長のものから次に長いものへと順次にｎ個分のトレースログについてそれぞれの記録先アドレスを特定することができる。したがって、最長もののみ１つだけのトレースログでは問題を解析できない場合でも、ｎ番目までのトレースログを解析することにより、問題箇所の早急な発見と解決を実現することができる。
【００８５】
なお、トレースメモリ１１を複数個備え、各トレースメモリ１１にアドレスを振り分けた構成とすることも可能である。
【００８６】
（実施の形態３）
本発明の実施の形態３にかかわるプログラムデバッグ装置は、更新タイミング制御モジュール６において取り扱うべき時間情報について、それを生成する時間測定モジュールを外部に構成したものである。
【００８７】
図７は本発明の実施の形態３におけるプログラムデバッグ装置の構成を示すブロック図である。図７において、実施の形態１の図１におけるのと同じ符号は同一構成要素を指している。本実施の形態においては、時間測定モジュール７が追加されている。この時間測定モジュール７は、イベント制御モジュール２が出力するイベント成立状態を入力とし、イベント成立間の最長時間を測定することが可能で、最長時間を更新したかしていないかを判別した最長時間更新情報を更新タイミング制御モジュール６に出力するように構成されている。この最長時間更新情報を受け取る更新タイミング制御モジュール６は、入力した最長時間更新情報に基づいて、トレースメモリアドレス管理モジュール５が保持する現在記録アドレスＡと前回記録アドレスＢとの間のコピー処理のタイミングを制御できる構成になっている。すなわち、図３のフローチャートのステップＳ２０において、トレースログ仮記録処理時間Ｔが現在までにおいて最長かどうかを最長時間更新情報により判定できる。その他の構成および動作については、実施の形態１と同様であるので説明を省略する。本実施の形態のプログラムデバッグ装置の基本的動作は、実施の形態１の場合の図２、図３のフローチャートを踏襲するものである。
【００８８】
なお、更新タイミング制御モジュール６は、時間測定機能を含んだ構成でも実現できる。
【００８９】
なお、更新タイミング制御モジュール６は、イベント制御モジュール２を含んだ構成でも実現できる。
【００９０】
なお、更新タイミング制御モジュール６は、時間測定機能とイベント制御モジュール２を含んだ構成でも実現できる。
【００９１】
本実施の形態によれば、図２１の従来技術のトレース機能を搭載したプログラムデバッグ装置において、時間測定機能を追加したものに相当し、資源の再利用等の側面において、従来技術のプログラムデバッグ装置への応用展開を容易なものにする。
【００９２】
（実施の形態４）
本発明の実施の形態４にかかわるプログラムデバッグ装置は、更新タイミング制御をトレースログが付帯する時刻情報に基づいて行うように構成されたものである。
【００９３】
図８は本発明の実施の形態４におけるプログラムデバッグ装置の構成を示すブロック図である。図８において、実施の形態１の図１におけるのと同じ符号は同一構成要素を指している。本実施の形態においては、更新タイミング制御モジュール６は、時刻情報を付帯するトレースログを入力し、入力したトレースログの時刻情報に基づいて、最長時間を更新したか更新していないかを判別し、その判別結果である最長時間更新トレース情報をトレースメモリアドレス管理モジュール５に与えるように構成されている。トレースメモリアドレス管理モジュール５は、入力した最長時間更新トレース情報に基づいて、現在記録アドレスＡと前回記録アドレスＢとの間のコピー処理のタイミングを制御するように構成されている。その他の構成については、実施の形態１の場合と同様であるので、説明を省略する。
【００９４】
図９は時刻情報を付帯するトレースログの一例であり、個々のトレースログは、それぞれに個別の時刻情報を付帯している。
【００９５】
本実施の形態のプログラムデバッグ装置の基本的動作は、実施の形態１の場合の図２、図３のフローチャートを踏襲するものである。ただし、図３のステップＳ１０の動作が図１０のフローチャートに変更される。
【００９６】
図１０はトレースログ仮記録処理時間Ｔが現在までにおいて最長かどうかをトレースログの時刻情報を用いて判別するフローチャートである。
【００９７】
最初に、トレースログの仮記録を開始したとき、トレースログの時刻情報を取得する（ステップＳ５１）。
【００９８】
次に、トレースログの仮記録を終了したとき、トレースログの時刻情報を取得する（ステップＳ５２）。
【００９９】
次に、トレースログの仮記録を開始したときのトレースログの時刻情報と仮記録を終了したときのトレースログの時刻情報からトレースログ仮記録処理時間Ｔを計算する（ステップＳ５３）。
【０１００】
次に、今回計算したトレースログ仮記録処理時間Ｔを前回のトレースログ仮記録処理時間Ｔと比較して、今回のトレースログ仮記録処理時間Ｔが現在までにおいて最長かどうかを判別する（ステップＳ５４）。
【０１０１】
次に、トレースログ仮記録処理時間Ｔが現在までにおいて最長であるとき、トレースログ仮記録処理時間Ｔを前回トレースログ仮記録処理時間Ｔとして保存する。これが最長時間更新トレース情報である（ステップＳ５５）。
【０１０２】
すなわち、図３のフローチャートのステップＳ２０において、トレースログ仮記録処理時間Ｔが現在までにおいて最長かどうかの判別を、図１０のステップＳ５４によってトレースログ仮記録処理時間Ｔが現在までにおいて最長かどうかの判別で実現することができる。
【０１０３】
なお、トレースログに時刻情報がない場合においても、更新タイミング制御モジュール６が、トレースメモリ１１にトレースログの仮記録を開始した時点の検出と、トレースログの仮記録を終了した時点の検出を行い、トレースログ仮記録処理時間Ｔを割り出して、トレースログ仮記録処理時間Ｔが現在までにおいて最長かどうかを判別するように構成してもよい。
【０１０４】
本実施の形態によれば、時間測定モジュール７を含まないプログラムデバッグ装置においても、本発明が解決しようとする課題を解決することができる。
【０１０５】
（実施の形態５）
本発明の実施の形態５にかかわるプログラムデバッグ装置は、トレースログとイベントに基づいて更新タイミング制御を行うように構成されたものである。
【０１０６】
図１１は本発明の実施の形態５におけるプログラムデバッグ装置の構成を示すブロック図である。図１１において、実施の形態１の図１におけるのと同じ符号は同一構成要素を指している。本実施の形態においては、更新タイミング制御モジュール６は、トレースログを入力するとともに、イベント制御モジュール２が管理するイベントを入力し、これら入力したトレースログとイベントに基づいて、最長時間を更新したか更新していないかを判別できる最長時間更新イベントトレース情報を生成し、その最長時間更新イベントトレース情報をトレースメモリアドレス管理モジュール５に渡すように構成されている。
【０１０７】
トレースメモリアドレス管理モジュール５は、入力した最長時間更新イベントトレース情報に基づいて、現在記録アドレスＡと前回記録アドレスＢとの間のコピー処理のタイミングを制御するように構成されている。
【０１０８】
その他の構成については、実施の形態１と同様であるので、説明を省略する。本実施の形態のプログラムデバッグ装置の基本的動作は、実施の形態１の場合の図２、図３のフローチャートを踏襲するものである。ただし、図３のステップＳ１０の動作が図１２のフローチャートに変更される。
【０１０９】
図１２はトレースログ仮記録処理時間Ｔが現在までにおいて最長かどうかをトレースログとイベントを用いて判別するフローチャートである。
【０１１０】
最初に、トレースログの仮記録を開始する任意の１つのイベントとトレースログを比較し、一致したときの時刻情報を取得する（ステップＳ６１）。
【０１１１】
次に、トレースログの仮記録を終了するさらに任意の１つのイベントとトレースログを比較し、一致したときの時刻情報を取得する（ステップＳ６２）。
【０１１２】
次に、ステップＳ６１で取得した時刻情報とステップＳ６２で取得した時刻情報より、トレースログ仮記録処理時間Ｔを計算する（ステップＳ６３）。
【０１１３】
次に、計算したトレースログ仮記録処理時間Ｔと前回トレースログ仮記録処理時間Ｔと比較して、トレースログ仮記録処理時間Ｔが現在までにおいて最長かどうかを判別する（ステップＳ６４）。
【０１１４】
次に、トレースログ仮記録処理時間Ｔを前回トレースログ仮記録処理時間Ｔとして保存する（ステップＳ６５）。
【０１１５】
すなわち、図３のフローチャートのステップＳ１０，Ｓ２０における、トレースログ仮記録処理時間Ｔが現在までにおいて最長かどうかの判別を、図１２のステップＳ６１〜Ｓ６５によって行うことができる。
【０１１６】
なお、トレースログに時刻情報がない場合においても、更新タイミング制御モジュール６が時間を管理するようにして、トレースログ仮記録処理時間Ｔが現在までにおいて最長かどうかを判別するように構成することも可能である。
【０１１７】
本実施の形態によれば、時間測定モジュール７を含まないプログラムデバッグ装置においても、本発明が解決しようとする課題を解決することができる。
【０１１８】
（実施の形態６）
本発明の実施の形態６にかかわるプログラムデバッグ装置は、更新タイミング制御モジュール６の機能の有効化／無効化を行うように構成されたもので、更新タイミングマスク制御モジュールを備えたものである。
【０１１９】
図１３は本発明の実施の形態６におけるプログラムデバッグ装置の構成を示すブロック図である。図１３において、実施の形態１の図１におけるのと同じ符号は同一構成要素を指している。本実施の形態においては、更新タイミング制御モジュール６が行うところの現在記録アドレスＡの更新制御について有効／無効を設定する更新タイミングマスク制御モジュール８が追加されている。更新タイミングマスク制御モジュール８において有効が設定されたときは、更新タイミング制御モジュール６はその機能が有効化され、逆に、更新タイミングマスク制御モジュール８において無効が設定されたときは、更新タイミング制御モジュール６はその機能が無効化される。この現在記録アドレスＡの更新制御についての有効／無効の設定はユーザが行う。その他の構成については、実施の形態１と同様であるので、説明を省略する。
【０１２０】
図１４は実施の形態６のプログラムデバッグ装置においてトレースメモリ１１のアドレスを操作する動作を示すフローチャートである。実施の形態１の場合の図３のフローチャートのステップＳ２０がステップＳ２２に置き換わっている。実施の形態１の場合の図２のフローチャートは本実施の形態に踏襲される。
【０１２１】
最初に、任意の１つのイベントが成立してトレースログの仮記録を開始してから、さらに任意の１つのイベントが成立してトレースログの仮記録を終了したとき、トレースログの仮記録を開始してから終了するまでのプログラムのトレースログ仮記録処理時間Ｔが現在までにおいて最長か否かを判別する（ステップＳ１０）。
【０１２２】
そして、トレースログ仮記録処理時間Ｔが現在までにおいて最長で、かつ現在記録アドレスＡの更新制御が有効のときと、そうでないときとに応じて処理を分岐する（ステップＳ２２）。
【０１２３】
次に、トレースログ仮記録処理時間Ｔが現在までにおいて最長で、かつ現在記録アドレスＡの更新制御が有効のときは、トレースログ記録確定制御手段４における更新タイミング制御モジュール６は、更新後の現在記録アドレスＡを前回記録アドレスＢにコピーするようトレースメモリアドレス管理モジュール５に出力する（ステップＳ３０）。このコピーにより、本記録が確定したトレースログのアドレスが前回記録アドレスＢとしてバックアップされたことになる。
【０１２４】
一方、トレースログ仮記録処理時間Ｔが現在までにおいて最長ではないとき、または、現在記録アドレスＡの更新制御が無効のときは、更新タイミング制御モジュール６は、更新後の前回記録アドレスＢを現在記録アドレスＡにコピーするようトレースメモリアドレス管理モジュール５に出力する（ステップＳ４０）。このコピーにより、アドレスを戻して上書きを許容して、いままさに仮記録が完了したばかりのトレースログの仮記録を破棄する。
【０１２５】
すなわち、現在記録アドレスＡの更新制御を有効にしたときのアドレスの操作は、図３のフローチャートと同様のものとなる。
【０１２６】
一方、現在記録アドレスＡの更新制御を無効にしたときは、必ず更新後の前回記録アドレスＢを現在記録アドレスＡにコピーして、現在記録アドレスＡを戻すことにより、仮記録したトレースログを破棄する。
【０１２７】
プログラム実行直後は、最長となるトレースログ仮記録処理時間Ｔが更新されやすい。そこで、このようなトレースログは破棄することにすればよい。本実施の形態によれば、ソフトウェア上の問題を再現するパターンがある程度特定できている場合に、再現するパターンを開始する前に、現在記録アドレスＡの更新制御を有効にして、必要なトレースログのみを取得することができる。これによって問題箇所の早急な発見と解決を実現することができる。
【０１２８】
（実施の形態７）
本発明の実施の形態７にかかわるプログラムデバッグ装置は、ソフトウェア上の問題箇所の早急な発見と解決を図るべく、トレースログ仮記録処理時間Ｔの最長のときの波形を出力するように構成されたもので、外部トリガ出力モジュールを備えたものである。
【０１２９】
図１５は本発明の実施の形態７におけるプログラムデバッグ装置の構成を示すブロック図である。図１５において、実施の形態１の図１におけるのと同じ符号は同一構成要素を指している。本実施の形態に特有の構成は、外部トリガ出力モジュール９をさらに備えていることである。更新タイミング制御モジュール６は、現在記録アドレスＡの更新／非更新をアドレス更新情報として外部トリガ出力モジュール９に出力する機能をさらに備えるものとして構成されている。外部トリガ出力モジュール９は、アドレス更新情報を任意の波形で外部へ出力するように構成されている。その他の構成については、実施の形態１と同様であるので、説明を省略する。
【０１３０】
図１６は実施の形態７のプログラムデバッグ装置においてトレースメモリ１１のアドレスを操作する動作を示すフローチャートである。実施の形態１の場合の図３のフローチャートのステップＳ３０が図１６のステップＳ３１に置き換わっており、さらにステップＳ３２が追加されている。実施の形態１の場合の図２のフローチャートは本実施の形態に踏襲される。
【０１３１】
最初に、任意の１つのイベントが成立してトレースログの仮記録を開始してから、さらに任意の１つのイベントが成立してトレースログの仮記録を終了したとき、トレースログの仮記録を開始してから終了するまでのプログラムのトレースログ仮記録処理時間Ｔが現在までにおいて最長か否かを判別する（ステップＳ１０）。
【０１３２】
そして、トレースログ仮記録処理時間Ｔが現在までにおいて最長か否かに応じて処理を分岐する（ステップＳ２０）。
【０１３３】
次に、トレースログ仮記録処理時間Ｔが現在までにおいて最長のとき、トレースログ記録確定制御手段４における更新タイミング制御モジュール６は、更新後の現在記録アドレスＡを前回記録アドレスＢにコピーするようトレースメモリアドレス管理モジュール５に出力するとともに、同時に外部トリガ出力モジュール９にアドレス更新情報として出力する（ステップＳ３１）。このコピーにより、本記録が確定したトレースログのアドレスが前回記録アドレスＢとしてバックアップされたことになる。
【０１３４】
次いで外部トリガ出力モジュール９は、アドレス更新情報により、所定の波形を出力する（ステップＳ３２）。この点が本実施の形態のポイントである。
【０１３５】
一方、トレースログ仮記録処理時間Ｔが現在までにおいて最長ではないとき、更新タイミング制御モジュール６は、更新後の前回記録アドレスＢを現在記録アドレスＡにコピーするようトレースメモリアドレス管理モジュール５に出力する（ステップＳ４０）。このコピーにより、アドレスを戻して上書きを許容して、いままさに仮記録が完了したばかりのトレースログの仮記録を破棄する。
【０１３６】
本実施の形態によれば、最長となるトレースログ仮記録処理時間Ｔが更新されたときに、外部トリガ出力モジュール９が外部へ任意の波形を出力することができる。これにより、トレースログ仮記録処理時間Ｔの最長のときのアクチュエータ等の出力状態等の波形をオシロスコープ等によって取得することができ、問題発生時の波形とトレースログを解析することにより、問題箇所の早急な発見と解決を実現することができる。
【０１３７】
（実施の形態８）
本発明の実施の形態８にかかわるプログラムデバッグ装置は、ソフトウェア上の問題箇所の早急な発見と解決を図るべく、最長となるトレースログ仮記録処理時間Ｔが更新されたときにＣＰＵ１を停止させるように構成されたもので、ブレーク制御モジュールを備えたものである。
【０１３８】
図１７は本発明の実施の形態８におけるプログラムデバッグ装置の構成を示すブロック図である。図１７において、実施の形態１の図１におけるのと同じ符号は同一構成要素を指している。本実施の形態に特有の構成は、ブレーク制御モジュール１０をさらに備えていることである。更新タイミング制御モジュール６は、現在記録アドレスＡの更新／非更新を示すアドレス更新情報を出力できる機能をさらに備えている。ブレーク制御モジュール１０は、アドレス更新情報とＣＰＵ１の状態により、ＣＰＵ１を停止させるように構成されている。その他の構成については、実施の形態１と同様であるので、説明を省略する。
【０１３９】
図１８は実施の形態８のプログラムデバッグ装置においてトレースメモリ１１のアドレスを操作する動作を示すフローチャートである。実施の形態１の場合の図３のフローチャートのステップＳ３０が図１８のステップＳ３３に置き換わっており、さらにステップＳ３４が追加されている。実施の形態１の場合の図２のフローチャートは本実施の形態に踏襲される。
【０１４０】
最初に、任意の１つのイベントが成立してトレースログの仮記録を開始してから、さらに任意の１つのイベントが成立してトレースログの仮記録を終了したとき、トレースログの仮記録を開始してから終了するまでのプログラムのトレースログ仮記録処理時間Ｔが現在までにおいて最長か否かを判別する（ステップＳ１０）。
【０１４１】
そして、トレースログ仮記録処理時間Ｔが現在までにおいて最長か否かに応じて処理を分岐する（ステップＳ２０）。
【０１４２】
次に、トレースログ仮記録処理時間Ｔが現在までにおいて最長のとき、トレースログ記録確定制御手段４における更新タイミング制御モジュール６は、更新後の現在記録アドレスＡを前回記録アドレスＢにコピーするようトレースメモリアドレス管理モジュール５に出力するとともに、同時にブレーク制御モジュール１０にアドレス更新情報として出力する（ステップＳ３３）。このコピーにより、本記録が確定したトレースログのアドレスが前回記録アドレスＢとしてバックアップされたことになる。
【０１４３】
次いでブレーク制御モジュール１０はＣＰＵ１を停止させる（ステップＳ３４）。この点が本実施の形態のポイントである。
【０１４４】
一方、トレースログ仮記録処理時間Ｔが現在までにおいて最長ではないとき、更新タイミング制御モジュール６は、更新後の前回記録アドレスＢを現在記録アドレスＡにコピーするようトレースメモリアドレス管理モジュール５に出力する（ステップＳ４０）。このコピーにより、アドレスを戻して上書きを許容して、いままさに仮記録が完了したばかりのトレースログの仮記録を破棄する。
【０１４５】
本実施の形態によれば、最長となるトレースログ仮記録処理時間Ｔが更新されたときにＣＰＵ１を停止させることができる。これにより、トレースログ仮記録処理時間Ｔが最長のときのトレースログを用いてプログラムのデバッグを行うことができ、問題発生時の変数の状態や処理の状態をデバッグすることにより、問題箇所の早急な発見と解決を実現することができる。
【０１４６】
（実施の形態９）
本発明の実施の形態９はエミュレータシステムにかかわるものである。
【０１４７】
図１９は本発明にかかわるエミュレータシステム２０とその周辺の構成を示すブロック図である。
【０１４８】
エミュレータシステム２０は、ホストＩＦ回路２１、エミュレーション機能２２、エミュレーションＲＯＭ／ＲＡＭ２３、マイクロコンピュータ周辺回路２４および上述した実施の形態１〜８のいずれかのプログラムデバッグ装置Ｘから構成されている。３０はパソコン・ソフト、４０はユーザターゲットシステムである。
【０１４９】
ホストＩＦ回路２１は、パソコン・ホスト３０からデバッグの指令を受け、デバッグしている状態や結果をパソコン・ホスト３０に送信することができる。トレースログの送信も含まれる。
【０１５０】
プログラムデバッグ装置Ｘは、パソコン・ホスト３０からデバッグの指令を受け、内部のＣＰＵ１は、エミュレーション機能２２、エミュレーションＲＯＭ／ＲＡＭ２３、マイクロコンピュータ周辺回路２４の資源を利用してエミュレーションを行う。エミュレーション中、マイクロコンピュータ周辺回路２４によりユーザターゲットシステム４０を制御し、デバッグする。
【０１５１】
すなわち、エミュレータシステム２０により、ユーザターゲットシステム４０をデバッグ中、最長となるトレースログ仮記録処理時間Ｔが更新されたときのトレースログを取得し、パソコン・ホスト３０によりトレースログを解析することによって、問題箇所の早急な発見と解決を実現することができる。
【産業上の利用可能性】
【０１５２】
本発明のプログラムデバッグ装置は、ソフトウェア上の問題を含んでいる可能性が高いイベントに関係するトレースログのトレースメモリへの記録において、トレースログを効果的に絞り込み、再現性が低く解析が難しい問題の特定を迅速・容易化する上で有用である。
【図面の簡単な説明】
【０１５３】
【図１】本発明の実施の形態１におけるプログラムデバッグ装置の構成を示すブロック図
【図２】本発明の実施の形態１のプログラムデバッグ装置におけるトレースログ仮記録の動作を示すフローチャート
【図３】本発明の実施の形態１のプログラムデバッグ装置におけるトレースメモリのアドレス操作のフローチャート
【図４】本発明の実施の形態１におけるトレースログ仮記録処理時間の長さの変遷の様子の説明図
【図５】本発明の実施の形態２におけるプログラムデバッグ装置の構成を示すブロック図
【図６】本発明の実施の形態２のプログラムデバッグ装置における記録先アドレスの操作のフローチャート
【図７】本発明の実施の形態３におけるプログラムデバッグ装置の構成を示すブロック図
【図８】本本発明の実施の形態４におけるプログラムデバッグ装置の構成を示すブロック図
【図９】本発明の実施の形態４における時刻情報を付帯するトレースログの一例を示す図
【図１０】本発明の実施の形態４におけるトレースログ仮記録処理時間の判別のフローチャート
【図１１】本発明の実施の形態５におけるプログラムデバッグ装置の構成を示すブロック図
【図１２】本発明の実施の形態５におけるトレースログ仮記録処理時間の判別のフローチャート
【図１３】本発明の実施の形態６におけるプログラムデバッグ装置の構成を示すブロック図
【図１４】本発明の実施の形態６におけるトレースメモリのアドレス操作のフローチャート
【図１５】本発明の実施の形態７におけるプログラムデバッグ装置の構成を示すブロック図
【図１６】本発明の実施の形態７におけるトレースメモリのアドレス操作のフローチャート
【図１７】本発明の実施の形態８におけるプログラムデバッグ装置の構成を示すブロック図
【図１８】本発明の実施の形態８におけるトレースメモリのアドレス操作のフローチャート
【図１９】本発明にかかわるエミュレータシステムとその周辺の構成を示すブロック図
【図２０】従来技術のトレース機能とイベント機能を用いたプログラムデバッグ装置の構成を示すブロック図
【図２１】従来技術の時間測定機能を追加したプログラムデバッグ装置の構成を示すブロック図
【符号の説明】
【０１５４】
１  ＣＰＵ
２  イベント制御モジュール（イベント制御手段）
３  トレース制御モジュール（トレース制御手段）
４  トレースログ記録確定制御手段
５  トレースメモリアドレス管理モジュール（トレースメモリアドレス管理手段）
６  更新タイミング制御モジュール（更新タイミング制御手段）
７  時間測定モジュール（時間測定手段）
８  更新タイミングマスク制御モジュール（更新タイミングマスク制御手段）
９  外部トリガ出力モジュール（外部トリガ出力手段）
１０  ブレーク制御モジュール（ブレーク制御手段）
１１  トレースメモリ
２０  エミュレータシステム
２１  ホストＩＦ回路
２２  エミュレーション機能
２３  エミュレーションＲＯＭ／ＲＡＭ
２４  マイクロコンピュータ周辺回路
３０  パソコン・ホスト
４０  ユーザターゲットシステム
Ａ  現在記録アドレス
Ｂ  前回記録アドレス
Ｃ  トレース開始アドレス
Ｘ  プログラムデバッグ装置
【図１】
2010186361.tif 000003
【図２】
2010186361.tif 000004
【図３】
2010186361.tif 000005
【図４】
2010186361.tif 000006
【図５】
2010186361.tif 000007
【図６】
2010186361.tif 000008
【図７】
2010186361.tif 000009
【図８】
2010186361.tif 000010
【図９】
2010186361.tif 000011
【図１０】
2010186361.tif 000012
【図１１】
2010186361.tif 000013
【図１２】
2010186361.tif 000014
【図１３】
2010186361.tif 000015
【図１４】
2010186361.tif 000016
【図１５】
2010186361.tif 000017
【図１６】
2010186361.tif 000018
【図１７】
2010186361.tif 000019
【図１８】
2010186361.tif 000020
【図１９】
2010186361.tif 000021
【図２０】
2010186361.tif 000022
【図２１】
2010186361.tif 000023