JP2002351695A - プログラムのデバッグ方法、デバッグ装置およびプログラムデバッグ用の記録媒体 - Google Patents

プログラムのデバッグ方法、デバッグ装置およびプログラムデバッグ用の記録媒体

Info

Publication number
JP2002351695A
JP2002351695A JP2001157591A JP2001157591A JP2002351695A JP 2002351695 A JP2002351695 A JP 2002351695A JP 2001157591 A JP2001157591 A JP 2001157591A JP 2001157591 A JP2001157591 A JP 2001157591A JP 2002351695 A JP2002351695 A JP 2002351695A
Authority
JP
Japan
Prior art keywords
program
execution
time
code area
real
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
Application number
JP2001157591A
Other languages
English (en)
Inventor
Masayoshi Kodama
将義 小玉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Panasonic Holdings Corp
Original Assignee
Matsushita Electric Industrial Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Matsushita Electric Industrial Co Ltd filed Critical Matsushita Electric Industrial Co Ltd
Priority to JP2001157591A priority Critical patent/JP2002351695A/ja
Publication of JP2002351695A publication Critical patent/JP2002351695A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

(57)【要約】 【課題】 リアルタイムOSを使用したマルチタスク・
システムのデバッグにおいて、関数ステップを実行した
場合に、ディスパッチ先タスクで実行を停止したり、複
数のタスクから共用される関数では他タスクにディスパ
ッチしているときはプログラムを停止しないようなデバ
ッグ方法を提供する。 【解決手段】 現在のSPレジスタ値を保存するステッ
プS301と、OSのディスパッチャに実行ブレークを
設定するステップS303と、OSのプログラムコード
領域外までプログラムの実行を進めるステップS307
と、前記ステップS307でのSP値と、前記ステップ
S301でのSP値との比較を行うステップS308と
を少なくとも含んでいる。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、プログラムのデバ
ッグ方法、特にリアルタイムOS上で並列に実行される
複数のタスクを持つアプリケーションをデバッグする方
法に関する。
【0002】
【従来の技術】プログラムの開発を行う場合、通常、1
つの大きなプログラムは、多くの小さなサブプログラム
に分割した状態で開発される。サブプログラムの大半
は、その中でさらに別のサブプログラムを呼び出して処
理が行われる。このようなプログラムのデバッグにおい
ては、最初から大きなプログラムの全体をデバッグする
のではなく、下層にあるサブプログラムから順次上層の
サブプログラムに向かってデバッグしていくことが多
い。この場合、デバッグが完了した下層のサブプログラ
ムには不具合が存在しないため、より上層のサブプログ
ラムをデバッグするときには、デバッグが完了した下層
のサブプログラムをブラックボックスとして扱っても問
題はない。
【0003】プログラムのデバッグ作業においては、プ
ログラムを1命令ずつ実行してレジスタやメモリなどの
変化を調べていくステップ実行がよく用いられる。この
場合、デバッグが完了したサブプログラムに対しては、
サブプログラムをステップ実行して変化を確認する必要
はなく、サブプログラムを一度に実行した後で変化を確
認すればよい。このため、プログラムのデバッグ作業を
行うほとんどのデバッガには、ステップ実行をしようと
している命令がサブプログラムの呼出し命令であった場
合、そのサブプログラム内を一度に実行してしまう関数
ステップ実行と呼ばれる機能をもっている。
【0004】ところで、プログラムの構成上いくつかの
並列的に行われる処理や、時間経過の管理を伴うような
処理を必要とする場合に、リアルタイムOSが使用され
ることがある。リアルタイムOSとは、タスクという単
位に分割された複数のプログラムを状況により切替えな
がら動作させるOS(オペレーティングシステム)であ
る。リアルタイムOSにおいては、OSに対するシステ
ムコールの発行や、割込みによるイベントの発生によ
り、実行中のタスクが切替えられる。このようなタスク
も、通常のプログラムと同様に幾つかのサブプログラム
に分割されて開発される。
【0005】このようなリアルタイムOS上で並列動作
する複数のタスクをデバッグする場合に、タスクを構成
するメインプログラム中にシステムコールが含まれてい
ると、そのシステムコールがCALL命令で呼出したメ
インプログラムに戻らないようなものであった場合で
も、その処理を正常に終了できるようにすることが要求
される。
【0006】具体的に説明するために、図8にOSを使
用しないプログラムの関数ステップについて、また、図
9にOSを使用したプログラムの関数ステップについ
て、それぞれのプログラムの挙動を示す。
【0007】まず図8において、ステップS801の命
令を実行するところで関数ステップを実行する。OSを
使用しないプログラムでは、図示のようにステップS8
02,S803と階層的に関数呼出しが行われようと
も、必ず元のステップS801のCALL命令の次にリ
ターンして戻ってくる。このような状況においては、現
状の関数ステップ機能はデバッグ作業者の意図通りの動
作を実現している。
【0008】一方、図9に示すようなOSを用いたプロ
グラムにおいて、第1のタスク第1のタスクtask1を実
行中にステップS901の命令を実行するところで図8
の場合と同様の関数ステップを実行したとする。OSを
使用するプログラムでは、その関数がシステムコールの
場合には、そのシステムコールの呼出しによってOS内
部コード領域に制御が移り(ステップS903)、さら
にディスパッチが発生して他のタスクに制御が移る場合
がある(task1→ task2)。次に、第2のタスクtask2に
おいてステップS902の命令(システムコール呼出
し)が実行されると、再度、OS内部コード領域に制御
が移り、元の第1のタスクtask1に戻る。従来の関数ス
テップ機能では、この第1のタスクtask1に戻ってきた
時点で初めてプログラムの実行が停止するが、他のタス
クの挙動次第やシステムコールの種類によっては、第1
のタスクtask1に戻って来るという保証はない。
【0009】さらに、第1のタスクtask1から第2のタ
スクtask2へ、あるいはその逆に、第2のタスクtask2か
ら第1のタスクtask1へといった、タスクの遷移を意識
しながらのデバッグを行いたい場合もあるが、従来の関
数ステップ機能では、そういったタスクの挙動を追跡す
ることも容易ではない。なぜなら、そのためにはOS内
部コード領域内を1命令ステップで追って行くことで
(S901→S903→S902)、他のタスクにディ
スパッチするまでの過程をデバッグ作業者が追跡する必
要があるからである。
【0010】しかし、多くの場合、アプリケーションの
デバッグ作業者は、OSのプログラムコードをブラック
ボックス的に使用する。また、OSのシステムコールの
動作そのものは安定している場合が多い。したがって、
OSのプログラムコード領域内をステップ実行で追跡し
ていくことは、工数的にも無駄な作業であると言える。
【0011】こういった要求の一部を実現した従来技術
として、特開平11−238003号公報に開示される
プロシージャ・ステップ処理方法がある。図10はこの
プロシージャ・ステップ処理方法を実施するデバッガの
動作処理フローを示したものである。
【0012】まず、プロシージャ・ステップ実行部N1
1における命令判別部N12では、ステップ実行中のプ
ログラムにおいて、実行する命令がCALL命令かどう
かを判別し(ステップS101)、CALL命令でなけ
れば(No)、その命令だけをステップ実行部N13で
実行し(ステップS102)、次いで終了する。
【0013】CALL命令の場合(Yes)は、関数判
別部N14がOS情報テーブルITから「システムコー
ルを特定するためのルール」、「自タスク終了システム
コールの情報」を読み出し、自タスク終了システムコー
ルかどうかを判別する(ステップS103)。その結
果、自タスク終了システムコールでないと判別された場
合は、通常関数実行部N15に通常の関数ステップを実
行させる(ステップS104)。通常の関数ステップ実
行の方法については公知であるので、説明を省略する。
【0014】自タスク終了システムコール(Yes)で
あれば、タスク終了関数実行部N16は、ユーザが設定
したイベントを退避し、全てのイベントブレークを解除
すなわち無効にする(ステップS105)。
【0015】次にOS情報テーブルITを参照して、自
タスク終了システムコールの終了位置情報(シンボル/
アドレス)を抽出し、OS終了アドレスを計算し、その
アドレスへ実行後イベントブレークを設定する(ステッ
プS106)。
【0016】タスク終了関数実行部N16およびリアル
タイム・エミュレーション部N17は、タスク終了関数
のリアルタイム・エミュレーションを開始する(ステッ
プS107)。
【0017】OS終了アドレスをアクセスしたことによ
り、実行後イベントブレークを検出すると(ステップS
108)、リアルタイム・エミュレーションを中断する
(ステップS109)。
【0018】次に、ステップS106で設定した実行後
イベントブレークを解除する(ステップS110)。
【0019】最後に、ステップS105で退避したユー
ザのイベントを復元し(ステップS111)、タスク終
了関数の実行を終了する。
【0020】以上で説明した方法により、自タスク終了
システムコールが呼び出されても、リアルタイムOSの
処理が終了した時点でプログラムの実行を中断させるこ
とができる。
【0021】さらに、もう1つの状況について説明す
る。1つのサブプログラムとして関数funcがあり、この
関数funcが第1および第2の2つのタスクtask1,task2
から共用して使われている場合を考える(図11)。ま
ず、第1のタスクtask1から共用関数funcを呼出す(S
1001→S1002)。呼出された関数funcの内部で
自タスクを待ち状態に移行させるシステムコールwai_fl
gを発行する(ステップS1003)。このシステムコ
ールwai_flgの呼出しに対して関数ステップを実行する
と、デバッガはステップS1006のブレーク位置に実
行ブレークを設定する。その後、関数ステップはプログ
ラムの実行を開始し、OS内部コード領域を経て(ステ
ップS1004)、第2のタスクtask2へディスパッチ
する。
【0022】ここで第2のタスクtask2でも同様に共用
関数funcを呼出す(ステップS1005)。第1のタス
クtask1の場合と同じようにステップS1002,S1
003を経由してOS内部コード領域に入る。もしここ
でステップS1003のシステムコールwai_flgの条件
を満たしているために第2のタスクtask2が待ち状態に
入らない場合は、ディスパッチは起こらずに、デバッガ
は第1のタスクtask1の実行時に設定した実行ブレーク
を検出し(ステップS1006)、プログラムの実行を
停止する。
【0023】しかし、今は第2のタスクtask2の実行中
であり、第1のタスクtask1の実行中以外での実行停止
はデバッグ作業者の意図とは異なっている。このような
挙動はデバッグ作業における混乱を招くと同時に、デバ
ッグにかかる工数を大きくしてしまう。
【0024】このような不都合を避けたいとする要求を
実現する従来技術として、イベントブレークを設定する
ときに、現在実行状態にあるタスクのIDもイベントブ
レークの付加情報として保持しておく方法がある。先ほ
どの例で言えば、第1のタスクtask1の実行中に関数ス
テップを実行する際に(ステップS1003)、イベン
トブレークを設定すると同時にOS内部情報を参照して
現在のタスクIDを保持する。次に、第2のタスクtask
2の実行中にイベントブレークを検出した場合は(ステ
ップS1006)、再度、OS内部情報を参照して現在
のタスクIDを獲得し、先ほど保持しておいたタスクI
Dと比較する。タスクIDを比較した結果、その値が一
致していれば同じタスクの実行中にプログラムが実行ブ
レークを検出したということが言えるため、プログラム
の実行を停止する。一方、タスクIDが一致していない
場合は、プログラムを停止させずに、再度プログラムの
実行を開始する。
【0025】以上で説明した内容により、共用のサブプ
ログラムがあった場合でも、デバッグ作業者の意図通り
に、同一タスクを実行中にのみプログラムの実行を停止
させることができる。
【0026】
【発明が解決しようとする課題】図10に示した自タス
ク終了システムコールを検出する従来の方法では、OS
内部でプログラムの実行が停止してしまうため、サブプ
ログラムであるリアルタイムOSのシステムコールをブ
ラックボックス的に使用することができない。さらに、
マルチタスク・システムでは、自タスク終了システムコ
ール以外でも、システムコールを発行したタスクに制御
が戻ってこない場合がある。
【0027】例えば他タスクを終了させる場合を考え
る。図12にその動作フローを示す。まず最初に第1の
タスクtask1が動作しているものとする。ここで自タス
クが待ち状態に入るシステムコールとしてwai_flgを実
行(ステップS201)し、第2のタスクtask2にディ
スパッチする。第2のタスクtask2では第1のタスクta
sk1を終了させるシステムコールとしてter_tskを実行
(ステップS202)する。その後も第2のタスクtask
2はそのまま処理を続行する。
【0028】このような状況において、ステップS20
1のwai_flgシステムコールを発行するところで、前記
のプロシージャ・ステップを実行した場合、wai_flgシ
ステムコール自体は「自タスクを終了するシステムコー
ル」ではないために、デバッガは通常の関数ステップと
して処理を行う。しかし、第2のタスクtask2の中で第
1のタスクtask1が終了してしまうため、従来の方法で
はプロシージャ・ステップ実行を停止させることができ
ない。
【0029】また、図9のところで説明したように、タ
スクの遷移を意識しながらステップ実行させる場合に
は、タスクが切替わる瞬間を捉え、ディスパッチ先タス
クがシステムコールから復帰したときに実行を停止させ
るようにすることが要求されるが、これを解決する有効
な方法は確立されていない。
【0030】さらに、図11のところで説明したよう
に、複数のタスクから共通に呼出される可能性のある共
用関数のデバッグ方法についても、従来の方法では各実
行ブレークを設定する毎に、タスクIDを保持する領域
を別途設ける必要がある。また、現在実行中のタスクI
DをリアルタイムOSから取得する方法が必要となり、
デバッグシステムがリアルタイムOSに強く依存したも
のになってしまう。
【0031】本発明の目的は、リアルタイムOSを使用
したマルチタスク・システムにおいて、システムコール
の種類に関係なく、ディスパッチ先タスクで実行を停止
させることで、タスクの遷移を把握することができるデ
バッグ方法および装置を提供することにある。
【0032】さらに、複数のタスクから共通に利用され
る共用関数があるようなマルチタスク・システムにおい
て、同一タスクでのみ実行が停止する関数ステップが可
能なデバッグ方法および装置を提供することにある。
【0033】本発明の他の目的は、こういったデバッグ
方法を実施するプログラムを記録した記録媒体を提供す
ることにある。
【0034】
【課題を解決するための手段】本発明のリアルタイムO
S上で並列に実行される複数のタスクをデバッグする方
法は、次のような複数のステップを含んだものである。
すなわち、現在のスタックポインタ値を保存するステッ
プと、リアルタイムOSの内部情報を保持するステップ
と、現在のプログラムカウンタが指している命令の次の
命令位置に第1の実行ブレークを設定し、かつ同時に前
記内部情報を参照してリアルタイムOS内部にも第2の
実行ブレークを設定してプログラムの実行を開始するス
テップと、プログラムの実行がブレークによって停止し
たときに前記第1実行ブレークと前記第2実行ブレーク
の設定解除を行い、そのときのブレーク要因が前記第1
の実行ブレークか前記第2の実行ブレークかを判別する
ステップと、前記第2の実行ブレークでプログラムが停
止したのであれば、前記内部情報を参照してリアルタイ
ムOSプログラムコード領域から、アプリケーションプ
ログラムコード領域までプログラムカウンタを進めるス
テップと、前記アプリケーションプログラムコード領域
までプログラムカウンタが進んだ後に、現在のスタック
ポインタ値と予め保存しておいたスタックポインタの値
が一致すれば関数ステップの実行を終了するステップと
を含んでいる。
【0035】リアルタイムOS上で並列に実行される複
数のタスクをデバッグする装置は、次のような複数の手
段を備えている。すなわち、現在のスタックポインタ値
を保存する手段と、リアルタイムOSの内部情報を保持
する手段と、現在のプログラムカウンタが指している命
令の次の命令位置に第1の実行ブレークを設定し、かつ
同時に前記内部情報を参照してリアルタイムOS内部に
も第2の実行ブレークを設定してプログラムの実行を開
始する手段と、プログラムの実行がブレークによって停
止したときに前記第1実行ブレークと前記第2実行ブレ
ークの設定解除を行い、そのときのブレーク要因が前記
第1の実行ブレークか前記第2の実行ブレークかを判別
する手段と、前記第2の実行ブレークでプログラムが停
止したのであれば、前記内部情報を参照してリアルタイ
ムOSプログラムコード領域から、アプリケーションプ
ログラムコード領域までプログラムカウンタを進める手
段と、前記アプリケーションプログラムコード領域まで
プログラムカウンタが進んだ後に、現在のスタックポイ
ンタ値と予め保存しておいたスタックポインタの値が一
致すれば関数ステップの実行を終了する手段とを有して
いる。
【0036】さらに本発明のリアルタイムOS上で並列
に実行される複数のタスクをデバッグするプログラムを
記録した記録媒体は、次のような複数のステップを含ん
だプログラムを記録している。すなわち、現在のスタッ
クポインタ値を保存するステップと、リアルタイムOS
の内部情報を保持するステップと、現在のプログラムカ
ウンタが指している命令の次の命令位置に第1の実行ブ
レークを設定し、かつ同時に前記内部情報を参照してリ
アルタイムOS内部にも第2の実行ブレークを設定して
プログラムの実行を開始するステップと、プログラムの
実行がブレークによって停止したときに前記第1実行ブ
レークと前記第2実行ブレークの設定解除を行い、その
ときのブレーク要因が前記第1の実行ブレークか前記第
2の実行ブレークかを判別するステップと、前記第2の
実行ブレークでプログラムが停止したのであれば、前記
内部情報を参照してリアルタイムOSプログラムコード
領域から、アプリケーションプログラムコード領域まで
プログラムカウンタを進めるステップと、前記アプリケ
ーションプログラムコード領域までプログラムカウンタ
が進んだ後に、現在のスタックポインタ値と予め保存し
ておいたスタックポインタの値が一致すれば関数ステッ
プの実行を終了するステップとを含んだ構成のプログラ
ムを記録している記録媒体である。
【0037】本発明によれば、デバッガにリアルタイム
OSの内部情報をもたせ、現在のプログラムカウンタが
指している命令の次の命令位置と、OS内部ディスパッ
チャ関数に実行ブレークを設定して、リアルタイムOS
における関数ステップを実行し、後者の実行ブレークで
実行が停止した場合は、プログラムカウンタをリアルタ
イムOSプログラムコード領域外を指すところまで進め
ることにより、システムコールの種類に関係なく、ディ
スパッチ先タスクでプログラムの実行を停止させる。
【0038】さらに、リアルタイムOSにおける関数ス
テップ実行を、現在のスタックポインタの値を保存し、
デバッガにリアルタイムOSの内部情報をもたせ、現在
のプログラムカウンタが指している命令の次の命令位置
と、OS内部ディスパッチャ関数に実行ブレークを設定
して実行し、後者の実行ブレークで実行が停止した場合
は、プログラムカウンタをリアルタイムOSプログラム
コード領域外を指すところまで進め、この時点でのスタ
ックポインタの値が予め保存しておいたスタックポイン
タの値と一致するならばプログラムの実行を停止するこ
とにより、あるタスクの中で行った関数ステップが他の
タスクが同じ場所を通過したことによって実行停止して
しまうことを防ぐ。
【0039】
【発明の実施の形態】以下、本発明の実施の形態を総括
的に説明する。
【0040】本願第1の発明のプログラムのデバッグ方
法は、リアルタイムOS上で並列に実行される複数のタ
スクを持つアプリケーションをデバッグする方法におい
て、リアルタイムOSの内部情報として、リアルタイム
OSプログラムコード領域の先頭アドレスと、リアルタ
イムOSプログラムコード領域の末尾アドレスと、ディ
スパッチを行うサブルーチンの先頭アドレスとを保持さ
せるステップと、現在のプログラムカウンタが指してい
る命令の次の命令位置に第1の実行ブレークを設定し、
かつ同時に前記内部情報を参照してリアルタイムOS内
部にも第2の実行ブレークを設定して、プログラムの実
行を開始するステップと、プログラムの実行がブレーク
によって停止したときに前記第1実行ブレークと前記第
2実行ブレークの設定解除を行い、そのときのブレーク
要因が前記第1の実行ブレークか前記第2の実行ブレー
クかを判別するステップと、前記第2の実行ブレークで
プログラムが停止したのであれば、前記内部情報を参照
してリアルタイムOSプログラムコード領域からアプリ
ケーションプログラムコード領域までプログラムカウン
タを進めるステップと、前記アプリケーションプログラ
ムコード領域までプログラムカウンタが進んだ後に、関
数ステップの実行を終了するステップとを含むものとな
っている。
【0041】この第1の発明によると、次のような作用
がある。すなわち、実行しているプログラムは、ブレー
クによって停止するが、その停止にかかわるブレーク要
因が第1の実行ブレークであるのか第2の実行ブレーク
であるのかに応じて次の対応をとる。
【0042】第1の実行ブレークは、関数ステップ実行
に移行する直前にプログラムカウンタが指している命令
の次の命令位置に設定されたものである。したがって、
第1の実行ブレークによってプログラムが停止したとき
には、第2の実行ブレークは通過しておらず、したがっ
てタスクディスパッチは発生しておらず、通常の関数コ
ールから単純にリターンしてきたことが分かる。このよ
うな状況では、既存のデバッグシステムが持つ通常の関
数ステップと同様の振舞いをすればよいので、この段階
でリアルタイムOS対応の関数ステップの処理を終了す
ればよい。
【0043】一方、第2の実行ブレークによってプログ
ラムが停止したときには、関数ステップを実行している
途中で、タスクディスパッチが発生したことを意味して
いる。このときは、OS内部情報を参照して、リアルタ
イムOSプログラムコード領域からプログラムカウンタ
がリアルタイムOSプログラムコード領域外へ出るまで
プログラムの実行を進め、アプリケーションプログラム
コード領域に至ると、関数ステップ実行を終了する。
【0044】以上の結果として、システムコールの種類
に関係なく、ディスパッチ先タスクでプログラムの実行
を停止させることが可能となる。
【0045】本願第2の発明のプログラムのデバッグ方
法は、上記第1の発明において、前記リアルタイムOS
プログラムコード領域からアプリケーションプログラム
コード領域までプログラムカウンタを進める前記ステッ
プは、機械語1命令を実行する毎にプログラムの実行を
停止するステップと、プログラムの実行が停止したとき
のプログラムカウンタの値が前記内部情報より得られる
リアルタイムOSプログラムコード領域内であるかどう
かを判別し、領域内であれば前記機械語1命令実行のス
テップに戻り、領域外になったときにはプログラムの実
行を終了するステップとを含むものとなっている。これ
は、上記第1の発明をより具体的レベルで記述したもの
に相当する。
【0046】本願第3の発明のプログラムのデバッグ方
法は、上記第1の発明において、前記リアルタイムOS
プログラムコード領域からアプリケーションプログラム
コード領域までプログラムカウンタを進める前記ステッ
プは、スタックポインタのレジスタ値が書き換わる個所
まで、機械語命令を1命令ずつ実行してプログラムカウ
ンタを進めるステップと、前記ステップで得られたスタ
ックポインタが指すスタック領域を解析して、関数呼出
し履歴テーブルを作成し、前記履歴テーブルから親関数
へのリターンアドレスを特定し、前記親関数へのリター
ンアドレスがリアルタイムOSプログラムコード領域外
であれば、前記リターンアドレスに第3の実行ブレーク
を設定するステップと、前記第3の実行ブレーク位置で
プログラムの実行が停止したときに、前記第3の実行ブ
レークの設定解除を行うステップとを含むものとなって
いる。
【0047】この第3の発明による作用は次のとおりで
ある。すなわち、リアルタイムOSを使用したマルチタ
スク・システムにおいて、複数のタスクから共通に使用
されるサブプログラムの中で関数ステップ機能を実行し
た場合でも、関数ステップ機能を実行したときに実行状
態にあったタスクでのみプログラムの実行を停止させる
ことができる。
【0048】本願第4の発明のプログラムのデバッグ方
法は、上記第1の発明において、関数ステップを実行す
る前に現在のスタックポインタの値を保存しておくステ
ップを含むものとなっている。これによれば、プログラ
ムカウンタをリアルタイムOSプログラムコード領域外
を指すところまで進めた時点で、スタックポインタの値
を予め保存しておいたスタックポインタの値と比較し、
一致するならばプログラムの実行を停止することによ
り、あるタスクの中で行った関数ステップが他のタスク
が同じ場所を通過したことによって実行停止してしまう
ことを防ぐことが可能となる。
【0049】本願第5の発明のプログラムのデバッグ方
法は、上記第4の発明において、前記リアルタイムOS
プログラムコード領域からアプリケーションプログラム
コード領域までプログラムカウンタを進める前記ステッ
プは、第3の実行ブレーク位置までプログラムカウンタ
を進めた後に、現在のスタックポインタの値が上記第4
の発明で保存しておいたスタックポインタの値と等しい
かどうかを判別し、異なっていた場合には、再度前記第
1実行ブレークと第2実行ブレークの設定から関数ステ
ップを再開するステップを含むものとなっている。
【0050】この第5の発明によると、異なるタスクで
のプログラムの停止を回避することが可能となる。
【0051】本願第6の発明は、上記第1の発明のプロ
グラムのデバッグ方法に対応したデバッグ装置にかかわ
るものであって、第1の発明における「ステップ」なる
文言を「手段」なる文言に置き換えて記述したものに相
当しており、第1の発明の方法を実施して、同第1の発
明による作用を達成することができる。
【0052】本願第7の発明は、上記第2の発明のプロ
グラムのデバッグ方法に対応したデバッグ装置にかかわ
るものであって、第2の発明における「ステップ」なる
文言を「手段」なる文言に置き換えて記述したものに相
当しており、第2の発明の方法を実施して、同第2の発
明による作用を達成することができる。
【0053】本願第8の発明は、上記第3の発明のプロ
グラムのデバッグ方法に対応したデバッグ装置にかかわ
るものであって、第3の発明における「ステップ」なる
文言を「手段」なる文言に置き換えて記述したものに相
当しており、第3の発明の方法を実施して、同第3の発
明による作用を達成することができる。
【0054】本願第9の発明は、上記第4の発明のプロ
グラムのデバッグ方法に対応したデバッグ装置にかかわ
るものであって、第4の発明における「ステップ」なる
文言を「手段」なる文言に置き換えて記述したものに相
当しており、第4の発明の方法を実施して、同第4の発
明による作用を達成することができる。
【0055】本願第10の発明は、上記第5の発明のプ
ログラムのデバッグ方法に対応したデバッグ装置にかか
わるものであって、第5の発明における「ステップ」な
る文言を「手段」なる文言に置き換えて記述したものに
相当しており、第5の発明の方法を実施して、同第5の
発明による作用を達成することができる。
【0056】本願第11から第15までの発明は、コン
ピュータ読み取り可能なプログラムデバッグ用の記録媒
体にかかわるものである。
【0057】本願第11の発明のコンピュータ読み取り
可能なプログラムデバッグ用の記録媒体は、上記第1の
発明における各ステップを含むプログラムを記録したも
のとなっており、この記録媒体に記録されているプログ
ラムをデバッグ装置にインストールすることにより、第
1の発明の方法を実施して、同第1の発明による作用を
達成することができる。
【0058】本願第12の発明のコンピュータ読み取り
可能なプログラムデバッグ用の記録媒体は、上記第2の
発明における各ステップを含むプログラムを記録したも
のとなっており、この記録媒体に記録されているプログ
ラムをデバッグ装置にインストールすることにより、第
2の発明の方法を実施して、同第2の発明による作用を
達成することができる。
【0059】本願第13の発明のコンピュータ読み取り
可能なプログラムデバッグ用の記録媒体は、上記第3の
発明における各ステップを含むプログラムを記録したも
のとなっており、この記録媒体に記録されているプログ
ラムをデバッグ装置にインストールすることにより、第
3の発明の方法を実施して、同第3の発明による作用を
達成することができる。
【0060】本願第14の発明のコンピュータ読み取り
可能なプログラムデバッグ用の記録媒体は、上記第4の
発明における各ステップを含むプログラムを記録したも
のとなっており、この記録媒体に記録されているプログ
ラムをデバッグ装置にインストールすることにより、第
4の発明の方法を実施して、同第4の発明による作用を
達成することができる。
【0061】本願第15の発明のコンピュータ読み取り
可能なプログラムデバッグ用の記録媒体は、上記第5の
発明における各ステップを含むプログラムを記録したも
のとなっており、この記録媒体に記録されているプログ
ラムをデバッグ装置にインストールすることにより、第
5の発明の方法を実施して、同第5の発明による作用を
達成することができる。
【0062】(具体的な実施の形態)以下、本発明にか
かわるプログラムのデバッグ装置の具体的な実施の形態
を図面に基づいて説明する。
【0063】(実施の形態1)図1は、本発明のプログ
ラムのデバッグ装置(またはデバッガ)の機能ブロック
図である。図1において、符号のM11はデバッグ命令
解析部、M12はプログラム実行部、M13は1命令ス
テップ実行部、M14は関数ステップ実行部、M15は
ブレーク判別部、M16はOSコード領域脱出部、M1
7はタスク判別部、M19はOS情報テーブルである。
本発明の実施の形態1のデバッガにおいては、従来のデ
バッガに比べて、OS対応関数ステップ実行部M18が
新しくなっている。OS対応関数ステップ実行部M18
は、複数設定された実行ブレークのうちどの実行ブレー
クで実行が停止したかを判別するブレーク判別部M15
と、プログラムカウンタ(PC)がOSプログラムコー
ド領域外を指すまでプログラムの実行を進めるOSコー
ド領域脱出部M16と、プログラムの実行が停止したと
きに実行状態にあるタスクがどのタスクかを特定するタ
スク判別部M17とからなる。
【0064】図2は、図1のOS対応関数ステップ実行
部M18の動作を示すフローチャートである。ここで
は、現在のプログラムカウンタが指している位置にCA
LL命令がある(つまり関数呼出しがある)ことを前提
とする。
【0065】本関数ステップでは、まず現在のスタック
ポインタ(SP)レジスタの値を保存する(ステップS
301)。これは、ステップS308で詳しく説明する
が、図1のタスク判別部M17で現在実行中のタスクを
特定するために使用される。
【0066】次に、現在のプログラムカウンタが指して
いる命令の次の命令位置に第1の実行ブレークを設定す
る(ステップS302)。同様に、OS内部情報M20
を参照して、カーネルプログラムのディスパッチャ関数
のシンボル位置に第2の実行ブレークを設定する(ステ
ップS303)。
【0067】以上の設定を行った後にプログラムの実行
を開始する(ステップS304)。
【0068】前記の実行ブレークの検出によってプログ
ラムの実行が停止したら、どちらの実行ブレークでプロ
グラムの実行が停止されたかを判定する。このとき、予
め前記第1の実行ブレークと前記第2の実行ブレークの
設定を解除しておき(ステップS305)、次いで、第
1の実行ブレークと第2の実行ブレークのうちどちらの
ブレークで実行が停止したのかの判定を行う(ステップ
S306)。ステップS306は図1におけるブレーク
判別部M15に対応している。
【0069】ここで、プログラムの実行が停止したとき
のプログラムカウンタの値と、前記第1の実行ブレーク
を設定したアドレスが一致していれば、第1の実行ブレ
ークによってプログラムの実行が停止したと判断するこ
とができる。この場合は、前記第2の実行ブレークを通
過していないことから、タスクディスパッチが発生して
いないことが分かり、通常の関数コールから単純にリタ
ーンしてきたことが分かる。このような状況では、既存
のデバッグシステムが持つ通常の関数ステップと同様の
振舞いをすればよいので、この段階でリアルタイムOS
対応関数ステップの処理を終了する(ステップS306
から直ちに終了へ)。
【0070】一方、プログラムの実行が停止したときの
プログラムカウンタの値と、前記第2の実行ブレークを
設定したアドレスが一致していれば、第2の実行ブレー
クによってプログラムの実行が停止したと判断すること
ができる。この場合は、関数ステップを実行している途
中で、タスクディスパッチが発生したことを意味してい
る(ステップS306からステップS307へ)。
【0071】タスクディスパッチが発生していることが
判明すると、次にOS内部情報M20を参照して、プロ
グラムカウンタがリアルタイムOSプログラムコード領
域外へ出るまで、プログラムの実行を進める(ステップ
S307)。ステップS307は図1におけるOSコー
ド領域脱出部M16に対応している。本ステップの詳細
は後記する。
【0072】プログラムカウンタがリアルタイムOSプ
ログラムコード領域外まで進んだら、次はその時点での
スタックポインタの値が、ステップS301で保存して
おいたスタックポインタの値と一致するかどうかを調べ
る(ステップS308)。このステップS308は、リ
アルタイムOS関数ステップを開始したときに実行状態
にあったタスクと現在プログラムの実行が停止している
状態で実行状態にあるタスクとが同一か否かを判別する
ためのものである。ステップS308は図1におけるタ
スク判別部M17に対応している。
【0073】もし、このステップS308でスタックポ
インタの値が一致している場合は、リアルタイムOS関
数ステップを開始したときに実行状態にあったタスク
と、現在プログラムの実行が停止している状態で実行状
態にあるタスクとが同一のタスクであると言える。その
理由は次のとおりである。
【0074】その理由を図3によって説明する。複数の
タスクがリアルタイムOSのもとに共有資源を並列的に
使用している。それぞれのタスクは、リアルタイムOS
において個々に自プログラム領域と自スタック領域を保
持している。このことから、スタックポインタの値が一
致する場合というのは、同一のタスクが実行状態にあ
り、かつ関数ステップ実行時の関数呼出しからリターン
によって戻ってきた直後である場合しかあり得ない。
【0075】以上のことから、ステップS301で保存
しておいたスタックポインタの値と、プログラムの実行
が停止したときのスタックポインタを比較することで、
本関数ステップを開始したときと同一のタスクが実行中
であるかどうかを判定することができる。そしてこの場
合、この段階でリアルタイムOS対応関数ステップの処
理を終了する。
【0076】一方、ステップS308において、スタッ
クポインタの値が一致していない場合は、リアルタイム
OS関数ステップを開始したときに実行状態にあったタ
スクと、現在プログラムの実行が停止している状態で実
行状態にあるタスクとが、異なるタスクであることが分
かる。その理由は前記の通りである。そのため、前記ス
テップS303から再度、リアルタイムOS対応関数ス
テップの処理を再開する。
【0077】以上の処理の中で、ステップS307に対
応するOSコード領域脱出部M16については、以下で
さらに詳しく述べる。
【0078】ステップS307の第1の方法について、
その動作フローを図4に示す。
【0079】ここでは、まず1命令分のみステップ実行
を行う(ステップS401)。
【0080】次に、OS内部情報M20を参照して、現
在のプログラムカウンタが、OSコード領域内を指して
いるかどうか(OSコード領域内を実行中かどうか)を
判定する(ステップS402)。具体的には、現在のプ
ログラムカウンタがOSコード領域の先頭アドレスより
大きく、かつ現在のプログラムカウンタがOSコード領
域の末尾アドレスよりも小さいかどうかを調べる。その
結果、現在のプログラムカウンタがOSコード領域内を
指しているのであれば、再度前記1命令分のみのステッ
プ実行を行うステップS401に戻る。一方、現在のプ
ログラムカウンタがOSコード領域外を指すのであれ
ば、OSコード領域脱出部M16を終了する。
【0081】以上、説明したデバッガによれば、リアル
タイムOSを使用したマルチタスク・システムにおい
て、複数のタスクから共通に使用されるサブプログラム
の中で関数ステップ機能を実行した場合でも、関数ステ
ップ機能を実行したときに実行状態にあったタスクでの
みプログラムの実行を停止させることができる。
【0082】この実施の形態1をさらに展開すると、図
2において、スタックポインタを保存するステップS3
01と、スタックポインタの値を比較するステップS3
08の両方を取り外した動作フローを実現することによ
り、タスクディスパッチが発生した場合に、ディスパッ
チ先タスクでプログラムの実行が停止するような関数ス
テップを実現することができる。
【0083】また、このようなデバッガは、プログラム
で構成することができる。
【0084】(発明の実施の形態2)前記発明の実施の
形態1で示したデバッグシステムにおいて、図2のステ
ップS307を以下の第2の方法で実現することもでき
る。その動作フローを図5に示す。
【0085】ここでも、まずは1命令分のみステップ実
行を行う(ステップS501)。
【0086】次にステップS501で実行した命令によ
って、スタックポインタが書換えられたかどうかを判定
する(ステップS502)。これは実行した命令の種類
を機械語コードから判定することで可能である。具体的
には以下のような命令が実行されたかどうかを判定す
る。これらの命令は使用しているマイクロプロセッサの
種類により異なる。
【0087】 例1) MOV(0,A0),SP 例2) MOV A0,SP 判定の結果、SPを書き換える命令を実行していない場
合は、ディスパッチャ関数の中でまだスタックの切替え
が行われていないと判断できるため、前記ステップS5
01に戻り、再度1命令のステップ実行を繰り返す。
【0088】判定の結果、SPを書き換える命令を実行
した場合は、実際にタスクのディスパッチが行われたこ
とを意味する。つまり、SPは既にディスパッチ先のタ
スクスタックを指していることになる。次のステップで
は、このSPが指しているスタックフレームを解析し
て、関数呼出しの履歴テーブル(バックトレーステーブ
ル)を作成する(ステップS503)。この機能は、一
般的なデバッガが持っているバックトレースと呼ばれる
機能そのものであり、ここではバックトレーステーブル
作成の原理については言及しない。
【0089】作成されたバックトレーステーブルの内容
について説明すると、ディスパッチ先のタスクが図6に
示すような関数呼出しをしている場合、バックトレース
テーブルには図7に示すような情報が格納される。ここ
で必要となるのは、それぞれの子関数から親関数へリタ
ーンするときのリターンアドレスである。
【0090】より具体的には、図6においてタスクtask
が実行を開始し、関数func_Aの実行を開始する(S60
1)。関数func_A内ではfunc_Bへの関数呼出しがあり
(S602)、関数func_Bの実行を開始する(S60
5)。同様に関数func_B内でfunc_Cへの関数呼出しがあ
り(S606)、関数func_Cの実行を開始する(S60
9)。さらに関数func_C内ではシステムコールwai_flg
の関数呼出しがあり(S610)、関数wai_flgの実行
を開始する(S613)。この関数wai_flg内でタスク
ディスパッチが発生した場合は、この関数内でプログラ
ムの実行が停止し、前記のバックトレーステーブルの作
成が行われる。このとき、上記のように階層的に関数呼
出しが行われた場合は、現在実行中であったタスクtask
のスタック領域に、各関数への戻りアドレスが退避され
ている。具体的には、1つ目の関数呼出しS602によ
って、その戻りアドレス0x40001000(S603)がスタ
ックに退避される。次に2つ目の関数呼出しS606に
よって、その戻りアドレス0x40002000(S607)がス
タックに退避される。さらに3つ目の関数呼出しS61
0によって、その戻りアドレス0x40003000(S611)
がスタックに退避される。
【0091】上記で示したスタック領域をデバッガが持
つバックトレース機能を使うことで図7に示すようなテ
ーブルが作成される。まず最下階層4には、現在のプロ
グラムカウンタからwai_flg関数実行中であることと、
スタックに退避されたリターンアドレスC(0x4000300
0)が明確にされる。次に階層3には、前記リターンア
ドレスCからfunc_C関数がその親関数であることと、ス
タックに退避されたリターンアドレスB(0x40002000)
が明確になる。次に階層2には、前記リターンアドレス
Bからfunc_B関数がさらなる親関数であることと、スタ
ックに退避されたリターンアドレスA(0x40001000)が
明確になる。最後の階層1には、前記リターンアドレス
Aからfunc_A関数がさらなる親関数であることが明確に
なる。
【0092】次のステップでは、S503によって作成
されたバックトレーステーブルにおいて、階層の最も深
い所(図7の場合は階層4)にある子関数からその親関
数へのリターンアドレスを取り出し、次のステップへ渡
す(ステップS504)。
【0093】次に、OS内部情報M20を参照して、前
記親関数へのリターンアドレスが、OSコード領域内を
指しているかどうかを判定する(ステップS505)。
具体的には、前記親関数へのリターンアドレスがOSコ
ード領域の先頭アドレスより大きく、かつ前記親関数へ
のリターンアドレスがOSコード領域の末尾アドレスよ
りも小さいかどうかを調べる。その結果、親関数へのリ
ターンアドレスがOSコード領域内を指しているのであ
れば、再度前記バックトレーステーブル参照に戻り、次
の候補となるエントリを取得する。
【0094】一方、親関数へのリターンアドレスがOS
コード領域外を指しているのであれば、そのリターンア
ドレスに第3の実行ブレークを設定して、プログラムの
実行を開始する(ステップS506、ステップS50
7)。
【0095】プログラムの実行が停止したら、S506
で設定した第3の実行ブレークの設定を解除する(ステ
ップS508)。この時点で、プログラムカウンタは確
実にリアルタイムOSプログラムコード領域外を指して
いるため、以上をもって、OSコード領域脱出部M16
の動作を終了する。
【0096】以上、説明したデバッガによっても、リア
ルタイムOSを使用したマルチタスク・システムにおい
て、複数のタスクから共通に使用されるサブプログラム
の中で関数ステップ機能を実行した場合でも、関数ステ
ップ機能を実行したときに実行状態にあったタスクでの
みプログラムの実行を停止させることができる。
【0097】この実施の形態2をさらに展開すると、図
2において、スタックポインタを保存するステップS3
01と、スタックポインタの値を比較するステップS3
08の両方を取り外した動作フローを実現することによ
り、タスクディスパッチが発生した場合に、ディスパッ
チ先タスクでプログラムの実行が停止するような関数ス
テップを実現することもできる。
【0098】また、このようなデバッガも、プログラム
で構成することができる。
【0099】
【発明の効果】以上の説明によれば、この発明の第1の
効果は、リアルタイムOSを用いたアプリケーションの
デバッグにおいて関数ステップを実行する際に、自タス
クを終了させるようなシステムコールであるか否かと
か、他タスクにディスパッチしてしまうようなシステム
コールであるか否かに注意する必要がなくなり、デバッ
グ作業時の負担を軽減することができると同時に、タス
クの遷移を意識しながらのデバッグ作業が可能となる。
その理由は、関数ステップに対応する命令列のアドレス
範囲だけでなく、ディスパッチが起きる個所にブレーク
を発生させ、さらにリアルタイムOSプログラムコード
領域外の位置までプログラムカウンタを進めるからであ
る。
【0100】さらにこの発明の第2の効果は、複数のタ
スクから共通に利用され得るサブプログラムのデバッグ
において関数ステップを実行する際に、他のタスクが当
該サブプログラムコードを通過した場合でもプログラム
の実行を停止させることなく、関数ステップを実行した
ときのタスクが当該サブプログラムコードを通過したと
きのみ、プログラムの実行を停止させることが可能とな
る。その理由は、関数ステップを実行したときのスタッ
クポインタの値と、実行ブレークによってプログラムの
実行が停止したときのスタックポインタの値を比較する
ことで、両者のタスクが同一であるか否かを判定するか
らである。
【図面の簡単な説明】
【図1】 本発明の実施の形態1におけるプログラムの
デバッグ装置の基本ブロック図
【図2】 本発明の実施の形態1におけるリアルタイム
OS対応関数ステップの動作を示すフローチャート
【図3】 本発明の実施の形態1における被デバッグプ
ログラムを示す図
【図4】 本発明の実施の形態1におけるOSコード領
域脱出部の方法を示すフローチャート
【図5】 本発明の実施の形態2におけるOSコード領
域脱出部の方法を示すフローチャート
【図6】 本発明の実施の形態2における関数呼出しの
状況を示す動作フロー図
【図7】 図6におけるバックトレーステーブルの内容
【図8】 本発明の実施の形態2におけるOSを使用し
ていないシステムでの関数ステップの実行例
【図9】 本発明の実施の形態2におけるOSを使用し
ているシステムでの関数ステップの実行例
【図10】 従来のプロシージャ・ステップ処理方法の
動作を示すフローチャート
【図11】 本発明の実施の形態2における共用関数の
中での関数ステップの実行例
【図12】 従来の技術において他タスクを終了するシ
ステムの動作フロー図
【符号の説明】
S301 現在のスタックポインタの値を保存するステ
ップ S302 現在のプログラムカウンタの次の命令位置に
実行ブレークを設定するステップ S303 OSのディスパッチャ部に第2の実行ブレー
クを設定するステップ S304 プログラムの実行を開始するステップ S305 S302・S303で設定した実行ブレーク
を解除するステップ S306 プログラムが停止した実行ブレークを特定す
るステップ S307 OSのプログラムコード領域外まで実行を進
めるステップ S308 S301のSP値と、現在のSP値とを比較
するステップ S401 プログラムコードを1命令分のみステップ実
行するステップ S402 現在のPC値がOSコード領域内か否かを判
定するステップ S501 プログラムコードを1命令分のみステップ実
行するステップ S502 S501でSP書換え命令を実行したか否か
を判定するステップ S503 SPが指すスタックフレームからバックトレ
ーステーブルを作成するステップ S504 バックトレーステーブルからリターンアドレ
スを1エントリずつ取得するステップ S505 S504のリターンアドレスがOSコード領
域内か否かを判定するステップ S506 S505のリターンアドレスに第3の実行ブ
レークを設定するステップ S507 プログラムの実行を開始するステップ S508 S506で設定した第3の実行ブレークを解
除するステップ S601 関数func_Aの入口処理を行うブロック S602 関数func_Aから関数func_BをCALLする命
令 S603 S602におけるリターンアドレス S604 関数func_Aの出口処理を行うブロック S605 関数func_Bの入口処理を行うブロック S606 関数func_Bから関数func_CをCALLする命
令 S607 S606におけるリターンアドレス S608 関数func_Bの出口処理を行うブロック S609 関数func_Cの入口処理を行うブロック S610 関数func_Cからしステムコールwai_flgをC
ALLする命令 S611 S610におけるリターンアドレス S612 関数func_Cの出口処理を行うブロック S613 システムコールwai_flgの入口処理を行うブ
ロック S614 システムコールwai_flgの出口処理を行うブ
ロック S801 関数sub_func1を呼出す命令 S802 関数sub_func2を呼出す命令 S803 関数sub_func2本体 S804 関数sub_func2からその親関数へ戻るための
命令 M11 デバッグ命令解析部 M12 プログラム実行部 M13 1命令ステップ実行部 M14 関数ステップ実行部 M15 ブレーク判別部 M16 OSコード領域脱出部 M17 タスク判別部 M18 OS対応関数ステップ実行部 M19 OS情報テーブル

Claims (15)

    【特許請求の範囲】
  1. 【請求項1】 リアルタイムOS上で並列に実行される
    複数のタスクを持つアプリケーションをデバッグする方
    法において、 リアルタイムOSの内部情報として、リアルタイムOS
    プログラムコード領域の先頭アドレスと、リアルタイム
    OSプログラムコード領域の末尾アドレスと、ディスパ
    ッチを行うサブルーチンの先頭アドレスとを保持させる
    ステップと、 現在のプログラムカウンタが指している命令の次の命令
    位置に第1の実行ブレークを設定し、かつ同時に前記内
    部情報を参照してリアルタイムOS内部にも第2の実行
    ブレークを設定して、プログラムの実行を開始するステ
    ップと、 プログラムの実行がブレークによって停止したときに前
    記第1実行ブレークと前記第2実行ブレークの設定解除
    を行い、そのときのブレーク要因が前記第1の実行ブレ
    ークか前記第2の実行ブレークかを判別するステップ
    と、 前記第2の実行ブレークでプログラムが停止したのであ
    れば、前記内部情報を参照してリアルタイムOSプログ
    ラムコード領域からアプリケーションプログラムコード
    領域までプログラムカウンタを進めるステップと、 前記アプリケーションプログラムコード領域までプログ
    ラムカウンタが進んだ後に、関数ステップの実行を終了
    するステップと、 を含むことを特徴とするプログラムのデバッグ方法。
  2. 【請求項2】 前記リアルタイムOSプログラムコード
    領域からアプリケーションプログラムコード領域までプ
    ログラムカウンタを進める前記ステップは、 機械語1命令を実行する毎にプログラムの実行を停止す
    るステップと、プログラムの実行が停止したときのプロ
    グラムカウンタの値が前記内部情報より得られるリアル
    タイムOSプログラムコード領域内であるかどうかを判
    別し、領域内であれば前記機械語1命令実行のステップ
    に戻り、領域外になったときにはプログラムの実行を終
    了するステップとを含むことを特徴とする請求項1記載
    のプログラムのデバッグ方法。
  3. 【請求項3】 前記リアルタイムOSプログラムコード
    領域からアプリケーションプログラムコード領域までプ
    ログラムカウンタを進める前記ステップは、 スタックポインタのレジスタ値が書き換わる個所まで、
    機械語命令を1命令ずつ実行してプログラムカウンタを
    進めるステップと、 前記ステップで得られたスタックポインタが指すスタッ
    ク領域を解析して、関数呼出し履歴テーブルを作成し、
    前記履歴テーブルから親関数へのリターンアドレスを特
    定し、前記親関数へのリターンアドレスがリアルタイム
    OSプログラムコード領域外であれば、前記リターンア
    ドレスに第3の実行ブレークを設定するステップと、 前記第3の実行ブレーク位置でプログラムの実行が停止
    したときに、前記第3の実行ブレークの設定解除を行う
    ステップとを含むことを特徴とする請求項1記載のプロ
    グラムのデバッグ方法。
  4. 【請求項4】 リアルタイムOS上で並列に実行される
    複数のタスクを持つアプリケーションをデバッグする方
    法において、関数ステップを実行する前に、現在のスタ
    ックポインタの値を保存しておくステップを含むことを
    特徴とする請求項1記載のプログラムのデバッグ方法。
  5. 【請求項5】 前記リアルタイムOSプログラムコード
    領域からアプリケーションプログラムコード領域までプ
    ログラムカウンタを進める前記ステップにおいて、第3
    の実行ブレーク位置までプログラムカウンタを進めた後
    に、現在のスタックポインタの値が前記請求項4で保存
    しておいたスタックポインタの値と等しいかどうかを判
    別し、異なっていた場合には、再度前記第1実行ブレー
    クと第2実行ブレークの設定から関数ステップを再開す
    るステップを含むことを特徴とする請求項4記載のプロ
    グラムのデバッグ方法。
  6. 【請求項6】 リアルタイムOS上で並列に実行される
    複数のタスクを持つアプリケーションをデバッグする装
    置において、 リアルタイムOSの内部情報として、リアルタイムOS
    プログラムコード領域の先頭アドレスと、リアルタイム
    OSプログラムコード領域の末尾アドレスと、ディスパ
    ッチを行うサブルーチンの先頭アドレスとを保持させる
    手段と、 現在のプログラムカウンタが指している命令の次の命令
    位置に第1の実行ブレークを設定し、かつ同時に前記内
    部情報を参照してリアルタイムOS内部にも第2の実行
    ブレークを設定して、プログラムの実行を開始する手段
    と、 プログラムの実行がブレークによって停止したときに、
    前記第1実行ブレークと前記第2実行ブレークの設定解
    除を行い、そのときのブレーク要因が前記第1の実行ブ
    レークか、前記第2の実行ブレークかを判別する手段
    と、 前記第2の実行ブレークでプログラムが停止したのであ
    れば、前記内部情報を参照してリアルタイムOSプログ
    ラムコード領域から、アプリケーションプログラムコー
    ド領域までプログラムカウンタを進める手段と、 前記アプリケーションプログラムコード領域までプログ
    ラムカウンタが進んだ後に、関数ステップの実行を終了
    する手段と、 を有することを特徴とするプログラムのデバッグ装置。
  7. 【請求項7】 前記リアルタイムOSプログラムコード
    領域から、アプリケーションプログラムコード領域まで
    プログラムカウンタを進める前記手段は、 機械語1命令を実行する毎にプログラムの実行を停止す
    る手段と、プログラムの実行が停止したときのプログラ
    ムカウンタの値が前記内部情報より得られるリアルタイ
    ムOSプログラムコード領域内であるかどうかを判別
    し、領域内であれば前記機械語1命令実行のステップに
    戻り、領域外になったときにはプログラムの実行を終了
    する手段とを有することを特徴とする請求項6記載のプ
    ログラムのデバッグ装置。
  8. 【請求項8】 前記リアルタイムOSプログラムコード
    領域から、アプリケーションプログラムコード領域まで
    プログラムカウンタを進める前記手段は、 スタックポインタのレジスタ値が書き換わる個所まで、
    機械語命令を1命令ずつ実行してプログラムカウンタを
    進める手段と、 前記ステップで得られたスタックポインタが指すスタッ
    ク領域を解析して、関数呼出し履歴テーブルを作成し、
    前記履歴テーブルから親関数へのリターンアドレスを特
    定し、前記親関数へのリターンアドレスがリアルタイム
    OSプログラムコード領域外であれば、前記リターンア
    ドレスに第3の実行ブレークを設定する手段と、 前記第3の実行ブレーク位置でプログラムの実行が停止
    したときに、前記第3の実行ブレークの設定解除を行う
    手段とを有することを特徴とする請求項6記載のプログ
    ラムのデバッグ装置。
  9. 【請求項9】 リアルタイムOS上で並列に実行される
    複数のタスクを持つアプリケーションをデバッグする装
    置において、関数ステップを実行する前に、現在のスタ
    ックポインタの値を保存しておく手段を有することを特
    徴とする請求項6記載のプログラムのデバッグ装置。
  10. 【請求項10】 前記リアルタイムOSプログラムコー
    ド領域から、アプリケーションプログラムコード領域ま
    でプログラムカウンタを進める前記手段において、第3
    の実行ブレーク位置までプログラムカウンタを進めた後
    に、現在のスタックポインタの値が前記請求項9で保存
    しておいたスタックポインタの値と等しいかどうかを判
    別し、異なっていた場合には、再度前記第1実行ブレー
    クと第2実行ブレークの設定から関数ステップを再開す
    る手段を有することを特徴とする請求項9記載のプログ
    ラムのデバッグ装置。
  11. 【請求項11】 リアルタイムOS上で並列に実行され
    る複数のタスクを持つアプリケーションをデバッグする
    プログラムを記録したコンピュータ読み取り可能な記録
    媒体であって、 リアルタイムOSの内部情報として、リアルタイムOS
    プログラムコード領域の先頭アドレスと、リアルタイム
    OSプログラムコード領域の末尾アドレスと、ディスパ
    ッチを行うサブルーチンの先頭アドレスとを保持させる
    ステップと、 現在のプログラムカウンタが指している命令の次の命令
    位置に第1の実行ブレークを設定し、かつ同時に前記内
    部情報を参照してリアルタイムOS内部にも第2の実行
    ブレークを設定して、プログラムの実行を開始するステ
    ップと、 プログラムの実行がブレークによって停止したときに、
    前記第1実行ブレークと前記第2実行ブレークの設定解
    除を行い、そのときのブレーク要因が前記第1の実行ブ
    レークか、前記第2の実行ブレークかを判別するステッ
    プと、 前記第2の実行ブレークでプログラムが停止したのであ
    れば、前記内部情報を参照してリアルタイムOSプログ
    ラムコード領域から、アプリケーションプログラムコー
    ド領域までプログラムカウンタを進めるステップと、 前記アプリケーションプログラムコード領域までプログ
    ラムカウンタが進んだ後に、関数ステップの実行を終了
    するステップと、 を含むプログラムを記録したコンピュータ読み取り可能
    なプログラムデバッグ用の記録媒体。
  12. 【請求項12】 前記リアルタイムOSプログラムコー
    ド領域から、アプリケーションプログラムコード領域ま
    でプログラムカウンタを進める前記ステップは、 機械語1命令を実行する毎にプログラムの実行を停止す
    るステップと、 プログラムの実行が停止したときのプログラムカウンタ
    の値が前記内部情報より得られるリアルタイムOSプロ
    グラムコード領域内であるかどうかを判別し、領域内で
    あれば前記機械語1命令実行のステップに戻り、領域外
    になったときにはプログラムの実行を終了するステップ
    とを含むことを特徴とする請求項11記載のプログラム
    デバッグ用の記録媒体。
  13. 【請求項13】 前記リアルタイムOSプログラムコー
    ド領域から、アプリケーションプログラムコード領域ま
    でプログラムカウンタを進める前記ステップは、 スタックポインタのレジスタ値が書き換わる個所まで、
    機械語命令を1命令ずつ実行してプログラムカウンタを
    進めるステップと、 前記ステップで得られたスタックポインタが指すスタッ
    ク領域を解析して、関数呼出し履歴テーブルを作成し、
    前記履歴テーブルから親関数へのリターンアドレスを特
    定し、前記親関数へのリターンアドレスがリアルタイム
    OSプログラムコード領域外であれば、前記リターンア
    ドレスに第3の実行ブレークを設定するステップと、 前記第3の実行ブレーク位置でプログラムの実行が停止
    したときに、前記第3の実行ブレークの設定解除を行う
    ステップとを含むことを特徴とする請求項11記載のプ
    ログラムデバッグ用の記録媒体。
  14. 【請求項14】 リアルタイムOS上で並列に実行され
    る複数のタスクを持つアプリケーションをデバッグする
    プログラムを記録した記録媒体において、関数ステップ
    を実行する前に、現在のスタックポインタの値を保存し
    ておくステップを含むことを特徴とする請求項11記載
    のプログラムデバッグ用の記録媒体。
  15. 【請求項15】 前記リアルタイムOSプログラムコー
    ド領域から、アプリケーションプログラムコード領域ま
    でプログラムカウンタを進める前記ステップにおいて、
    第3の実行ブレーク位置までプログラムカウンタを進め
    た後に、現在のスタックポインタの値が前記請求項14
    で保存しておいたスタックポインタの値と等しいかどう
    かを判別し、異なっていた場合には、再度前記第1実行
    ブレークと第2実行ブレークの設定から関数ステップを
    再開するステップを含むことを特徴とする請求項14記
    載のプログラムデバッグ用の記録媒体。
JP2001157591A 2001-05-25 2001-05-25 プログラムのデバッグ方法、デバッグ装置およびプログラムデバッグ用の記録媒体 Pending JP2002351695A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2001157591A JP2002351695A (ja) 2001-05-25 2001-05-25 プログラムのデバッグ方法、デバッグ装置およびプログラムデバッグ用の記録媒体

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2001157591A JP2002351695A (ja) 2001-05-25 2001-05-25 プログラムのデバッグ方法、デバッグ装置およびプログラムデバッグ用の記録媒体

Publications (1)

Publication Number Publication Date
JP2002351695A true JP2002351695A (ja) 2002-12-06

Family

ID=19001429

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2001157591A Pending JP2002351695A (ja) 2001-05-25 2001-05-25 プログラムのデバッグ方法、デバッグ装置およびプログラムデバッグ用の記録媒体

Country Status (1)

Country Link
JP (1) JP2002351695A (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008107908A (ja) * 2006-10-23 2008-05-08 Nec Electronics Corp データ解析システム
WO2012070254A1 (ja) * 2010-11-26 2012-05-31 三菱電機株式会社 プログラム生成装置、プログラム生成プログラム、及びプログラム生成方法
US8972795B2 (en) 2007-03-20 2015-03-03 Spansion Llc Processor system optimization
US9047180B2 (en) 2009-11-13 2015-06-02 Samsung Electronics Co., Ltd. Computing system, method and computer-readable medium processing debug information in computing system

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008107908A (ja) * 2006-10-23 2008-05-08 Nec Electronics Corp データ解析システム
US8972795B2 (en) 2007-03-20 2015-03-03 Spansion Llc Processor system optimization
US9047180B2 (en) 2009-11-13 2015-06-02 Samsung Electronics Co., Ltd. Computing system, method and computer-readable medium processing debug information in computing system
WO2012070254A1 (ja) * 2010-11-26 2012-05-31 三菱電機株式会社 プログラム生成装置、プログラム生成プログラム、及びプログラム生成方法
CN103221926A (zh) * 2010-11-26 2013-07-24 三菱电机株式会社 程序生成装置、程序生成程序以及程序生成方法
JP5414911B2 (ja) * 2010-11-26 2014-02-12 三菱電機株式会社 プログラム生成装置、プログラム生成プログラム、及びプログラム生成方法
US9122473B2 (en) 2010-11-26 2015-09-01 Mitsubishi Electric Corporation Program generating device, program generating program, and program generating method
EP2645255A4 (en) * 2010-11-26 2017-09-27 Mitsubishi Electric Corporation Program generating device, program generating program, and program generating method

Similar Documents

Publication Publication Date Title
JP4901075B2 (ja) コンピュータ読取可能な媒体、方法及びコンピューティングデバイス
US6052774A (en) Apparatus and method for identifying exception routines indicated by instruction address issued with an instruction fetch command
US20090248721A1 (en) System And Method for Stack Crawl Testing and Caching
US7844971B2 (en) Method and apparatus for detecting cross-thread stack access in multithreaded programs
KR20110070468A (ko) 인스트루먼테이션 실행 장치 및 방법
US8108840B2 (en) Method for enhancing debugger performance of hardware assisted breakpoints
JP3062266B2 (ja) 支援装置
US5963741A (en) Information processor which rewrites instructions in program to dynamically change program structure and method therefor
JP2002351695A (ja) プログラムのデバッグ方法、デバッグ装置およびプログラムデバッグ用の記録媒体
US7779230B2 (en) Data flow execution of methods in sequential programs
US11256479B2 (en) Dynamic updates in an interactive programming environment
JPH1011315A (ja) インサーキットエミュレータ装置およびインサーキットエミュレーション方法
Huxtable et al. Dynamic supervisors-their design and construction
JPH05250221A (ja) シミュレータ実行方式
SU849218A1 (ru) Устройство дл отладки программ
JPH0157375B2 (ja)
JP3159155B2 (ja) プログラムのデバッグ方法および装置
JPH08320813A (ja) プログラムシミュレータ装置及びプログラムデバッグ方法
JPS6214240A (ja) プログラム検査方式
CN117707919A (zh) 一种面向申威平台的协程调试方法
CN117971626A (zh) 基于多进程协程模型的共享内存泄漏检测方法
JPH0148564B2 (ja)
JP2019125134A (ja) 検証支援プログラム、検証支援方法、および情報処理装置
JPS63310037A (ja) プログラムデバッグ方式
JPH02110744A (ja) 情報処理装置