JP2017162135A - 情報処理装置、デバッグシステムおよびスタックオーバフロー検出方法 - Google Patents
情報処理装置、デバッグシステムおよびスタックオーバフロー検出方法 Download PDFInfo
- Publication number
- JP2017162135A JP2017162135A JP2016045220A JP2016045220A JP2017162135A JP 2017162135 A JP2017162135 A JP 2017162135A JP 2016045220 A JP2016045220 A JP 2016045220A JP 2016045220 A JP2016045220 A JP 2016045220A JP 2017162135 A JP2017162135 A JP 2017162135A
- Authority
- JP
- Japan
- Prior art keywords
- stack
- task
- information
- program
- executed
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
【課題】通常のプログラムの実行への影響を抑えてスタックオーバフローの発生を速やかに検出するとともに、スタックオーバフローの要因特定の効率化を図る情報処理装置を提供する。【解決手段】マイコン1は、デバッグ対象となるプログラムに対応するタスクごとに該タスクの実行中に用いられるスタック領域が設けられる記憶部と、タスクの切替時に、切替え後のタスクに対して割当てられているスタック領域の開始位置を示す開始位置情報を記憶部のスタック領域以外の領域に格納するOS処理部11と、プログラムに対応するタスクを実行し、該タスクにおいて関数を実行するたびに、参照された最新のスタック情報の位置を示すスタックポインタと開始位置情報とに基づいて、スタックオーバフローが発生しているか否かを判定し、スタックオーバフローが発生したと判定した場合、実行中のタスクを停止させる第1の処理部13−1〜第nの処理部13−nと、を備える。【選択図】図1
Description
本発明は、プログラムのスタックオーバフローを検出する情報処理装置、デバッグシステムおよびスタックオーバフロー検出方法に関する。
組込みマイコン(マイクロコンピュータ)に搭載されるソフトウェアの開発においては、設計時にあらかじめ各タスクのスタックサイズを決定する。しかしながら、開発の途上で発生する関数処理の追加または修正などにより、各タスクが使用するスタック領域があらかじめ定められたスタックサイズより増大し、他タスクのスタック領域などの他のメモリ領域に格納された情報を破壊してしまうことがある。このように、各タスクが使用するスタック領域があらかじめ定められたスタックサイズを超える現象をスタックオーバフローと呼ぶ。実行中のタスクのスタックオーバフローが生じると、他のメモリ領域に格納された情報が破壊され、破壊された情報を用いるプログラムは正常な動作ができなくなる。
スタックオーバフローを検知してメモリ破壊を未然に防ぐための技術として、特許文献1では、リアルタイムOS(Operating System)を搭載した複数タスクが並行動作する組込みマイコンのプログラムにおいて、各タスクのスタックのスタックオーバフローの発生を、タイマ割込みを使用して検知する技術が開示されている。
しかしながら、上記特許文献1に記載の技術によれば、検知処理用のタイマ割込みハンドラが起動していない間、またはタイマ割込みがマスクされている間にスタックオーバフローが発生するとスタックオーバフローが検知されないままプログラムの処理が進んでしまう。このため、プログラムの誤動作が継続するとともに、スタックオーバフローが生じた時点とはメモリの内容が変化してしまい、スタックオーバフローの原因究明が困難になるという問題がある。
さらに、同時起動しているタスク数が多いと、検知処理用タイマ割込みハンドラの処理量が多くなり、通常のプログラムの処理時間を圧迫するという問題もある。
本発明は、上記に鑑みてなされたものであって、通常のプログラムの実行への影響を抑えてスタックオーバフローの発生を速やかに検出するとともに、スタックオーバフローの要因特定の効率化を図ることができる情報処理装置を得ることを目的とする。
上述した課題を解決し、目的を達成するために、本発明にかかる情報処理装置は、デバッグ対象となるプログラムに対応するタスクごとに該タスクの実行中に用いられる情報であるスタック情報を格納するためのスタック領域が設けられる記憶部、を備える。また、本発明にかかる情報処理装置は、タスクの切替時に、切替え後のタスクに対して割当てられているスタック領域の記憶部における開始位置を示す開始位置情報を記憶部のスタック領域以外の領域に格納する管理部、を備える。また、本発明にかかる情報処理装置は、プログラムに対応するタスクを実行し、該タスクにおいて関数を実行するたびに、参照された最新のスタック情報の記憶部における位置を示す情報であるスタックポインタと開始位置情報とに基づいて、スタックオーバフローが発生しているか否かを判定する判定処理を実施し、判定処理によりスタックオーバフローが発生したと判定した場合、実行中のタスクを停止させる処理部、を備える。
本発明によれば、通常のプログラムの実行への影響を抑えてスタックオーバフローの発生を速やかに検出するとともに、スタックオーバフローの要因特定の効率化を図ることができるという効果を奏する。
以下に、本発明の実施の形態にかかる情報処理装置、デバッグシステムおよびスタックオーバフロー検出方法を図面に基づいて詳細に説明する。なお、この実施の形態によりこの発明が限定されるものではない。
実施の形態.
図1は、本発明の実施の形態にかかるデバッグシステムの構成例を示す図である。図1に示すように、本実施の形態のデバッグシステムは、マイコン(マイクロコンピュータ)1、モニタ用PC(Personal Computer)2および表示装置3を備える。マイコン1は、例えば、組み込みマイコン等と呼ばれる情報処理装置であり、あらかじめ定められた機能を実現するために家電製品または機械等に組み込まれる装置である。マイコン1は、あらかじめ定められた機能を実現するためのプログラムを記憶しており、このプログラムを実行することにより、上記のあらかじめ定められた機能を実現する。このプログラムは、マイコン1の開発時において、プログラムの開発者であるユーザにより作成される。
図1は、本発明の実施の形態にかかるデバッグシステムの構成例を示す図である。図1に示すように、本実施の形態のデバッグシステムは、マイコン(マイクロコンピュータ)1、モニタ用PC(Personal Computer)2および表示装置3を備える。マイコン1は、例えば、組み込みマイコン等と呼ばれる情報処理装置であり、あらかじめ定められた機能を実現するために家電製品または機械等に組み込まれる装置である。マイコン1は、あらかじめ定められた機能を実現するためのプログラムを記憶しており、このプログラムを実行することにより、上記のあらかじめ定められた機能を実現する。このプログラムは、マイコン1の開発時において、プログラムの開発者であるユーザにより作成される。
モニタ用PC2は、マイコン1に搭載するプログラムの開発時に、プログラムをデバッグするために用いられる情報処理装置である。モニタ用PC2としては、PC等の汎用の情報処理装置を用いることができる。表示装置3は、ユーザが視認可能な情報を表示する装置であり、例えば、LED(Light Emitting Diode)等を用いることができる。また、表示装置3として、音声によりユーザへ情報を提示する装置を用いてもよい。モニタ用PC2には、その他一般的なPCとしての機能を有するが、以下では、一般的な機能の説明は省略し、本実施の形態のスタックオーバフロー検出方法およびデバッグ方法に関する機能について説明する。
図1に示すように、マイコン1は、OS処理部11、割込みハンドラ12、第1の処理部13−1〜第nの処理部13−n、汎用ポート14および通信部15を備える。OS処理部11は、マイコン1を構成する機器の基本動作の制御およびタスク管理等を実行するための基本プログラムであるOSプログラムを実行する管理部である。第1の処理部13−1〜第nの処理部13−nは、ユーザにより作成されたプログラムであるユーザプログラム、すなわち本実施の形態においてデバッグ対象となるプログラムを実行する処理部である。第1の処理部13−1〜第nの処理部13−nは、それぞれ異なるユーザプログラムを実行する。
汎用ポート14は、GPIO(General Purpose Input/Output)と呼ばれるポートであり、外部機器と接続するための汎用の入出力ポートである。本実施の形態では、図1に示すように、汎用ポート14に表示装置13が接続されている。通信部15は、UART(Universal Asynchronous Receiver Transmitter)等の送信器および受信器であり、RS(Recommended Standard)-232C等の通信規格に従った信号処理を行う回路である。
モニタ用PC2は、マイコン1を遠隔操作する遠隔操作処理部21と、RS-232C等の通信規格に従った信号処理を行う通信部22とを備える。遠隔操作処理部21は、ターミナルソフトウェア等と呼ばれる遠隔操作プログラムを実行する処理部である。
図2は、本実施の形態のマイコン1のハードウェア構成例を示す図である。図2に示すように、マイコン1は、プロセッサであるCPU(Central Processing Unit)101、RAM(Random Access Memory)102、ROM(Read Only Memory)103、汎用ポート104および通信部105を備える。汎用ポート104は、図1に示した汎用ポート14であり、通信部105は、図1に示した通信部15である。
ROM103は、読み出し専用のメモリであるが、書込みのための特殊な処理により書き換え可能なメモリであってもよい。ROM103は、あらかじめOSプログラム、ユーザプログラムなどのプログラムが格納される。
図1に示したOS処理部11、割込みハンドラ12、第1の処理部13−1〜第nの処理部13−nの機能は、CPU101が、ROM103に格納されたプログラムを実行することにより実現される。CPU101は、各プログラムの実行時にROM103およびRAM102にアクセスする。CPU101は、外部機器、例えば図1に示した表示装置3を、汎用ポート104を介して制御可能であり、通信部105を介して外部との通信を行うことができる。
図3は、本実施の形態のモニタ用PC2のハードウェア構成例を示す図である。図3に示すように、モニタ用PC2は、CPU201、メモリ202、通信部203、入力部204および表示部205を備える。通信部203は、図1に示した通信部22である。
メモリ202は、例えば、RAM、ROM、フラッシュメモリー、EPROM(Erasable Programmable Read Only Memory)、EEPROM(Electrically Erasable Programmable Read Only Memory)等の、不揮発性または揮発性の半導体メモリ、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、DVD(Digital Versatile Disk)等が該当する。
メモリ202には、遠隔操作処理部21を実現するためのプログラムが格納される。CPU201が、メモリ202に格納された遠隔操作処理部21を実現するためのプログラムを、入力部204、表示部205およびメモリ202を用いて実行することにより、遠隔操作処理部21が実現される。すなわち、遠隔操作処理部21は、CPU201、入力部204、表示部205およびメモリ202により実現される。
入力部204は、キーボード、マウス、タッチパネルなどであり、ユーザからの入力を受け付ける受信機である。表示部205は、液晶パネル、ディスプレイなどである。
次に、マイコン1に搭載するユーザプログラムの開発時におけるデバッグ方法について説明する。図4は、本実施の形態のマイコン1のメモリマップの一例を示す図である。図4に示したメモリマップは、RAM102およびROM103のメモリ領域全体に対応するメモリ空間を、メモリ空間における番地すなわちアドレスと該アドレスに格納される情報との対応として示したものである。メモリ空間では、1バイト(8ビット)ごとにアドレスが振られており、アドレスは一般に16進数で表記される。CPU101は、RAM102、ROM103、汎用ポート104、通信部105等のすべてのマイコン1内の機器を、メモリ空間を介して制御する。図4では、アドレス値は一番上を0番としており、上から下へ行くにつれてアドレス値が増えている。
図4に示したように、メモリ空間は、RAM領域300およびROM領域305を含む。ROM領域305は、上述したように各プログラム、すなわちOSプログラムおよびユーザプログラム等を含む。すなわちROM103には、OSプログラムおよびユーザプログラム等が格納される。図1に示した構成例のように、マイコン1が第1の処理部13−1〜第nの処理部13−nにそれぞれ対応するn個のユーザプログラムを実行可能な場合、ROM103にはn個のユーザプログラムが格納される。RAM領域300は、各プログラムの動作中にプログラムが使用する情報を含む。すなわちRAM102は、各プログラムの動作中にプログラムにより使用される。
図4に示した例では、RAM領域300は、I/O領域301、OS使用領域302、大域変数領域303およびユーザプログラム用スタック領域304で構成される。I/O領域301は、外部機器の制御用の領域であり、汎用ポート14および通信部15の制御のために用いられる領域である。I/O領域301はあらかじめ定められている。OS使用領域302は、OS処理部11により使用される領域である。大域変数領域303は、各プログラムが動作中に使用する大域変数用に用いられる領域である。ユーザプログラム用スタック領域304は、各ユーザプログラムの実行時に、局所変数の値等のCPU101内のレジスタの値を退避させる作業用領域であるスタック領域である。ここでは、並行して実行されるタスクはあらかじめ定められている前提とし、OS使用領域302、大域変数領域303およびユーザプログラム用スタック領域304は、CPU101の起動時に、決定される。すなわち、記憶部であるRAM102には、デバッグ対象となるプログラムに対応するタスクごとに該タスクの実行中に用いられる情報であるスタック情報を格納するためのスタック領域が設けられる。
各ユーザプログラムは、OS処理部11により、タスクとして管理される。ここでは、1つのユーザプログラムが1つのタスクに対応するとする。マイコン1では、複数のタスクが並行して動作することが許容されており、図4の例では、タスクA、タスクB、タスクCの3つのタスクが並行して動作する場合のメモリマップを示している。例えば、タスクAは第1の処理部13−1により実行され、タスクBは第2の処理部13−2により実行され、タスクAは図1では記載を省略している第3の処理部13−3により実行される。
ユーザプログラム用スタック領域304は、図4に示すように、ユーザプログラムのタスクごとに分割されて決定される。図4の例では、タスクA、タスクBおよびタスクCが起動している状態を示し、タスクA、タスクBおよびタスクCにそれぞれ対応するスタック領域であるスタック領域304a、304b、304cが決定されている。図4に示したTA_start、TB_start、TC_startは、それぞれタスクA、タスクB、タスクCのスタック領域として決定された領域の開始アドレス値を示している。
アドレス値TA_start、TB_start、TC_startは、優先度等の他のタスク情報とともに、OS使用領域302内のTCB(Task Control Block)と呼ばれる領域に、タスクごとに格納される。TCBに格納される情報は、OS処理部11によりタスク管理のために参照される。
複数のタスクが並行して動作する場合、CPU101は、実行中のタスクを切替えて動作する。タスクの切替え時には、CPU101内のレジスタに格納されている内容は、スタック領域およびTCBに退避させる。CPU101は、スタック領域には、CPU101内のレジスタに格納されている情報のうち、局所変数の値、関数の引数等の情報等の情報が退避させる。本実施の形態では、CPU101内のレジスタに格納されている情報のうち、スタック領域に退避させる情報をスタック情報と呼び、CPU101内のレジスタに格納されている情報のうち、TCBに格納される情報をタスク情報と呼ぶ。CPU101は、タスクの実行の再開時にはスタック領域およびTCBから、対応する値をCPU101内のレジスタに復帰させる。このような動作を行うことにより、複数のタスクの並行した動作が可能となる。
図4に示すspA、spB、spCは、それぞれスタック領域304a、304b、304c内で対応する各タスクスタックポインタ値(以下、スタックポインタという)を示している。スタックポインタは、各タスクにより参照された最新のスタック情報の記憶部すなわちRAM102における位置を示す情報である。スタックポインタは、実行中タスクに関しては、CPU101内にあるスタックポインタ格納用のレジスタに格納されている。実行待ち、または実行停止中等で実行されていないタスクのスタックポインタは、後述するタスクスイッチの実施タイミングで、CPU101内の他のレジスタ値とともにタスクごとのスタック領域に退避される。
図5は、マイコン1におけるタスクスイッチ動作すなわちタスクの切替え動作の一例を示すチャート図である。ここでは、タスクAからタスクBへの切替えを行う例を説明する。第1の処理部13−1は、タスクAを実行中であり(ステップS1)、第2の処理部13−2は、タスク実行待ちの状態である(ステップS2)。CPU101は、割込みが発生すると、割込みハンドラ12を起動する(ステップS3)。割込みハンドラ12は、OS処理部11に対してシステムコールを発行してタスクAからタスクBに切替えるタスクスイッチを依頼する(ステップS4)。このタスクスイッチを依頼するシステムコールは、タスクディスパッチ要求とも呼ばれる。
OS処理部11は、タスクスイッチを依頼するシステムコールを受けると、タスクスイッチ処理を実施し(ステップS5)、実行中のタスクをタスクAからタスクBに切替える。これにより、第2の処理部13−2は、タスクB実行中となる(ステップS6)。
ステップS5のタスクスイッチ処理においては、詳細には、OS処理部11は、まず、タスクAの実行待ち状態への遷移を第1の処理部13−1へ指示し(ステップS51)、第1の処理部13−1はタスクA実行待ち状態へ遷移する(ステップS52)。そして、OS処理部11は、以下に示すCPU101のレジスタに格納される情報の退避および復帰処理を実施する(ステップS53)。
・OS処理部11は、CPU101のレジスタ値の一部であるタスクAのスタック情報をタスクA用のスタック領域に退避させる。
・OS処理部11は、CPU101のレジスタ値の一部であるタスクAのタスク情報をタスクA用のTCBに退避させる。
・OS処理部11は、タスクB用のスタック領域に格納されている情報(スタック情報)をCPU101のレジスタに復帰させる。
・OS処理部11は、タスクB用のTCBに格納されている情報(タスク情報)をCPU101のレジスタに復帰させる。
・OS処理部11は、CPU101のレジスタ値の一部であるタスクAのスタック情報をタスクA用のスタック領域に退避させる。
・OS処理部11は、CPU101のレジスタ値の一部であるタスクAのタスク情報をタスクA用のTCBに退避させる。
・OS処理部11は、タスクB用のスタック領域に格納されている情報(スタック情報)をCPU101のレジスタに復帰させる。
・OS処理部11は、タスクB用のTCBに格納されている情報(タスク情報)をCPU101のレジスタに復帰させる。
ステップS53の後、OS処理部11は、タスクスイッチ先、すなわちタスクの切替え先であるタスクBのスタック領域開始アドレスTB_stratの値をタスクB用のTCBから取得し、大域変数のひとつであるT_startに格納する(ステップS54)。すなわち、管理部であるOS処理部11は、マルチタスク処理を管理し、タスクの切替時に、切替え後のタスクに対して割当てられているスタック領域のRAM102における開始位置を示す開始位置情報をRAM102のスタック領域以外の領域に格納する。そして、OS処理部11は、タスクBを実行中へ遷移させるよう第2の処理部13−2へ指示する(ステップS55)。
以上の動作により、タスクスイッチ処理が実施され、実行中のタスクに対応するスタック領域開始アドレスが開始位置情報としてT_startに格納される。本実施の形態では、ユーザプログラムにおける関数を呼び出すたびに、T_startとCPU101内にあるスタックポインタ格納用のレジスタに格納されている値、すなわち実行中のタスクの現在のスタックポインタの値とを比較することにより、スタックオーバフローが発生したかの判定が行われる。
スタック領域は、最後に格納された情報が最初に読み出されるよう構成されており、格納される情報が増えると、スタック領域の開始位置を示すスタックポイントがより若い数値を示す値となる。したがって、格納される情報が増えすぎると、スタックポイントはアドレス値の小さい側、すなわち図4の上側に移動していき、あらかじめ設定された各々のスタック領域の開始アドレスより上側になることも考えられる。図4に示す例では、spAはTA_startより下側であり、spBはTB_startより下側であるため、タスクAおよびタスクBのスタック情報は、あらかじめ定められたスタック領域内に収まることを示している。一方、spCはTC_startより上側であり、タスクCについては、あらかじめ定められたスタック領域内に収まらず、スタックオーバフローが発生している。
本実施の形態では、マイコン1は、ユーザプログラムにおける関数を呼び出すたびに、実行中のタスクのCPU101内にあるスタックポインタ格納用のレジスタに格納されているスタックポインタ値と、あらかじめ設定されたスタック領域の開始アドレスとを用いて、スタックポインタ値が対応するスタック領域内に収まるか否かすなわちスタックオーバフローが発生したか否かを判定する。スタックオーバフローは、関数呼び出しの時にスタック情報が格納されるフレームであるスタックフレームが生成されたタイミングで発生するケースがほとんどであるため、関数呼び出しの時に上記の判定を行うことにより、速やかにスタックオーバフローを検出することができる。例えば、スタックオーバフローが発生したか否かの判定処理を、ユーザプログラム内の全ての関数内の処理の先頭で実施するようユーザプログラムを構成しておく。
図6は、本実施の形態のスタックオーバフロー判定処理手順の一例を示すフローチャートである。図6では、タスクBが実行中に、スタックオーバフロー判定処理を実施する例を示している。図6に示すように、まず、タスクBを実行している第2の処理部13−2は、実行中のタスクであるタスクBのスタック領域先頭アドレス値であるT_startを参照する(ステップS21)。T_startには、上述したようにステップS54の処理により、実行中のタスクに対応するスタック領域の先頭アドレス値が格納されている。
第2の処理部13−2は、T_startの値と、CPU101内のレジスタに格納されているスタックポインタの値とに基づいて、スタックポインタがスタック領域内であるか否かを判断する(ステップS22)。スタックポインタがスタック領域内であると判断すると(ステップS22 Yes)、第2の処理部13−2は、スタックオーバフローが発生していないと判定し、スタックオーバフロー判定処理を終了し、通常のプログラムの処理に移る。
スタックポインタがスタック領域内でないと判断すると(ステップS22 No)、第2の処理部13−2は、スタックオーバフローの旨を、ユーザに対して表示する(ステップS23)。具体的には、第2の処理部13−2は、メモリマップのI/O領域301にアクセスすることにより、表示装置3に対して、汎用ポート14を介して、スタックオーバフローが発生したことを示す情報を表示するよう制御する。そして、表示装置3が、スタックオーバフローが発生したことを示す情報を表示する。表示装置3による表示の例は、例えば、表示装置3がLEDである場合、LEDの点灯である。
次に、第2の処理部13−2は、通信部15からの割込み以外の割込みをマスクし(ステップS24)、OS以外の全てのタスクを、システムコールを実行することにより停止させ(ステップS25)、スタックオーバフロー判定処理を終了する。実行中のタスクを停止させる場合には、タスクスイッチ処理と同様に、実行中のタスクに対応するCPU101内のレジスタに格納されている情報、すなわちスタック情報およびタスク情報を、それぞれ対応するスタック領域およびTCBに格納する。なお、以上の処理では、ステップS21〜ステップS25を、タスクを実行中の処理部、すなわち図6の例では第2の処理部13−2が実施する例を説明したが、ユーザプログラムの全てに対して、図6に示した処理を関数の呼び出し後の実施するように構成しておくことにより、タスクを実行するそれぞれの第1の処理部13−1〜第nの処理部13−nが、それぞれ同様の処理を実施する。すなわち、第1の処理部13−1〜第nの処理部13−nは、図6に示したユーザプログラムに対応するタスクを実行し、該タスクにおいて関数を実行するたびに、参照されたスタックポインタとT_startとに基づいて、スタックオーバフローが発生しているか否かを判定する判定処理を実施し、判定処理によりスタックオーバフローが発生したと判定した場合、実行中のタスクを停止させる処理部である。
また、ステップS24〜ステップS25は、スタックオーバフローと判定された後に、デバッグ用にマイコン1内の実行状態を保全するための処理の一例である。デバッグ用にマイコン1内の実行状態を保全するための処理は、少なくとも実行中のタスクを即座に停止させる処理を含むが、デバッグのためにマイコン1内の実行状態を保全することができる処理内容であればよく、ステップS24〜ステップS25の処理に限定されない。
上記のステップS25の処理により各タスクが停止された後は、図1に示したモニタ用PC2から、遠隔操作処理部21により、通信部22を介して、マイコン1のスタックオーバフロー発生時のスタック情報およびタスク情報を取得することが可能となる。具体的には、ユーザは、表示装置3の表示により、スタックオーバフローの発生を認識すると、モニタ用PC2の入力部204を操作することにより、遠隔操作処理部21を起動させる。そして、ユーザは、遠隔操作処理部21に対して、入力部204を介してマイコン1からスタック情報およびタスク情報を取得する指示を入力する。すなわち、モニタ用装置であるモニタ用PC2は、マイコン1から、上述した判定処理によりスタックオーバフローが発生したと判定された後、前記スタック領域に格納されている情報およびCPU101のレジスタ内に格納されている情報を取得する。
図7は、スタックオーバフローの発生時のモニタ用PC2の遠隔操作処理部21における動作手順の一例を示すフローチャートである。遠隔操作処理部21は、スタック情報およびタスク情報を取得する指示が入力されると、マイコン1に対してスタック情報およびタスク情報の取得を要求する(ステップS41)。ここでは、マイコン1に対しては、スタック領域に格納されている情報に加えてCPU101のレジスタ内に格納されている情報の取得を要求するようにしたが、いずれか一方の取得を要求しても良い。具体的には、遠隔操作処理部21は、通信部22を介して、マイコン1へスタック情報およびタスク情報の取得の要求を送信する。マイコン1では、通信部15を介して、スタック情報の取得の要求を受信すると、OS処理部11が、通信部15を介して、スタック領域に格納された情報であるスタック情報をモニタ用PC2へ送信する。
遠隔操作処理部21は、通信部22を介して、マイコン1からスタック情報およびタスク情報を受信する(ステップS42)と、スタック情報およびタスク情報を表示する(ステップS43)。具体的には、遠隔操作処理部21は、表示部205に、スタック情報を表示する。以上の処理により、ユーザは、マイコン1のスタックオーバフロー発生時のスタック情報を確認することができる。ユーザは、このスタック情報を用いて、マイコン1に搭載されたユーザプログラムのデバッグを実施する。例えば、ユーザは、ユーザプログラムのコンパイル時にコンパイルラまたはリンカから出力される実行形式のプログラムと、コンパイル前のプログラムすなわちソースコードにおける行番号と実行形式のプログラムにおけるアドレス情報の対応と、を用いて、取得したスタック情報を解析して、ユーザプログラムをデバッグする。
なお、上述したように、本実施の形態では、ユーザプログラムのすべての関数実行時に図6に示した処理が実行されるが、スタックオーバフローが発生しない場合は、図6に示した処理のうちステップS21およびステップS22が実施されるだけであり、デバッグ用の処理負荷は少なく、この処理の追加による実際のプログラムの処理への影響はほとんど無視できる。
また、ユーザプログラムのすべての関数内に図6に示した処理の全てを記述する必要は無く、スタックオーバフロー時の処理であるステップS23〜ステップS25をサブルーチンとして実装することも可能である。この場合、ステップS22で、Noと判断された場合に、サブルーチンをコールする形態をとれば、プログラム容量逼迫への影響を少なくすることができる。
また、あらかじめ図6に示した処理である判定処理をマクロ等のシンボルを用いてユーザプログラム上で定義しておけば、ユーザプログラムの関数内に図6に示した処理を記述する際、定義したマクロを記述すればよく、プログラム記述上の手間も軽減することができる。
以上のように、一般的なマイコン1の動作に、図6に示した処理および図5に示したステップS54を追加することで、動作中のユーザプログラムでスタックオーバフローが発生した際に、即座にスタックオーバフローを検知し、ユーザプログラムの各タスクを停止させて、スタックオーバフロー発生時のスタック情報、CPU101のレジスタの状態等を保全することができる。そして、ユーザは、保全された情報を、汎用的なPCであるモニタ用PC2を用いて取得することができる。このため、本実施の形態のデバッグシステムは、効率的なスタックオーバフローの要因特定の効率化を図ることができる。
一般に、実製品に搭載するプログラム(オブジェクト)とデバッグ時に用いるプログラム(オブジェクト)との差異があると、この差異により実行時の挙動が変わる。この差異が大きいと、実製品に搭載するプログラムで発生していたスタックオーバフローの現象が、デバッグ時に用いるプログラムで再現しない可能性がある。これに対し、本実施の形態では、ユーザプログラムに対して、図6に示した処理および図5に示したステップS54を追加するだけであるため、デバッグ時のプログラムと実製品に搭載するプログラムの差異が少ない。これにより、デバッグ時に実製品のプログラムの実行時におけるスタックオーバフローの再現性を高めることができる。
また、本実施の形態のデバッグシステムは、ICE(In-Circuit Emulator)(登録商標)等のデバッグ専用の機器等も不要のため低コストでスタックオーバフローを検知することができる。
以上の実施の形態に示した構成は、本発明の内容の一例を示すものであり、別の公知の技術と組み合わせることも可能であるし、本発明の要旨を逸脱しない範囲で、構成の一部を省略、変更することも可能である。
1 マイコン、2 モニタ用PC、3 表示装置、11 OS処理部、12 割り込みハンドラ、13−1〜13−n 第1の処理部〜第nの処理部、14,104 汎用ポート、15,22,105,203 通信部、21 遠隔操作処理部、101,201 CPU、102 RAM、103 ROM、202 メモリ、204 入力部、205 表示部。
Claims (6)
- デバッグ対象となるプログラムに対応するタスクごとに該タスクの実行中に用いられる情報であるスタック情報を格納するためのスタック領域が設けられる記憶部と、
タスクの切替時に、切替え後のタスクに対して割当てられている前記スタック領域の前記記憶部における開始位置を示す開始位置情報を前記記憶部の前記スタック領域以外の領域に格納する管理部と、
前記プログラムに対応するタスクを実行し、該タスクにおいて関数を実行するたびに、参照された最新の前記スタック情報の前記記憶部における位置を示す情報であるスタックポインタと前記開始位置情報とに基づいて、スタックオーバフローが発生しているか否かを判定する判定処理を実施し、前記判定処理によりスタックオーバフローが発生したと判定した場合、実行中のタスクを停止させる処理部と、
を備える情報処理装置。 - 前記処理部は、前記判定処理によりスタックオーバフローが発生したと判定した場合、表示装置にスタックオーバフローが発生したことを表示させる請求項1に記載の情報処理装置。
- 前記判定処理をシンボルとして定義しておく請求項1または2に記載の情報処理装置。
- 前記判定処理によりスタックオーバフローが発生したと判定した場合に実施する処理をサブルーチンとして定義しておく請求項1、2または3に記載の情報処理装置。
- デバッグ対象のプログラムが搭載される情報処理装置と、前記情報処理装置と通信可能なモニタ用装置と、を備えるデバッグシステムであって、
前記情報処理装置は、
タスクごとに該タスクの実行中に用いられる情報であるスタック情報を格納するためのスタック領域が設けられる記憶部と、
タスクの切替時に、切替え後のタスクに対して割当てられている前記スタック領域の前記記憶部における開始位置を示す開始位置情報を前記記憶部の前記スタック領域以外の領域に格納する管理部と、
前記プログラムに対応するタスクを実行し、該タスクにおいて関数を実行するたびに、参照された最新の前記スタック情報の前記記憶部における位置を示す情報であるスタックポインタと前記開始位置情報とに基づいて、スタックオーバフローが発生しているか否かを判定する判定処理を実施し、前記判定処理によりスタックオーバフローが発生したと判定した場合、実行中のタスクを停止させる処理部と、
を備え、
前記モニタ用装置は、
前記情報処理装置から、前記判定処理によりスタックオーバフローが発生したと判定された後、前記スタック領域に格納されている情報を取得するデバッグシステム。 - デバッグ対象となるプログラムが搭載され、タスクごとに該タスクの実行中に用いられる情報であるスタック情報を格納するためのスタック領域が設けられる記憶部を有する情報処理装置におけるスタックオーバフロー検出方法であって、
タスクの切替時に、切替え後のタスクに対して割当てられている前記スタック領域の前記記憶部における開始位置を示す開始位置情報を前記記憶部の前記スタック領域以外の領域に格納する第1のステップと、
前記プログラムに対応するタスクを実行し、該タスクにおいて関数を実行するたびに、参照された最新の前記スタック情報の前記記憶部における位置を示す情報であるスタックポインタと前記開始位置情報とに基づいて、スタックオーバフローが発生しているか否かを判定する判定処理を実施する第2のステップと、
前記判定処理によりスタックオーバフローが発生したと判定した場合、実行中のタスクを停止させる第3のステップと、
を含むスタックオーバフロー検出方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2016045220A JP2017162135A (ja) | 2016-03-09 | 2016-03-09 | 情報処理装置、デバッグシステムおよびスタックオーバフロー検出方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2016045220A JP2017162135A (ja) | 2016-03-09 | 2016-03-09 | 情報処理装置、デバッグシステムおよびスタックオーバフロー検出方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2017162135A true JP2017162135A (ja) | 2017-09-14 |
Family
ID=59853922
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2016045220A Pending JP2017162135A (ja) | 2016-03-09 | 2016-03-09 | 情報処理装置、デバッグシステムおよびスタックオーバフロー検出方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2017162135A (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112182559A (zh) * | 2020-10-09 | 2021-01-05 | Oppo广东移动通信有限公司 | 堆栈溢出检测方法、装置、电子设备和存储介质 |
KR20210063519A (ko) * | 2019-11-22 | 2021-06-02 | 현대오트론 주식회사 | 스택 결함 원인을 진단하는 방법 및 장치 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH03208132A (ja) * | 1990-01-09 | 1991-09-11 | Mitsubishi Electric Corp | シングルチツプマイクロコンピユータ |
JPH09259011A (ja) * | 1996-03-26 | 1997-10-03 | Fujitsu Ltd | ログ情報採取解析装置 |
JP2000020352A (ja) * | 1998-07-06 | 2000-01-21 | Mitsubishi Electric Corp | スタックオーバーフロー検出方法及びスタックアンダーフロー検出方法 |
US20040143824A1 (en) * | 2003-01-16 | 2004-07-22 | Kanoj Sarcar | Method and apparatus for detecting an overflow condition in a kernel stack during operating system development |
JP2012194786A (ja) * | 2011-03-16 | 2012-10-11 | Denso Corp | プログラム実行状況監視装置、および実行状況監視プログラム |
-
2016
- 2016-03-09 JP JP2016045220A patent/JP2017162135A/ja active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH03208132A (ja) * | 1990-01-09 | 1991-09-11 | Mitsubishi Electric Corp | シングルチツプマイクロコンピユータ |
JPH09259011A (ja) * | 1996-03-26 | 1997-10-03 | Fujitsu Ltd | ログ情報採取解析装置 |
JP2000020352A (ja) * | 1998-07-06 | 2000-01-21 | Mitsubishi Electric Corp | スタックオーバーフロー検出方法及びスタックアンダーフロー検出方法 |
US20040143824A1 (en) * | 2003-01-16 | 2004-07-22 | Kanoj Sarcar | Method and apparatus for detecting an overflow condition in a kernel stack during operating system development |
JP2012194786A (ja) * | 2011-03-16 | 2012-10-11 | Denso Corp | プログラム実行状況監視装置、および実行状況監視プログラム |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20210063519A (ko) * | 2019-11-22 | 2021-06-02 | 현대오트론 주식회사 | 스택 결함 원인을 진단하는 방법 및 장치 |
KR102300712B1 (ko) * | 2019-11-22 | 2021-09-13 | 현대오트론 주식회사 | 스택 결함 원인을 진단하는 방법 및 장치 |
CN112182559A (zh) * | 2020-10-09 | 2021-01-05 | Oppo广东移动通信有限公司 | 堆栈溢出检测方法、装置、电子设备和存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5405320B2 (ja) | 仮想計算機制御装置、仮想計算機制御方法及び仮想計算機制御プログラム | |
JP2012220990A (ja) | ハイパーバイザ置き換え方法および情報処理装置 | |
JP2009059005A (ja) | デバッグシステム、デバッグ装置および方法 | |
US9304789B2 (en) | Virtual machine control device, virtual machine control method, computer-readable recording medium, and integrated circuit | |
TW201942736A (zh) | 函式選取方法和伺服器 | |
JP2017162135A (ja) | 情報処理装置、デバッグシステムおよびスタックオーバフロー検出方法 | |
JP6879625B2 (ja) | プログラマブルコントローラ、管理装置および制御システム | |
CN105550575B (zh) | 一种未导出的函数地址和数据结构偏移的获取方法及装置 | |
JPWO2015128914A1 (ja) | ソフトウェア搭載機器及びソフトウェア更新方法 | |
CN104102482A (zh) | 一种嵌入式系统的控制台串口与应用串口复用方法及应用 | |
CN105446886A (zh) | 一种计算机程序调试方法和装置 | |
US10761512B2 (en) | Numerical controller | |
JP5365875B2 (ja) | 産業用コントローラ | |
CN113342376B (zh) | 一种针对物联网设备的操作系统进行升级的方法及装置 | |
EP2447837A2 (en) | Simulation apparatus, method, and computer-readable recording medium | |
US10936357B2 (en) | Semiconductor device | |
TW201430702A (zh) | 韌體更新方法及系統 | |
JP4571462B2 (ja) | マイクロコンピュータ | |
CN110740382A (zh) | 避免电视机非期望自动重启方法、装置、电视机及介质 | |
JP2018128767A (ja) | デバッグシステム及び半導体装置 | |
WO1990007739A1 (en) | Control method for robot | |
JP4647276B2 (ja) | 半導体回路装置 | |
KR20040076915A (ko) | 디지털 시그널 프로세서의 실시간 디버깅 방법 | |
JP5277217B2 (ja) | 情報処理装置およびコンピュータープログラム | |
JP2002366378A (ja) | プログラムのデバッグ装置及びデバッグ方法、並びに記憶媒体 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20170628 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20170704 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20180109 |