(57)【特許請求の範囲】
【請求項１】
スタックポインタを備え、アプリケーションプログラムを１つ以上のタスクとして実行するプロセッサ部と、
スタック領域の範囲を記憶する記憶部と、
前記プロセッサ部が実行する前記タスクを切替えるディスパッチを行う際に、前記スタックポインタの値と前記記憶部が記憶する前記スタック領域を比較することにより、スタックのオーバーフローを検出するディスパッチャ部と、
特定レジスタの退避時及び復帰時の整合性チェックを行うデバッガ部と
を備えることを特徴とする情報処理システム。
【請求項２】
前記ディスパッチャ部は、前記スタックポインタの値をバッファリングすることを特徴とする請求項１に記載の情報処理システム。
【請求項３】
前記ディスパッチャ部は、前記スタックポインタの値および前記特定レジスタの状態をタスク単位にバッファリングすることを特徴とする請求項１に記載の情報処理システム。
【請求項４】
スタックポインタを備え、アプリケーションプログラムを１つ以上のタスクとして実行するプロセッサ部が実行する前記タスクを切替えるディスパッチを行う際若しくは発生した割り込み要求に対して割り込み処理を行う際に、
前記スタックポインタの値と記憶部が記憶するスタック領域を比較し、
当該比較の結果からスタックのオーバーフローを検出し、
特定レジスタの退避時及び復帰時の整合性チェックを行う
ことを特徴とするスタックオーバーフローの発生検出方法。
【請求項５】
情報処理装置で実行されるプログラムであって、
スタックポインタを備え、アプリケーションプログラムを１つ以上のタスクとして実行するプロセッサ部が実行する前記タスクを切替えるディスパッチを行う際若しくは発生した割り込み要求に対して割り込み処理を行う際に、
前記スタックポインタの値と記憶部が記憶するスタック領域を比較し、
当該比較の結果からスタックのオーバーフローを検出し、
特定レジスタの退避時及び復帰時の整合性チェックを行う
ことを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチタスクＯＳ上で動くアプリケーションソフトのプログラムに対して、スタックオーバーフローの発生を検出する機能を有するオペレーティングシステム（ＯＳ）及び情報処理システムに関する。
【背景技術】
【０００２】
マルチタスクＯＳ上で動くアプリケーションソフトや、マルチタスクＯＳを利用した組込みシステムが暴走した場合のデバッグ作業は、まずターゲットとなるハードウェア上に、コンパイル、リンクした実行可能オブジェクトをロードして、このオブジェクトを実際に動かすことにより、システムの暴走に起因するレジスタ破壊が起こるスタックのオーバーフローが起きていないこと確認している。
【０００３】
しかし、スタックのオーバーフローが起きても通常はすぐに暴走しないため、暴走する近傍でトレース情報を取っていてもトレース範囲外でオーバーフローしていることが多い。
【０００４】
オペレータがスタックのオーバーフローを検出する作業を実施する場合は、タスクから関数コールされる度にマイクロプロセッサにあるＳＰレジスタに格納されているスタックポインタ値を測定し、オーバーフローしていないか確認するという一連の手間と時間のかかる作業を強いられている。このため、実際にオーバーフローする箇所の検出作業は、非常に困難である。
【０００５】
スタックのオーバーフローを検出する方法に関する従来技術として、特許文献１乃至３に開示されている技術がある。
特許文献１に開示されているスタックのオーバーフローの検出方法は、プログラムの初期段階でタスク毎にスタック領域外のアドレスを専用レジスタ内に格納しておき、スタックポインタをスタック領域外アドレスが指している場合に、デバッガのブレーク機能を利用して、ブレークするというものである。
【０００６】
この方法の場合、マイクロプロセッサがスタック破壊検出用の専用レジスタを最低２つ備える必要があるが、一般的に入手できるマイクロプロセッサにはこのようなレジスタを持ったものはあまりない。
【０００７】
また、プログラムの初期化時にスタック領域外アドレスの設定を行うため、組込みシステムで広く行われるようなプログラムの途中でのタスクの動的生成を行う場合には使用できない。
【０００８】
更に特許文献１の方法では、レジスタが増えることにより、使用スタック量が更に増えてしまうという問題もある。
また関数の呼び出し毎にレジスタ値の保存及び比較を行うので、処理速度が低下してしまう。
【０００９】
更には、割り込みを利用してオーバーフローの発生を通知しているので、オーバーフローの発生箇所を特定できない。またスタックのオーバーフローが大きい場合には、検出できないという問題点もある。
【００１０】
また特許文献２には、スタック領域の境界に特定のパターンで埋めておき、そのパターンが書き換わっていないかチェックすることにより、オーバーフローを検出するという方法が開示されている。
【００１１】
この方法の場合、スタックの境界に埋める特定パターンと書き込まれてしまうデータが同じであった場合にはスタックのオーバーフローを検出できないという問題がある。
加えて、システム初期化時にパターンを埋めるという処理を行わなければならないため、初期化に非常に時間がかかってしまうという問題も含んでいる。
【００１２】
また特許文献３には、タイマ割込みによる割込みハンドラを利用して、現在のスタックポインタ値がスタックの範囲外になっていないか検出する方法が開示されている。
しかしタイマ割込みハンドラで全てをチェックするのは難しい。また割込み禁止状態やタイマ割込みよりも強いレベルの割込みの場合、タイマ割込みハンドラが起動できないため、スタックオーバーフローのチェックができないという問題がある。またＯＳ内部は割込み禁止で動くため、特にシステムコールの処理などＯＳ内部処理でオーバーフローが発生した場合、このようなオーバーフローは、タイマハンドラではチェックできない問題もある。
【特許文献１】特開２０００−２０３５２号公報
【特許文献２】特開２０００−７６０８１号公報
【特許文献３】特開２００４−１５７６６２号公報
【発明の開示】
【発明が解決しようとする課題】
【００１３】
そこで本発明は、スタックのオーバーフローにより起きたスタック破壊の検出について、オペレータの手間をかけずに検出できる情報処理システム、スタックオーバーフローの発生検出方法及びＯＳを提供することを課題とする。
【００１４】
また本発明は、動作に影響がある特定レジスタの情報とシステム時刻などの情報をバッファリングし、どのタイミングでレジスタ破壊が起きたのかということを確認する作業について、オペレータの手間をかけずに検出できる情報処理システム、スタックオーバーフローの発生検出方法及びＯＳを提供することを課題とする。
【課題を解決するための手段】
【００１５】
上記課題を解決するため、本発明の情報処理装置は、プロセッサ部、記憶部、及びディスパッチャ部を備える。
プロセッサ部は、スタックポインタを備え、アプリケーションプログラムを１つ以上のタスクとして実行する。
【００１６】
記憶部は、スタック領域の範囲を記憶する。
ディスパッチャ部は、前記プロセッサ部が実行する前記タスクを切替えるディスパッチを行う際に、前記スタックポインタの値と前記記憶部が記憶する前記スタック領域を比較することにより、スタックのオーバーフローを検出する。
【００１７】
また本発明のスタックオーバーフローの発生検出方法は、前記プロセッサ部が実行する前記タスクを切替えるディスパッチを行う際若しくは発生した割り込み要求に対して割り込み処理を行う際に、前記スタックポインタの値と記憶部が記憶するスタック領域を比較し、当該比較の結果からスタックのオーバーフローを検出する、ことを特徴とする。
【００１８】
また本発明のＯＳは、情報処理装置で起動されるにＯＳにおいて、前記プロセッサ部が実行する前記タスクを切替えるディスパッチを行う際若しくは発生した割り込み要求に対
して割り込み処理を行う際に、前記スタックポインタの値と記憶部が記憶するスタック領域を比較し、当該比較の結果からスタックのオーバーフローを検出することを前記情報処理装置に実行させることを特徴とする。
【発明の効果】
【００１９】
本情報処理装置によれば、例えばマルチタスクＯＳを用いたアプリケーション・ソフトウェアや、マルチタスクＯＳを用いた組込みシステムにおいて、システム暴走に起因するスタックのオーバーフローを起した箇所を簡単に検出することができる。
【００２０】
また動作に影響がある特定レジスタの情報とシステム時刻などの情報をバッファリングし、どのタイミングでレジスタ破壊が起きたのかということを確認する作業について、オペレータの手間をかけずに検出できる。
【発明を実施するための最良の形態】
【００２１】
以下に図面を参照しながら本発明の一実施形態について説明する。なお本発明の技術範囲は本実施形態に限定されるものではなく、特許請求の範囲に記載された事項とその均等物まで及ぶものである。
【００２２】
図１は、第１の実施形態のスタックオーバーフロー検出の原理的な説明のための機能ブロック図である。
図１では、マルチタスクＯＳを用いたアプリケーションソフトや、マルチタスクＯＳを用いた組込みシステム上で稼働するタスクからシステムコールを呼び、タスクのディスパッチが起きた場合に、ＯＳのディスパッチャ内部でスタックのオーバーフローが生じているかどうかを検出し、オーバーフローが生じている場合には、エラールーチンにジャンプさせる。
【００２３】
またディスパッチ時と同様に、割込みが発生した際も、ＯＳによる割込みハンドラ処理内でスタックのオーバーフローが生じているかどうかを検出し、オーバーフローを生じている場合は、エラールーチンにジャンプさせる。
【００２４】
このように第１の実施形態では、特許文献１の方法のようにＯＳが稼働するプロセッサ等に特別な構成を備えなくてもスタック領域のオーバーフローを検出することが出来る。
また、ＯＳ内部でスタックのオーバーフローの発生をチェックするため、組込みシステムで広く行われるようなプログラムの途中でのタスクの動的生成を行う場合にも対処することが出来る。
【００２５】
また特許文献２の方法のように、初期化時に大きな負荷となるような処理を行う必要がないので、初期化処理を素早くに行うことが出来る。
更には、ＯＳのディスパッチャ内部や割り込みハンドラ処理内でもチェックを行うので、ディスパッチ時や割り込みによって生じるスタックのオーバーフローの発生もチェックすることが出来る。
【００２６】
第１の実施形態ではマルチタスクＯＳを用いたアプリケーションソフトや、マルチタスクＯＳを用いた組込みシステムのスタックオーバーフローの検出をマルチタスクＯＳ内で行う。この第１の実施形態の詳細を図２乃至図５を用いて以下に説明する。
【００２７】
図２は、第１の実施形態のＯＳ若しくはタスクプログラムが組み込まれたＯＳが搭載される情報処理システムの構成ブロック図である。
同図の情報処理システム１ａはプロセッサ１１、入力装置１２、メモリ１３、及びモニタ１４がバス１５で接続された構成となっている。
【００２８】
メモリ１３には、マルチタスクＯＳ、スタック領域データ及びタスクプログラムを格納するものである。入力装置１２は、情報処理システム１ａがスタックのオーバーフローの検出を行うかどうかをオペレータに選択させるための入力機能を持つものである。モニタ１３は、スタックオーバーフローを検出した際に、エラーメッセージを出力するものである。
【００２９】
このような構成の情報処理システム１ａにおいて、プロセッサ１１がメモリ１３内のマルチタスクＯＳを起動することにより、図１に示したようなマルチタスクＯＳ内のディスパッチャ及び割り込みハンドラによるスタック領域のデータのオーバーフローを検出することが出来る。
【００３０】
図３は、第１の実施形態におけるマルチタスクＯＳが行うディスパッチャ処理を示すフローチャートである。
まずステップＳａ１として、アプリケーションプログラム等のタスクからＯＳの機能であるシステムコールを呼び出し、ディパッチが発生した場合、ディスパッチ処理を行うディスパッチャに処理が移る。
【００３１】
そのディスパッチャは、ステップＳａ２として、現在のスタックポインタの値と、メモリ１３内にあらかじめ記憶されているスタック領域の範囲を比較し、オーバーフローが発生していないかチェックする。そしてオーバーフローが発生していなければ（ステップＳａ２、オーバーフロー無し）、ディスパッチャは、ステップＳａ３として、レジスタ値の待避／復帰などのディスパッチ処理を行う。
【００３２】
また仮にスタックポインタ値が示すスタックがスタック領域の範囲をオーバーし、オーバーフローを起していた場合は（ステップＳａ２、オーバーフロー有り）、ステップＳａ３としてエラーが起きたことを知らせるエラールーチンを呼び出す。そして、ステップＳａ５としてエラールーチン内でスタックのオーバーフローが発生したことオペレータに知らせる。これを受けてエラールーチンは、ステップＳａ５として、モニタ１３にエラー情報の表示してオペレータにオーバーフローの発生を通知後、処理を終了する。
【００３３】
なお実際にモニタ１３にエラー通知を表示しない場合でも、エラールーチン内で無限ループ処理されていればオペレータはエラーが起きたことが分かるので、本実施形態はそのような方法でオペレータにエラー通知を行うことも含む。
【００３４】
図４は第１の実施形態における割込みハンドラ処理を示すフローチャートである。
何らかの理由により割込みが発生し、割込みハンドラの起動要求が発生した場合、ステップＳａ１１としてＯＳ内では発生した割込みに対応する処理を行う割込みハンドラを起動し、この割り込みハンドラに処理が移る。
【００３５】
起動された割込みハンドラは、ステップＳａ１２として現在のスタックポインタの値と、メモリ１３内にあらかじめ記憶されているスタック領域の範囲を比較し、オーバーフローが発生していないかチェックする。そしてオーバーフローが発生していなければ（ステップＳａ１２、オーバーフロー無し）、割り込みハンドラは、ステップＳａ１３として、レジスタ値の待避／復帰などの割り込みハンドラの処理を行う。
【００３６】
またステップＳａ１２において、仮にスタック領域の範囲をオーバーし、オーバーフローを起していた場合は（ステップＳａ１２、オーバーフロー無し）、割り込みハンドラは、ステップＳａ１３としてエラーが生じたことを知らせるエラールーチンを呼び出す。これを受けてエラールーチンは、ステップＳａ１５としてモニタ１３にエラー情報を表示する等の処理を行ってスタックのオーバーフローが発生したことオペレータに通知後、本処理を終了する。
【００３７】
なおこの割り込みハンドラ処理においても、エラー情報を実際にモニタ１３に表示しなくても、エラールーチン内で無限ループ処理されていればオペレータはエラーが起きたことが分かるので、本実施形態はそのような方法でオペレータにエラー通知を行うことも含む。
【００３８】
図５は第１の実施形態におけるスタックオーバーフロー検出のフローチャートである。スタック領域データをメモリから取得し、現在のスタックポインタがその領域内にあるかをチェックする。オーバーフローを起している場合はＮＧとし、エラールーチンに処理を移す。オーバーフローが発生していない場合は通常の処理を継続する。
【００３９】
図５は、第１の実施形態のディスパッチャ若しくは割り込みハンドラが行うスタックのオーバーフロー検出処理の詳細を示すフローチャートである。
同図では、まずステップＳａ２１としてメモリ１３からタスクのスタック領域を示すデータを取得する。
【００４０】
次にステップＳａ２２として、ディスパッチャ若しくは割り込みハンドラは、現在のスタックポインタが示す値がステップＳａ２１でメモリ１３から取得したタスクのスタック領域の範囲内かどうかをチェックする。そしてチェックの結果、スタックポインタの指す値がスタック領域の範囲内でありスタックのオーバーフローが発生していなければ（ステップＳａ２２、オーバーフロー無し）、ステップＳａ２３として通常処理を行った後本処理を終了する。
【００４１】
またステップＳａ２２において、ディスパッチャ若しくは割り込みハンドラは、チェックの結果からスタックポインタの指す値がスタック領域の範囲外であり、スタックのオーバーフローが発生していると判断したならば（ステップＳａ２２、オーバーフロー有り）、ステップＳａ２４としてＮＧ処理としてオペレータへのエラー通知等を行なった後、処理を終了する。
【００４２】
このように第１の実施形態におけるＯＳや情報処理システムでは、ディスパッチャ若しくは割り込みハンドラによって、ディスパッチ時や割り込み発生時にスタックのオーバーフローの検出をすることが出来る。
【００４３】
次に第２の実施形態について説明する。
図６は、第２の実施形態のスタックオーバーフロー検出の原理的な機能ブロック図である。
【００４４】
第２の実施形態では、マルチタスクＯＳを用いたアプリケーションソフトや、マルチタスクＯＳを用いた組込みシステムのスタックオーバーフローの検出をマルチタスクＯＳとデバッグ装置を連携させて行う。
【００４５】
第２の実施形態では、マルチタスクＯＳのディスパッチャや割り込みハンドラが起動された際、このディスパッチャや割り込みハンドラによって、このときのスタックポインタの値やシステム時刻等の情報をバッファリングする。そしてこの情報をデバッグ装置によってデータの解析を行い、統計情報やグラフを表示する。またこの解析結果から、スタックのオーバーフローが発生した箇所を特定し、該当箇所を表示する。
【００４６】
このように第２の実施形態では、スタックのオーバーフローの検出のみだけではなく、
オーバーフローが発生した箇所を特定することが出来る。この第２の実施形態の詳細については以下に図７乃至図１３を用いて説明する。
【００４７】
図７は、第２の実施形態及び後述する第３の実施形態における情報処理システムの構成ブロック図である。
第２の実施形態の情報処理システム１ｂは、第１の実施形態と同様の構成要素であるプロセッサ１１、入力装置１２、メモリ１３、及びモニタ１４に加え、デバッグ装置１６がバス１５に接続される構成となっている。
【００４８】
このうちメモリ１３には、マルチタスクＯＳ、スタック領域データおよびタスクプログラムが格納されている。またプログラムを動かして取得するトレース情報もメモリ１３内に格納する。入力装置１２は、スタックのオーバーフローを検出するのかどうかの選択をオペレータにさせるための入力機能を持っている。
【００４９】
デバッグ装置１６は、ＯＳでバッファリングしたトレース情報を解析し、スタックのオーバーフローが発生した箇所を検出する機能を持っている。モニタ１３は、デバッグ装置１６で解析したデータから、統計情報やグラフを表示する機能や、オーバーフロー箇所を出力する機能を持っている。
【００５０】
なおデバッグ装置１６がモニタ１３の機能を兼ね備える構成としても当然構わない。また図７では、デバッグ装置１６は、情報処理システム１ｂの独立した構成要素として記載されているが、本実施形態はこのような構成に限定されるものではなく、デバッグ装置１６をプロセッサ１１がプログラムを実行することにより、その全部あるいは一部をソフトウエア的手法によって実現するものであっても良い。
【００５１】
図８は、第２の実施形態及び後述する第３の実施形態において、ＯＳが収集したトレース情報から分析を行い、統計情報の表示やグラフ表示を行うデバッグ装置１６の構成を示すブロック図である。
【００５２】
同図においては、ユーザアプリケーション２１、リアルタイムＯＳ（ＲＴＯＳ）２２、及びデバッグモジュール２３が言語ツール２４によってコンパイル及びリンクされ、データ処理プログラムとしてのロードモジュールファイル２５が生成される。
【００５３】
なおここでＲＴＯＳ２２が用いられるのは、組込みシステムではユーザが、例えばボタンを押した時点でＯＳが処理する必要があり、そのためＲＴＯＳが用いられている。
ロードモジュールファイル２５は、開発処理を行うための統合開発環境（ＩＤＥ）２６に与えられる。
【００５４】
このＩＤＥ２６の内部には、アナライザＤＬＬ２７とデバッガＤＬＬ２８を備え、その中間にはＲＴＯＳインターフェースモジュール（ＲＩＭ）ＤＬＬ２９が備えられている。そしてアナライザＤＬＬ２７とＲＩＭＤＬＬ２９とは、ＲＴＯＳアクセスインターフェース（ＲＩＦ）によって接続されル構成となっている。またＲＩＭＤＬＬ２９とデバッガＤＬＬ２８はターゲットアクセスインターフェース（ＴＩＦ）によって接続されている。
【００５５】
デバッガＤＬＬ２８は、メモリアクセス部によってターゲット３１の内部のトレースメモリにアクセスすることができる。ターゲット３１は、例えばプロセッサ１１（及びメモリ１４）であり、その内部にはＲＴＯＳ２２、デバッグモジュール２１、ユーザアプリケーション２３が備えられ、またトレースメモリ３２が設けられている。このトレースメモリ３２は、ＯＳによるトレース内容が記録保持されるものである。
【００５６】
デバッガＤＬＬ２８は、ターゲット３１とＩＣＥ３０を介して接続されており、デバッガＤＬＬ２８は、ターゲット３１内のトレースメモリ３５へのアクセスはこのＩＣＥ３０を介して行われる。
【００５７】
ＩＣＥ（In-Circuit Emulator）３０は、ロードモジュールファイル２５をターゲット２５にロードしたり、ターゲット３１内にアクセしたりすることが出来るデバッガであり、ターゲット３０のレジスタ値やメモリダンプをデバッガＤＬＬ２８に出力する。
【００５８】
なお図７のデバッグ装置１６は、図８のＩＤＥ２６にＩＣＥ３０を加えたものが対応する。
ＲＴＯＳ２２は、ディスパッチや割り込みが発生する度にそのときのスタックポインタ値とシステム時刻等の情報をトレース内容としてトレースメモリ３５に記憶してゆく。
【００５９】
ＩＣＥ３０は、このトレースメモリ３５内の情報をダンプしてデバッガＤＬＬ２８に渡す。デバッガＤＬＬ２８は、この生データを文字データに変換する等の処理を行ってＲＩＭＤＬＬ２９に渡し、ＲＩＭＤＬＬ２９はこれを加工してアナライザＤＬＬ２７に渡す。そしてアナライザＤＬＬ２７は、ＲＩＭＤＬＬ２９から渡された情報を元に解析を行う。
【００６０】
図９は、デバッグ装置１６によるトレース情報取得手順を説明する図である。
同図ではまず、トレースメモリ３２に格納されているトレース情報の取得手順について説明する。
【００６１】
アナライザＤＬＬ２７に対してオペレータからトレースメモリのデータ取得要求が発生すると、（１）でユーザメモリ領域にあるトレースメモリ３２の内容を読み出すために、ＲＩＭＤＬＬ２９にトレースログの所得が要求され、（２）でＲＩＭＤＬＬ２９によってトレースメモリの内容を読み出す指示がデバッガＤＬＬ２８に与えられ、デバッガＤＬＬ２８から（３）でＩＣＥ３０を介してトレースメモリ３２に対するデータリードアクセスがなされる。
【００６２】
読み出されたトレースメモリの内容、すなわちトレース情報は、ＩＣＥ３０を介して（４）でデバッガＤＬＬ２８に通知され、デバッガＤＬＬ２８から（５）でＲＩＭＤＬＬ２９に通知される。そしてＲＩＭＤＬＬ２９によってアナライザＤＬＬ２７が必要とするデータが（６）でアナライザＤＬＬ２７に通知されて、アナライザＤＬＬ２７によるトレースメモリ３２のデータ取得が完了する。
【００６３】
図１０は第２の実施形態のリアルタイムＯＳにおけるディスパッチ処理を示すフローチャートである。
同図においてまず、ステップＳｃ１としてタスクからＯＳの機能であるシステムコールを呼び出し、ディパッチが発生した場合、ディスパッチ処理を行うディスパッチャに処理が移る。
【００６４】
このディスパッチャは現在のスタックポインタの値と、システム時刻などの情報をメモリ１２のトレースメモリ３５にバッファリングする。このバッファリングを終えた後に、ディスパッチャはレジスタの待避や復帰処理などのディスパッチ処理を行った後本処理を完了する。
【００６５】
図１１は第２の実施形態のリアルタイムＯＳにおける割込みハンドラ処理を示すフローチャートである。
何らかの理由により割込み若しくは割り込みからの復帰要求が発生し、割込みハンドラの起動要求が発生した場合、ステップＳｂ１１としてＯＳでは割込みに対応する処理を行
う割込みハンドラを起動し、割り込みハンドラに処理が移る。
【００６６】
割込みハンドラは、ステップＳｂ１２として現在のスタックポインタの値と、システム時刻等の情報をメモリ１３のトレースメモリ３５にバッファリングする。そしてこのバッファリングを終えた後に、割り込みハンドラは、ステップＳｂ１３としてレジスタ内容の退避や復帰処理などの割り込み処理を行った後、本処理を完了する。
【００６７】
このように第２の実施形態では、ディスパッチ時や割り込み発生時にトレース情報をメモリ１３のトレースメモリ３５にバッファリングすることが出来る。
図１２は第２の実施形態におけるアナライザＤＬＬ２７によるトレース情報のグラフ表示の例を示す図である。
【００６８】
同図は横軸のシステム時刻、縦軸にスタックポインタのアドレス値をタスク毎に取ってプロットしている。
また同図のグラフには、トレース情報から取得したスタック領域の限界値に境界線４１が引かれており、グラフがこれよりも大きい場合はスタックオーバーフローが起きていると判断できる。
【００６９】
なお図１２のグラフでは、システム時刻の代わりにサイクル数を横軸としても良い。
図１３は第２の実施形態におけるトレースメモリ３２にバッファリングされるトレース情報の例を示す図である。
【００７０】
同図においてトレースメモリ３２内には、タスク毎にトレース情報を記録保持しており、各トレース情報はスタック領域を示す情報、バッファリングのシステム時刻（若しくはサイクル数）、及びスタックポインタの値を情報として保持している。
【００７１】
例えば同図では、タスクＩＤが１のタスクのトレース情報として、スタック領域の先頭アドレス０ｘ０００１００００（０ｘは１６進数を表す）、最後尾アドレス０ｘ０００１０ＦＦＦ、システム時刻が１２ときのスタックポインタ値０ｘ０００１２４００、システム時刻が１００ときのスタックポインタ値０ｘ０００１２４００、・・・という情報が、各タスク毎に記録保持されている。
【００７２】
アナライザＤＬＬ２７は、このようなトレース情報をトレースメモリ３２から読出し、これを分析してスタックオーバーフローが発生した箇所を特定したり、図１２のようなグラフを表示したりする。
【００７３】
このように第２の実施形態では、スタックオーバーフローを検出するのみならず、トレース情報をバッファリングすることが出来、またこのトレース情報を分析してスタックのオーバーフローが発生した箇所を特定したり、スタックポインタ値の変化をグラフ表示してオペレータに示したりすることが出来る。
【００７４】
次に第３の実施形態について説明する。
第３の実施形態も第２の実施形態と同様、マルチタスクＯＳを用いたアプリケーションソフトや、マルチタスクＯＳを用いた組込みシステムのレジスタ破壊の検出を、マルチタスクＯＳとデバッグ装置を連携させて行う。
【００７５】
図１４は、第３実施形態のスタックオーバーフロー検出の原理的な機能ブロック図である。
第３の実施形態では、ディスパッチャや割り込みハンドラがディスパッチ元とディスパッチ先及び割り込み処理前と処理後それぞれにおいてトレース情報をバッファリングする
。そしてアナライザＤＬＬ２７は、これらのトレース情報を用いて解析を行う。これにより第２の実施形態で簡易的にしか行えなかったオーバーフローの検出を、スタックが破壊した時間範囲を絞ることが出来る。
【００７６】
図１４において、第３の実施形態のマルチタスクＯＳでは、タスクのディスパッチが発生してディスパッチャが呼ばれると、ディスパッチャはディスパッチ元及びディスパッチ先それぞれにおいて退避／復帰されるレジスタ情報をシステム時刻等と関連づけてバッファリングする。
【００７７】
また割り込みが発生し、割り込みハンドラの起動要求が発生すると、第３の実施形態のマルチタスクＯＳは割り込みハンドラを起動する。そして割り込みハンドラは割り込み処理を行う際、割り込み前の退避／復帰させるレジスタ情報と割り込み処理後の退避／復帰させたレジスタ情報をシステム時刻等と関連づけてバッファリングする。
【００７８】
そしてディスパッチャや割り込みハンドラでバッファリングされたデータは、ＩＣＥ３０経由でデバッグ装置１６に取り込まれ、デバッグ装置１６は、ディスパッチ元とディスパッチ先におけるレジスタ情報若しくは割り込み処理前と割り込み処理後のレジスタ情報を比較しつつ、データの解析、統計情報の生成及びグラフ表示を行う。またレジスタ破壊が起きている箇所を特定し、該当箇所を表示する。
【００７９】
このように第３の実施形態によれば、ディスパッチ元とディスパッチ先、或いは割り込み処理前と割り込み処理後とでレジスタ情報を比較して、解析を行うので、いつのどのディスパッチ（若しくは割り込み）によってスタック破壊が生じたかより正確に解析することが出来る。
【００８０】
次に第３の実施形態の処理についてより詳細に説明する。
なお第３の実施形態における情報処理システムの構成は、図７に示した第２の実施形態の情報処理システムと基本的には同じ構成であり、すなわちプロセッサ１１、入力装置１２、メモリ１３、及びモニタ１４に加え、デバッグ装置１６がバス１５に接続される構成となっている。
【００８１】
またデバッグ装置１６の構成も、図８に示した第２の実施形態のデバッグ装置１６と基本的に同じ構成で、アナライザＤＬＬ２７、デバッガＤＬＬ２８及びＲＩＭＤＬＬ２９を備えるＩＤＥ２６とＩＣＥ３０とから成っている。
【００８２】
また第３の実施形態におけるデバッグ装置１６によるターゲット３１からのトレース情報取得手順も、図９を用いて説明した第２の実施形態の場合と同じで、アナライザＤＬＬ２７は、ＩＣＥ３０によってターゲット３１内からデータを読出し、この生データをデバッガＤＬＬ２８及びＲＩＭＤＬＬ２９によって変換させてから取得する。
【００８３】
図１５は、第３の実施形態のリアルタイムＯＳにおけるディスパッチ処理を示すフローチャートである。
タスクからＯＳのシステムコールが呼び出されると、ディパッチ処理が発生し、ステップＳｃ１として、ＯＳではディスパッチ処理を行うディスパッチャに処理が移る。
【００８４】
ディスパッチャは、ステップＳｃ１２において各レジスタの現在の値と、システム時刻などの情報をトレース情報として、対応するタスクＩＤによって確保されているメモリ領域にバッファリングする。
【００８５】
そして次にディスパッチャは、ステップＳｃ３として別タスクへディスパッチするため
に各レジスタ内の値の退避／復帰処理を行い、その後、ステップＳｃ４としてディスパッチした先のタスクＩＤによって確保されているメモリ１４の領域に各レジスタの値や、システム時刻などの情報をトレース情報としてバッファリングした後処理を完了する。
【００８６】
このように第３の実施形態のディスパッチャでは、１度のディスパッチ処理でディスパッチを行う前と後の２回データのバッファリングを行う。
図１６は第３の実施形態のリアルタイムＯＳにおける割込みハンドラ処理を示すフローチャートである。
【００８７】
何らかの理由により割込み若しくは割り込みからの復帰要求が発生し、ＯＳに対して割込みハンドラの起動要求が生じた場合、ＯＳはステップＳｃ１１として割り込みハンドラを起動し、割り込みハンドラに処理を移す。
【００８８】
起動された割り込みハンドラは、ステップＳｃ１２として、各レジスタの現在の値と、システム時刻などの情報をトレース情報として対応するタスクＩＤによってメモリ１４内に割り当てられた領域にバッファリングする。このバッファリングが完了後に割り込みハンドラは、ステップＳｃ１３において割り込み処理としてレジスタの退避／復帰処理を行う。
【００８９】
そしてこの割り込み処理が完了後、割り込みハンドラは、ステップＳｃ１４としてタスクＩＤによってメモリ１４内に割り当てられた領域に各レジスタの値と、システム時刻などの情報をトレース情報として再度バッファリングした後処理を終了する。
【００９０】
このように第３の実施形態の割り込みハンドラでは、１度の割り込み若しくは割り込み復帰処理で割り込み処理（若しくは復帰処理）を行う前と後の２回データのバッファリングを行う。
【００９１】
図１７は第３の実施形態におけるデバッグ装置１６が行うレジスタ破壊検出箇所の表示を行う処理を示すフローチャートである。
アナライザＤＬＬ２７は、まずステップＳｃ２１として、図９に示したような処理を行ってメモリ１４からトレース情報を取得する。このトレース情報にはシステム時刻とそのときの各レジスタの値が対応づけられて記憶されている。
【００９２】
次にアナライザＤＬＬ２７は、ステップＳｃ２２において、タスクがディスパッチする前とそのタスクにディスパッチされたときの、或いは割り込み処理前と割り込み復帰後の、レジスタの退避／復帰処理前後のレジスタ情報で差分があるかチェックする。その結果差分があった場合（ステップＳｃ２２、差分有り）、レジスタ値が破壊されているので、ステップＳｃ２３としてメモリ１４内のトレース情報内にある差分があるかどうかを示す差分有りフラグを立て、ステップＳｃ２４としてメモリ１４から取得したトレース情報を分析する。この分析については後述する。
【００９３】
一方ステップＳｃ２２において差分がなかった場合には、レジスタ値の破壊は生じなかったので上記したステップＳｃ２３及びＳｃ２４の処理はスキップする。
次にステップＳｃ２１で取得したトレース情報やステップＳｃ２４の解析結果に基づいてグラフ表示を行なった後処理を終了する。
【００９４】
図１８は第３の実施形態においてメモリ１４にバッファリングされるトレース情報の例を示す図である。
トレース情報は、各タスク毎に構成されており、そのタスクのタスクＩＤ、各トレース情報のバッファリング時のシステム時刻（若しくはサイクル数）、そのシステム時刻にお
ける各レジスタの値及びレジスタ破壊フラグの値を記憶している。
【００９５】
例えば図１８では、タスクＩＤが１のタスクにおけるシステム時刻が１２、９５、２１４、８０５、９０７のときの各レジスタの退避／復帰処理時の値及びレジスタ破壊フラグの値が記録され、またタスクＩＤが２のタスクにおけるシステム時刻が１３、１００、１１０、４０２、８８８のときの各レジスタの退避／復帰処理時の値及びレジスタ破壊フラグの値が記録されている。
【００９６】
また同図のトレース情報を見ると、タスクＩＤが１のタスクにおけるシステム時刻が９５のときのレジスタ１の退避値（ＬＥＡＶＥ）が０ｘ００であるのに対して、次のシステム時刻が２１４のときのレジスタ１の復帰値（ＥＮＴＥＲ）が０ｘＦ０と異なっている。またタスクＩＤが１のタスクにおけるシステム時刻が２１４のときのレジスタ１の退避値（ＬＥＡＶＥ）が０ｘＦＦであるのに対して、次のシステム時刻が８０５のときのレジスタ１の復帰値（ＥＮＴＥＲ）が０ｘＦ０と異なっている。よってこれらのときのレジスタ破壊フラグの値は１となっており、このレジスタ破壊フラグが１の期間にレジスタ値の破壊が行われたことが解析できる。デバッガＤＬＬ２８は、このようにしてレジスタ値の破壊箇所を検出することが出来、またオペレータに表示することが出来る。
【００９７】
図１９は、第３の実施形態におけるトレース情報のグラフ表示例を示す図である。
同図では、割り込み処理によるタスクの切り替え時のトレース情報をグラフ表示を行った場合を例として示している。
【００９８】
図１９において、５２部分は処理が暴走している場合の、暴走５２以前のタスクの切替え状態を表している。またレジスタ破壊フラグの値から求めたレジスタ破壊箇所５１がタスクの切り替え状態と対比させて示されており、この図１９のグラフからどのタスク切り替え時にスタックのオーバーフローが発生してレジスタ値を破壊したかを特定できる。
【００９９】
このように第３の実施形態では、スタックのオーバーフローが発生した箇所をより厳密に特定することが出来、不良解析の手間を省くことが出来る。またタスクの遷移とレジスタ破壊箇所を明示的にグラフ化することが出来る。
【０１００】
図２０は、第１乃至第３の実施形態のＯＳやデバッグ装置のソフトウエアを格納する記憶媒体の例を示す図である。
第１乃至第３の実施形態の情報処理システム１では、不図示の媒体読み取り装置により磁気テープ、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等の記憶媒体に記憶されているＯＳやデバック装置のソフトウエアをネットワーク回線を介してメモリ１４にロードする。
【０１０１】
また、図２乃至図７に示した情報処理システム１では、ＣＤ−ＲＯＭ等の記憶媒体６６を用いてプログラムソフトの交換が行われる場合がある。よって、本発明は、情報処理システムやスタックオーバーフローの発生検出方法、ＯＳに限らず、情報処理装置６１により使用されたときに、上述した本発明の実施形態の機能を情報処理装置６１に行なわせるための情報処理装置６１が読み出し可能な記憶媒体６６やプログラムとして構成することもできる。
【０１０２】
この場合、「記憶媒体」には、ＣＤ−ＲＯＭ、フレキシブルディスク、あるいはＭＯ、ＤＶＤ、メモリーカード、リムーバブルハードディスク等の媒体駆動装置６７に脱着可能な可搬記憶媒体６６や、ネットワーク回線６３経由で送信される外部の装置内の記憶部６２、あるいは情報処理装置６１の本体６４内のＲＡＭ、ＲＯＭ又はハードディスク等のメモリ６５等が含まれる。可搬記憶媒体６６や記憶部６２に記憶されているプログラムは、ネットワーク回線６３を介して試験対象装置６１にロードされる。
【０１０３】
また、既に説明したＣＤ−ＲＯＭやＤＶＤ−ＲＯＭ等の記憶媒体には、上記に例として挙げたものの他にも、例えば、Ｂｌｕ−ｒａｙ  Ｄｉｓｃ（登録商標）やＡＯＤ（Ａｄｖａｎｃｅｄ  Ｏｐｔｉｃａｌ  Ｄｉｓｃ）などの青色レーザーを用いた次世代光ディスク記憶媒体、赤色レーザーを用いるＨＤ−ＤＶＤ９、青紫色レーザーを用いるＢｌｕｅ  Ｌａｓｅｒ  ＤＶＤ、ホログラムなど、今後開発される種々の大容量記憶媒体を用いて本発明を実施することも可能である。
【０１０４】
以上の実施形態に関し、更に以下の付記を開示する。
（付記１）
スタックポインタを備え、アプリケーションプログラムを１つ以上のタスクとして実行するプロセッサ部と、
スタック領域の範囲を記憶する記憶部と、
前記プロセッサ部が実行する前記タスクを切替えるディスパッチを行う際に、前記スタックポインタの値と前記記憶部が記憶する前記スタック領域を比較することにより、スタックのオーバーフローを検出するディスパッチャ部と
を備えることを特徴とする情報処理システム。
（付記２）
発生した割り込み要求に対して割り込み処理を行う際に、前記スタックポインタの値と前記記憶部が記憶する前記スタック領域を比較することにより、スタックのオーバーフローを検出する割り込みハンドラ部を更に備えることを特徴とする付記１に記載の情報処理装置。
（付記３）
前記ディスパッチャ部は、前記スタックポインタの値をバッファリングすることを特徴とする付記１に記載の情報処理装置。
（付記４）
前記ディスパッチャ部は、前記スタックポインタの値をシステム時刻と対応づけてバッファリングすることを特徴とする付記３に記載の情報処理装置。
（付記５）
前記ディスパッチャ部は、前記スタックポインタの値および特定レジスタの状態をタスク単位にバッファリングすることを特徴とする付記１に記載の情報処理装置。
（付記６）
前記バッファリングの結果に基づいて解析を行い、当該解析結果を出力するデバッガ部を更に備えることを特徴とする付記１に記載の情報処理装置。
（付記７）
前記デバッガ部は、前記解析結果を統計的に出力することを特徴とする付記６に記載の情報処理装置。
（付記８）
前記デバッガ部は、前記解析結果をグラフィカルに出力することを特徴とする付記６に記載の情報処理装置。
（付記９）
前記デバッガ部は、前記解析結果を時系列に出力することを特徴とする付記６に記載の情報処理装置。
（付記１０）
前記デバッガ部は、前記解析結果に基づいてレジスタ値の破壊箇所を検出することを特徴とする付記６に記載の情報処理装置。
（付記１１）
特定レジスタの退避／復帰時の整合性チェックを行うデバッガ部を更に備えることを特徴とする付記１に記載の情報処理装置。
（付記１２）
前記プロセッサ部が実行する前記タスクを切替えるディスパッチを行う際若しくは発生した割り込み要求に対して割り込み処理を行う際に、
前記スタックポインタの値と記憶部が記憶するスタック領域を比較し、
当該比較の結果からスタックのオーバーフローを検出する
ことを特徴とするスタックオーバーフローの発生検出方法。
（付記１３）
情報処理装置で起動されるＯＳにおいて、
前記プロセッサ部が実行する前記タスクを切替えるディスパッチを行う際若しくは発生した割り込み要求に対して割り込み処理を行う際に、
前記スタックポインタの値と記憶部が記憶するスタック領域を比較し、
当該比較の結果からスタックのオーバーフローを検出する
ことを前記情報処理装置に実行させることを特徴とするプログラム。
（付記１４）
前記オーバーフローを検出した際、エラールーチンを呼び出すことを前記情報処理装置に実行させることを特徴とする付記１３に記載のプログラム。
（付記１５）
前記プロセッサ部が実行する前記タスクを切替えるディスパッチを行う際若しくは発生した割り込み要求に対して割り込み処理を行う際に、特定レジスタの退避／復帰時の整合性チェックを行うことを特徴とする付記１３に記載のプログラム。
（付記１６）
前記プロセッサ部が実行する前記タスクを切替えるディスパッチを行う際若しくは発生した割り込み要求に対して割り込み処理を行う際に、スタックポインタの値およびシステム時刻をバッファリングすることを特徴とする付記１３に記載のプログラム。
（付記１７）
前記プロセッサ部が実行する前記タスクを切替えるディスパッチを行う際若しくは発生した割り込み要求に対して割り込み処理を行う際に、スタックポインタの値および特定レジスタの状態をタスク単位にバッファリングすることを特徴とする付記１３に記載のプログラム。
（付記１８）
前記バッファリングされたデータをデバッグ装置が取得可能とすることを特徴とする付記１６に記載のプログラム。
【図面の簡単な説明】
【０１０５】
【図１】第１の実施形態のスタックオーバーフロー検出の原理的な説明のための機能ブロック図である。
【図２】第１の実施形態のＯＳ若しくはタスクプログラムが組み込まれたＯＳが搭載される情報処理システムの構成ブロック図である。
【図３】第１の実施形態におけるマルチタスクＯＳが行うディスパッチャ処理を示すフローチャートである。
【図４】第１の実施形態における割込みハンドラ処理を示すフローチャートである。
【図５】第１の実施形態におけるスタックオーバーフロー検出のフローチャートである。
【図６】第２の実施形態のスタックオーバーフロー検出の原理的な機能ブロック図である。
【図７】第２の実施形態及び第３の実施形態における情報処理システムの構成ブロック図である。
【図８】第２の実施形態及び第３の実施形態におけるデバッグ装置の構成を示すブロック図である。
【図９】第２の実施形態及び第３の実施形態におけるデバッグ装置によるトレース情報取得手順を説明する図である。
【図１０】第２の実施形態のリアルタイムＯＳにおけるディスパッチ処理を示すフローチャートである。
【図１１】第２の実施形態のリアルタイムＯＳにおける割込みハンドラ処理を示すフローチャートである。
【図１２】第２の実施形態におけるアナライザＤＬＬによるトレース情報のグラフ表示の例を示す図である。
【図１３】第２の実施形態におけるトレースメモリにバッファリングされるトレース情報の例を示す図である。
【図１４】第３実施形態のスタックオーバーフロー検出の原理的な機能ブロック図である。
【図１５】第３の実施形態のリアルタイムＯＳにおけるディスパッチ処理を示すフローチャートである。
【図１６】第３の実施形態のリアルタイムＯＳにおける割込みハンドラ処理を示すフローチャートである。
【図１７】第３の実施形態におけるデバッグ装置が行うレジスタ破壊検出箇所の表示を行う処理を示すフローチャートである。
【図１８】第３の実施形態においてメモリにバッファリングされるトレース情報の例を示す図である。
【図１９】第３の実施形態におけるトレース情報のグラフ表示例を示す図である。
【図２０】記憶媒体の例を示す図である。
【符号の説明】
【０１０６】
１ａ、１ｂ      情報処理システム
１１      プロセッサ
１２      入力装置
１３      メモリ
１４      モニタ
１５      バス
１６      デバッグ装置
２１      デバッグモジュール
２２      リアルタイムＯＳ
２３      ユーザアプリケーション
２４      言語ツール
２５      ロードモジュールファイル
２６      ＩＤＥ
２７      アナライザＤＬＬ
２８      デバッガＤＬＬ
２９      ＲＩＭＤＬＬ
３０      ＩＣＥ
３１      ターゲット
３２      トレースメモリ
【図１】
0005125786.tif 000002
【図２】
0005125786.tif 000003
【図３】
0005125786.tif 000004
【図４】
0005125786.tif 000005
【図５】
0005125786.tif 000006
【図６】
0005125786.tif 000007
【図７】
0005125786.tif 000008
【図９】
0005125786.tif 000009
【図１０】
0005125786.tif 000010
【図１１】
0005125786.tif 000011
【図１２】
0005125786.tif 000012
【図１３】
0005125786.tif 000013
【図１４】
0005125786.tif 000014
【図１５】
0005125786.tif 000015
【図１６】
0005125786.tif 000016
【図１７】
0005125786.tif 000017
【図１８】
0005125786.tif 000018
【図１９】
0005125786.tif 000019
【図２０】
0005125786.tif 000020
【図８】
0005125786.tif 000021