(57)【要約】【課題】不正な処理による例外を発生させた命令の実行直前の状態で、事前にブレークポイントを設定することなく、自動的にデバッガを起動させる。【解決手段】デバッグ作業の対象となるプログラムを実行するコンピュータは、当該コンピュータに例外事象が発生した原因を解析し、前記原因が、メモリ空間に記憶された命令が前記コンピュータに不正な処理を実行させようとしたことである場合、前記命令を、デバッガ起動用命令で書き換え、各々のタスクの状態に基づいて実行させるべきタスクを選択して切り替えるか、または、前記例外事象の発生により中断された処理を再開させる。そして、前記コンピュータが前記デバッガ起動用命令を実行すると、デバッガがこれを検出し、起動する。【選択図】図１
2008257438.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに例外事象が発生したときに起動される例外処理装置であって、
前記例外事象を解析する解析部と、
前記例外事象の原因となった命令が記憶されているメモリ空間上の領域をデバッガ起動用命令で書き換える書き換え部と、
を備える例外処理装置。
【請求項２】
コンピュータに例外事象が発生したときに起動される例外処理装置における例外処理方法であって、
前記例外事象を解析する過程と、
前記例外事象の原因となった命令が記憶されているメモリ空間上の領域をデバッガ起動用命令で書き換える過程と、
を有する例外処理方法。
【請求項３】
コンピュータに例外事象が発生したときに起動される例外処理プログラムであって、
前記例外事象を解析する処理と、
前記例外事象の原因となった命令が記憶されているメモリ空間上の領域をデバッガ起動用命令で書き換える処理と、
を前記コンピュータに実行させる例外処理プログラム。
【請求項４】
デバッガ起動用命令が実行されたときに起動されるデバッガを、前記デバッガ起動用命令とは異なる命令によって例外事象が発生したことをトリガとして起動させる例外処理装置。
【請求項５】
コンピュータに例外事象が発生したときに起動される例外処理装置であって、
前記例外事象を解析する解析部と、
前記例外事象の原因となった命令が記憶されているメモリ空間上の領域をデバッガ起動用命令で書き換える書き換え部と、
を備える例外処理装置を備えるテレビ。
【請求項６】
デバッガ起動用命令が実行されたときに起動されるデバッガを、前記デバッガ起動用命令とは異なる命令によって例外事象が発生したことをトリガとして起動させる例外処理装置を備えるテレビ。
【請求項７】
コンピュータに例外事象が発生したときに起動される例外処理装置であって、
前記例外事象を解析する解析部と、
前記例外事象の原因となった命令が記憶されているメモリ空間上の領域をデバッガ起動用命令で書き換える書き換え部と、
を備える例外処理装置を備える携帯電話。
【請求項８】
デバッガ起動用命令が実行されたときに起動されるデバッガを、前記デバッガ起動用命令とは異なる命令によって例外事象が発生したことをトリガとして起動させる例外処理装置を備える携帯電話。
【請求項９】
マルチタスク処理を行うコンピュータに例外事象が発生したときに例外処理を行う例外処理方法であって、
前記例外事象を解析し、不正な処理による例外事象であるときは、例外処理プログラムを実行して、例外を発生させた命令をデバッガ起動用命令に書き換え、
その後は不正な処理による例外を発生させたタスクとメモリ空間を共有するタスクには切り替えないようにタスク切り替えプログラムを設定し、
コンピュータは実行中のタスクのプログラムを実行し、
コンピュータが前記デバッガ起動用命令を実行したことによりコンピュータの中央演算装置を停止させることを特徴とする例外処理方法。
【請求項１０】
マルチタスク処理を行うコンピュータに例外事象が発生したときに例外処理を行う例外処理方法であって、
前記例外事象を解析し、不正な処理による例外事象であるときは、例外処理プログラムを実行して、例外を発生させた命令をデバッガ起動用命令に書き換え、
その後は例外を発生させたタスクへの切り替えを行い、
コンピュータは実行中のタスクのプログラムを実行し、
コンピュータが前記デバッガ起動用命令を実行したことによりコンピュータの中央演算装置を停止させることを特徴とする例外処理方法。
【請求項１１】
シングルタスク処理を行うコンピュータに例外事象が発生したときに例外処理を行う例外処理方法であって、
前記例外事象を解析し、不正な処理による例外事象であるときは、例外処理プログラムを実行して、例外を発生させた命令をデバッガ起動用命令に書き換え、
その後は例外処理プログラムを終了し、保存されている実行中のプログラムの状態を復旧し、
コンピュータは実行中のタスクのプログラムを実行し、
コンピュータが前記デバッガ起動用命令を実行したことによりコンピュータの中央演算装置を停止させることを特徴とする例外処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例外処理装置、例外処理方法、及び、例外処理プログラムに関し、特に、コンピュータシステムにおけるデバッグ装置の制御に用いる例外処理装置、例外処理方法、及び例外処理プログラムに関する。
【背景技術】
【０００２】
まず、主な用語を説明した後、従来のデバッグ作業について説明する。
「デバッガ」とは、プログラムの修正作業（以下、デバッグ作業）を支援する装置である。デバッガは一般に、中央演算装置（以下、ＣＰＵ）の動作を一時的に中断させたり、ＣＰＵの内部状態を調査したり、ＣＰＵに１命令ずつプログラムを実行させたりするなどして、ＣＰＵがプログラムを実際に実行する際の動作を細かく解析するための機能を持つ。作業者はこれらの機能を用いてプログラム実行時のＣＰＵの動作を観察し、プログラムのどの部分の処理がプログラム製作者の意図と違うのかを解析することにより、プログラムの誤りを見つけ出す手掛かりとする。
デバッグ作業を行うときの機器構成の一例を示すと、デバッガは、デバッグ作業の対象となるプログラムを実行するコンピュータのＣＰＵとプローブ（測定物に接触させる探針）を介して接続されるとともに、一般的なパーソナルコンピュータと通信インタフェースを介して接続され、そのパーソナルコンピュータで実行されるデバッガ制御プログラムによって制御される。なお、後述する図１０、図１１は、既存のデバッガ制御プログラムによってパーソナルコンピュータのディスプレイに表示される画面の一例である。作業者は、キー入力等を行ってデバッガを操作し、この画面にデバッグ作業の対象となるプログラムを実行するコンピュータのＣＰＵやメモリの状態を表示することができる。なお、本発明の実施形態の説明において、上記のパーソナルコンピュータは図示しない。
なお、デバッガは、デバッグ作業の対象となるプログラムを実行するコンピュータと同一のコンピュータで実行されるプログラムを用いて、当該コンピュータ上に実現してもよい。
【０００３】
ＣＰＵの動作をデバッガにより一時的に中断させ、作業者がＣＰＵの動作を解析できる状態にすることをデバッガの「起動」と呼ぶ。デバッガを起動するには、２種類の方法がある。一つは作業者がデバッガを操作する方法、もう一つはデバッガを起動させる特別な命令（「デバッガ起動用命令」と呼ぶ。）をＣＰＵに実行させる方法である。ＣＰＵがこのような命令を実行すると、デバッガはその実行を自動的に検出し自分自身を起動させる。このような命令の１つに後述の「ブレーク命令」がある。デバッガが起動されると、デバッガは、例えば、作業者にデバッグ作業の開始を促す画面を表示する。
【０００４】
「マルチタスクコンピュータシステム」とは、後述の「タスク切り替え」と呼ばれる機構により、複数のプログラムを並行に実行することができるように構成されたコンピュータシステムのことである。
【０００５】
「タスク」とは、プログラムやデータ、及び実行中のＣＰＵの状態を管理する単位である。ＣＰＵは、後述の「例外」と呼ばれる事象を検出すると、プログラムの実行を一時中断し、その時のタスクの状態（そのタスクに対応するプログラム、データ、ＣＰＵの状態）を保存して、その代わりに以前に中断された別のタスクの状態を復元、あるいは新たにまったく別のタスクを生成し、実行を再開（あるいは開始）させることができる。この動作を「タスク切り替え」と呼び、このとき実行を再開（開始）されたタスクを「実行中」のタスクと呼ぶ。この切り替えを周期的かつ高速に行うことにより、あたかも複数のＣＰＵが複数のプログラムを同時に実行しているかのような状況を作るのが、前述のマルチタスクコンピュータシステムにおける“複数プログラムの並行実行”技術である。
【０００６】
「メモリ空間」とは、ＣＰＵの仮想記憶技術により作り出された論理的な記憶装置である。仮想記憶技術とは、情報を、ハードディスク装置等の外部記憶装置と物理的メモリ装置とに分散させて記憶し、記憶された情報の配置を必要に応じて入れ替えることにより、実際に装備されている物理的メモリ装置よりも大きなサイズのメモリ装置がシステムに装備されているかのように見せかける技術である。さらに、マルチタスクコンピュータシステムにおいては、この技術を応用して、タスク切り替えの瞬間にメモリの内容を全く入れ替えてしまうことにより、タスクごとに専用のメモリ空間を提供し、タスク同士がお互いに干渉することなくプログラムやデータを保持できるようにする、という機能も実現している。ただし、タスクの中には他のタスクとメモリ空間を共有するものもある。複数のタスクがメモリ空間を共有する場合、これらはプログラムもデータも共有するが、ＣＰＵの状態は共有しないので、これらが並行に実行されると、あたかも複数のＣＰＵが連携しつつ同一のプログラムを実行しているかのような状態になる。
【０００７】
タスクの中には、「カーネルタスク」という特別なタスクが存在する。これはタスクの管理をする唯一のタスクであり、システム動作中は必ず一つだけ常に存在している。ＣＰＵは、このカーネルタスクの実行中にはタスクの生成や消滅、後述の例外処理等、他のタスクの実行中には実行できない特別な処理を実行することができる。ＣＰＵが、任意のタスクのメモリ空間を読み書きできるのも、カーネルタスクの実行中だけである。なお、カーネルタスク以外のタスクは、これと区別するために「ユーザタスク」と呼ぶ。
【０００８】
前述の通り、タスクは「例外」という事象をＣＰＵが検出したときに実行が中断される。例外とは、プログラムの実行中にＣＰＵが検知した“特別な処理が必要な事態”のことである。例えば、“除算を実行しようとしたら除数が０だった”、“メモリの読み書きをしようとしたらその領域が読み書き禁止に設定されていた”、“外部機器から緊急の処理が必要であることを示す信号が入力された”、“周期的なタスク切り替えを起こすべき時間になったことがタイマから通知された”、等の事象がこれに相当する。
【０００９】
例外が発生すると、マルチタスクコンピュータシステムでは、ＣＰＵは実行中のタスクを直ちに中断し、タスクをカーネルタスクに切り替え、例外処理プログラムを実行させる。例外処理プログラムは例外事象を解析し、その原因に応じた対応、例えばエラーの処理や外部機器の制御等を行った後、タスク切り替えプログラムに制御を移す。タスク切り替えプログラムは、各々のタスクの状態に基づいて実行させるべきタスクを一つ選択し、そのタスクへのタスク切り替えを行う。
マルチタスクでないシステム（シングルタスクコンピュータシステム）では、例外が発生すると、ＣＰＵは実行中のタスクを直ちに中断し、例外処理プログラムを実行させるが、例外処理プログラムは例外に対する適切な処理を行った後、すぐ元のタスクの実行を再開させる。
【００１０】
一般に、例外により中断されたタスクの実行を再開することを「例外復帰処理」と呼ぶ。タスクの中断は常に例外によるものであり、タスク切り替えは常に例外により中断されたタスクを再び実行状態にする処理である。よってタスク切り替えは一種の例外復帰処理であると言える。
【００１１】
なお、前述のように、例外には“外部機器からの信号”や“タイマからの通知”のような、正常なシステム動作の範疇の中で発生するものと、“除数が０”や“読み書き禁止領域へのアクセス”のような、システム作成者の意図から外れた、本来は発生するはずのないものが存在する。ここでは、前者を「正常な処理による例外」、後者を「不正な処理による例外」と呼ぶ。
【００１２】
さて、デバッガを使用した解析作業で最も難しいことは “プログラムのどの箇所で実行を停止させるか”を予め決定することである。
一般に、デバッガを用いたデバッグ作業は次のような手順で行われる。まず作業者がデバッガを使ってＣＰＵを強制的に停止させ、解析したいプログラムの解析したい箇所の命令をブレーク命令に書き換えた後、ＣＰＵの実行を再開させる。ＣＰＵがそのブレーク命令を実行するとデバッガはその実行を検知してＣＰＵを停止させ、作業者にデバッグ作業の開始を促す。これにより、作業者はブレーク命令を設定した箇所の周辺をＣＰＵが実行する際の挙動を詳しく解析することが可能になる。
【００１３】
しかし、ほとんどの場合、プログラムのどこを解析すべきかは自明でないため、作業者はこの作業の前にさまざまな工夫を凝らして解析すべき箇所を見極めなければならない。
プログラムが、例えば０による除算のような、不正な処理による例外を発生させるなら、解析すべき箇所は明白である。まずはその例外を発生させた箇所で停止させ、その時のＣＰＵやメモリの状態を調べれば何らかの手掛かりは得られるはずだからである。
しかし、プログラムが不正な処理による例外をどこで発生させるかを事前に察知することは、多くの場合大変難しい。ほとんどの場合はこうした例外は作業者の想定外の箇所で発生する。つまり、例外が発生してから事後的に、あの場所にブレーク命令を埋め込んでおけばよかったと後悔することになる。再現性の低い事象の場合には特にこの問題が大きく影響する。
【００１４】
従来のデバッガ起動プログラムには、このような問題に対処するため、次の方法を取っているものがある（特許文献１参照）。
１．あらかじめ全てのメモリ空間を書込み禁止に設定しておく。
２．ＣＰＵがプログラム実行中にメモリへの書込みをすると、メモリへの書込み禁止違反例外が発生するので、ＣＰＵは例外処理プログラムに制御を移す。
３．ＣＰＵは例外処理プログラムを実行してその中でその書込みが適切なものかどうかを判定し、その書込みが適切だと判断すれば書込み処理を実行し、例外復帰処理をする。適切でないと判断すれば、デバッガを起動する。
【特許文献１】特開平８−３０４８５号公報
【発明の開示】
【発明が解決しようとする課題】
【００１５】
しかし上記特許文献１に記載の方法では、例外処理プログラムの中でＣＰＵがデバッガを起動するため、デバッガがＣＰＵを停止させた瞬間にＣＰＵが実行しているのは、不正な処理による例外を発生させたプログラムではなく、カーネルタスクで実行されている例外処理プログラムである。タスクの状態が変わってしまうので、例外が発生したその瞬間のＣＰＵの状態もメモリの状態も、この方法では調べることは出来ない。
そのため、ＣＰＵが不正な処理による例外を発生させる命令を実行しようとした、まさにその瞬間の状態を解析するという点において、課題が残る。
【００１６】
本発明の目的は、予めブレーク命令を埋め込んでおかなくても、不正な処理による例外が発生したときに、その例外を発生させた命令を実行する直前の状態で、タスクの状態もＣＰＵの状態もメモリの状態も変えることなく、デバッガにＣＰＵを停止させる方法を提供することにある。
【課題を解決するための手段】
【００１７】
本発明は上記課題に鑑みてなされたものであり、コンピュータに例外事象が発生したときに起動される例外処理装置であって、前記例外事象を解析する解析部と、前記例外事象の原因となった命令が記憶されているメモリ空間上の領域をデバッガ起動用命令で書き換える書き換え部と、を備える。すなわち、本発明の例外処理装置は、デバッガ起動用命令が実行されたときに起動されるデバッガを、前記デバッガ起動用命令とは異なる命令によって例外事象が発生したことをトリガとして起動させる。
【００１８】
また、本発明は、コンピュータに例外事象が発生したときに起動される例外処理装置における例外処理方法であって、前記例外事象を解析する過程と、前記例外事象の原因となった命令が記憶されているメモリ空間上の領域をデバッガ起動用命令で書き換える過程と、を有する。
【００１９】
また、本発明は、コンピュータに例外事象が発生したときに起動される例外処理プログラムであって、前記例外事象を解析する処理と、前記例外事象の原因となった命令が記憶されているメモリ空間上の領域をデバッガ起動用命令で書き換える処理と、を前記コンピュータに実行させる。
【００２０】
本発明によれば、デバッグ作業の対象となるプログラムを実行するコンピュータは、当該コンピュータに例外事象が発生した原因を解析し、前記原因が、メモリ空間に記憶された命令が前記コンピュータに不正な処理を実行させようとしたことである場合、前記命令を、デバッガ起動用命令で書き換え、各々のタスクの状態に基づいて実行させるべきタスクを選択して切り替えるか、または、前記例外事象の発生により中断された処理を再開させる。そして、前記コンピュータが前記デバッガ起動用命令を実行すると、デバッガがこれを検出し、起動する。
【発明の効果】
【００２１】
本発明によれば、ある命令が不正な処理による例外を発生させたとき、その命令はデバッガを起動する命令（一例として、ブレーク命令）に書き換えられるので、その後、例外復帰処理によりその例外を発生させたタスクに再び制御が戻ったとき、例外が発生した直前の状態で、デバッガにＣＰＵを停止させることができる。
また、マルチタスクコンピュータシステムにおいて複数のタスクに共有されるプログラムに含まれる命令が不正な処理による例外を発生させた場合でも、その例外を発生させたタスク以外のタスクでデバッガが起動されることはない。
すなわち本発明の効果は、不正な処理による例外が発生したとき、その例外を発生させた命令を実行する直前の状態で、タスクの状態もＣＰＵの状態もメモリの状態も変えることなく、デバッガにＣＰＵを停止させる方法を提供することにある。
【発明を実施するための最良の形態】
【００２２】
［実施形態１］
図１は、本発明を実施するための最良の形態である、マルチタスクコンピュータシステム（以下、本マルチタスクシステムと呼ぶ）のブロック図である。
本マルチタスクシステムは、ＣＰＵ・１０１と、起動されるとＣＰＵ・１０１の状態を制御し、プログラムのデバッグを支援するデバッガ１０２と、ＣＰＵ・１０１が管理するカーネルタスクのメモリ空間１０３と、ＣＰＵ・１０１が管理するユーザタスク１およびユーザタスク２のメモリ空間１０４と、ＣＰＵ・１０１が管理するユーザタスク３のメモリ空間１０５とを有する。ここで、ＣＰＵの状態とは、例えば演算用レジスタやプログラムカウンタ等がそのとき保持する値等である。
さらに、カーネルタスクのメモリ空間１０３は、例外処理プログラム１０６と、タスク切り替えプログラム１０７とを記憶し、ユーザタスク１およびユーザタスク２のメモリ空間１０４は、ユーザタスク１およびユーザタスク２のユーザプログラム１０８を記憶し、ユーザタスク３のメモリ空間１０５はユーザタスク３のユーザプログラム１０９を記憶している。
さらに、例外処理プログラム１０６はブレーク命令１１０を含み、ユーザタスク１およびユーザタスク２のユーザプログラム１０８は数値０による除算命令１１１を含んでいる。
【００２３】
ＣＰＵ・１０１は、本マルチタスクシステム全体を制御する。また、本マルチタスクシステムではＣＰＵ・１０１は以下４つのタスク、すなわち、カーネルタスク、ユーザタスク１、ユーザタスク２、ユーザタスク３を持っており、これらを並行して実行している。
デバッガ１０２は、ＣＰＵ・１０１の動作を停止させたり、ＣＰＵ・１０１の内部の状態を調査したり、ＣＰＵ・１０１に１命令ずつプログラムを実行させたりすることにより、作業者のデバッグ作業を支援する。
各タスクのメモリ空間は、そのタスクに対応するプログラムやデータ、および実行中のＣＰＵ・１０１の状態を保存する。なお、この例ではユーザタスク１とユーザタスク２はメモリ空間およびその上に記憶されているプログラムを共有している。
ブレーク命令１１０は、ＣＰＵ・１０１にデバッガを起動させる命令である。ＣＰＵ・１０１がこの命令を実行すると、デバッガはその実行を検知し、直ちにＣＰＵを停止させ、作業者にデバッグ作業の開始を促す。
【００２４】
数値０による除算命令１１１は、何らかの理由により実行時に除数として０が与えられてしまった割り算命令であり、プログラムの誤りにより生成された、本来あるべき状態でない命令である。デバッグ作業者にとっては、この命令を実行する直前の状態でＣＰＵ・１０１を停止させるということが、作業の手掛かりをつかむ上では非常に重要である。ＣＰＵ・１０１は、数値０による除算命令１１１を実行すると、０除算（division by zero）例外と呼ばれる例外を発生する。
なお、本実施形態ではユーザタスク１とユーザタスク２がプログラム領域を共有しているので、いずれのタスクでもこの数値０による除算命令１１１が実行されてしまう可能性があるが、ここでは説明の便宜上、ユーザタスク１の実行中に除算命令が実行された場合について述べる。
【００２５】
例外処理プログラム１０６は、ＣＰＵ・１０１が例外を検出したときに実行するプログラムである。ＣＰＵ・１０１は例外を検出すると、自動的に実行中のタスクを中断し、タスクをカーネルタスクに切り替え、この例外処理プログラムの実行を開始し、例外の種別の判定、各々の例外の内容に適した処理を行う。
また、この例外処理プログラム１０６は、ＣＰＵ・１０１が検出した例外が“不正な処理による例外”であった場合には、その例外を発生させた命令を、デバッガ１０２を起動するブレーク命令１１０に書き換えるという機能を持っている。
【００２６】
タスク切り替えプログラム１０７は、ＣＰＵ・１０１が“次に実行すべきタスク”を選択するために実行するプログラムである。ＣＰＵ・１０１は例外処理プログラム１０６の実行後、このタスク切り替えプログラム１０７を実行し、それまでの実行履歴やタスク間の優先度などに基づいて、次にどのタスクへの切り替えを行うのが適切かを決定する。
すなわち、このタスク切り替えプログラム１０７は、例外復帰処理をするプログラムである。なお、後述の実施形態２においては、上記の例外処理プログラム１０７が例外復帰処理をするプログラムの役目も果たす。
【００２７】
次に、本マルチタスクシステムの処理について、図２に示すフローチャートを参照して説明する。
はじめに、ステップ２−１では、ＣＰＵ・１０１は、現在実行中の状態にあるタスクのプログラムを実行する。処理はステップ２−２へ進む。
ステップ２−２では、デバッガ１０２は、ＣＰＵ・１０１がブレーク命令を実行したか否かの判定を行う。実行していればステップ２−１０へ、実行していなければステップ２−３へ処理が進む。
ステップ２−３では、ＣＰＵ・１０１は、例外を検出したか否かの判定を行う。例外を検出していなければ処理はステップ２−１へ戻り、引き続きＣＰＵ・１０１がプログラムの実行を行う。例外を検出していれば処理はステップ２−４へ進む。
ステップ２−４では、ＣＰＵ・１０１は、実行中のタスクの状態を保存した後、カーネルタスクへの切り替えを行い、例外処理プログラム１０６の実行を開始する。処理はステップ２−５へ進む。
【００２８】
ステップ２−５では、ＣＰＵ・１０１は、例外処理プログラム１０６を実行して、例外の内容を解析する。すなわち、ＣＰＵ・１０１がカーネルタスクのメモリ空間１０３に読み込まれた例外処理プログラム１０６に含まれる、前記解析に関する一連の命令を実行することによって、例外処理装置の解析部が構築される。発生した例外が“不正な処理による例外”であれば、処理はステップ２−７に進む。そうでなければ、処理はステップ２−６に進む。
ユーザタスク１の“数値０による除算命令”がステップ２−１で実行されていた場合は、このステップの判定により、処理はステップ２−７に進む。
ステップ２−６では、ＣＰＵ・１０１は、例外処理プログラム１０６を実行して、“正常な処理による例外”に対する処理、例えば外部装置からの緊急処理要求信号に対する対応などを行う。処理はステップ２−９に進む。
【００２９】
ステップ２−７では、ＣＰＵ・１０１は、不正な処理による例外を発生させたタスクのメモリ空間上にある、不正な処理による例外を発生させた命令を、ブレーク命令に書き換える。すなわち、ＣＰＵ・１０１がカーネルタスクのメモリ空間１０３に読み込まれた例外処理プログラム１０６に含まれる、前記書き換えに関する一連の命令を実行することによって、例外処理装置の書き換え部が構築される。例えば、ユーザタスク１の“数値０による除算命令１１１”がステップ２−１で実行されていた場合は、ここで、例外を発生させた“除算命令１１１”を“ブレーク命令１１０”に書き換える。処理はステップ２−８に進む。
ステップ２−８では、ＣＰＵ・１０１は、タスク切り替えプログラム１０７を“不正な処理による例外を発生させたタスクとメモリ空間を共有するタスク”には切り替えないように設定する。すなわち、ユーザタスク１の“数値０による除算命令１１１”がステップ２−１で実行されていた場合は、これ以降、タスク切り替えプログラム１０７がユーザタスク２へのタスク切り替えを起こさないように設定する。なお、この処理を行う理由、および、タスク切り替えプログラム１０７の詳細は後述する。処理はステップ２−９に進む。
【００３０】
ステップ２−９では、ＣＰＵ・１０１は、タスク切り替えプログラム１０７を実行して、それまでの実行履歴やタスク間の優先度などに基づいて、次に切り替えるべきタスクを決定し、そのタスクへの切り替えを実行する。処理はステップ２−１に戻る。
すなわち、ユーザタスク１の“数値０による除算命令１１１”がステップ２−１で実行されていた場合は、ステップ２−８で説明したとおり、ユーザタスク２への切り替えは起こらない。
また、ここでユーザタスク１が選択された場合には、“不正な処理による例外”を発生させた命令の実行直前のＣＰＵの実行状態が復元され、処理がステップ２−１に戻る。すると次に実行される命令は、ステップ２−７で書き込まれていたブレーク命令１１０なので、その結果、処理はステップ２−２から２−１０へ移る。
最後にステップ２−１０で、デバッガ１０２は“ＣＰＵによるブレーク命令の実行”を検出し、強制的にＣＰＵ・１０１を停止させ、作業者にデバッグ作業の開始を促す。
【００３１】
以上のような処理により、本マルチタスクシステムは、不正な処理による例外が発生したときに、その例外を発生させた命令を実行する直前の状態で、タスクの状態もＣＰＵの状態もメモリの状態も変えることなく、デバッガ１０２を起動することができる。
【００３２】
ここで、上記ステップ２−８の処理を行う理由を説明する。本実施形態のように、“不正な処理による例外を発生させる命令”を含むプログラムが複数のタスクに共有されている場合には、上記ステップ２−８は重要な役割を果たす。なぜなら、例えばユーザタスク１が“０による除算の例外”を発生させるとステップ２−７でプログラムが書き換えられてしまうため、ステップ２−９で、不正な処理による例外を発生させる命令を実行したユーザタスク１ではなく、それとプログラムを共有するユーザタスク２が選択されたとすると、ユーザタスク２の実行状態でブレーク命令１１０が実行されてしまい、不正な処理による例外を発生させる命令の実行直前の状態ではない状態でデバッガ１０２が起動され、作業者に誤った作業をさせてしまう可能性があるからである。
しかし、ステップ２−８の処理を行うことにより、本実施形態では例え“不正な処理による例外を発生させる命令”を含むプログラムが複数のタスクに共有されていた場合でも、“不正な処理による例外”を発生させたタスクの実行中の状態で、デバッガ１０２を起動することが可能になっている。
【００３３】
次に、実施形態１で用いられたタスク切り替えプログラム１０７を詳細に説明する。
図３は、実施形態１のマルチタスクコンピュータシステムの“タスク切り替えプログラム”１０７をより詳細に説明したブロック図である。
図３に示すように、本タスク切り替えプログラム１０７は、システムが生成した全タスクについてそれぞれの情報を記憶したタスク情報６０１と、“タスク切り替えの対象とすべき、あるいは対象としてはならないタスク”に関する情報を記憶したタスク選択制約情報６０２と、タスク情報６０１に基づいて、タスク切り替えの対象とするタスクを選択するタスク選択プログラム６０３と、タスク選択制約情報６０２に基づいて、選択されたタスクが切り替えの対象としても良いタスクなのか否かを判定するタスク選択制約条件判定プログラム６０４と、選択されたタスクへの切り替えを実行するタスク切り替え実施プログラム６０５とを含む。
【００３４】
また図３に示すように、タスク情報６０１には、それぞれのタスク（カーネルタスク、ユーザタスク１〜３）が使用するメモリ空間（メモリ空間Ａ〜Ｃを識別する情報）、タスクを起動したユーザ（カーネル、ユーザＡ、Ｂを識別する情報）、そのタスクが使用する外部装置を表す情報（例えば、オープンしているファイル、メモリ空間に保持している外部装置の識別情報、メモリマップ技術により直接アクセス可能な状態になっているメモリマップドＩ／Ｏ空間の情報等の情報である。図３では簡略に「外部装置Ｘ」または「なし」と記載している。）が記憶されている。
また図３に示すように、タスク選択制約情報６０２には、切り替えの対象としてはならない、あるいは対象とすべきタスクの条件が情報要素として記憶されている。図に示す例では、記憶されているのは「識別子名が『ユーザタスク１』であるタスクだけが選択される」という条件である。なお、切り替えの対象とすべきタスクとしてカーネルタスクが表わされていないが、仮想記憶技術によってメモリ空間を実現するシステムにおいては、ページフォルトの例外を処理する必要があるため、カーネルタスクも切り替えの対象とすべきタスクに含む。これは、ユーザタスク１のユーザプログラム１０８のうちＣＰＵ・１０１がアクセスしようとするアドレスのプログラムがページアウト（物理的メモリ装置から外部記憶装置に退避）されていた場合に、ページインする（外部記憶装置から物理的メモリ装置に読み込む）ためである。
なお、これは実施形態１において図２のステップ２−８で述べた「タスク切り替えプログラム１０７を “不正な処理による例外を発生させたタスクとメモリ空間を共有するタスク”には切り替えないように設定する」という処理の結果の具体例になっている。つまり、ステップ２−８の処理は実際にはこのようなタスク制約情報への情報追加、という形で実現される。
【００３５】
以下、図４に示すフローチャートに従って、タスク切り替えプログラム１０７の動作を説明する。
はじめにステップ７−１では、ＣＰＵ・１０１はタスク選択プログラム６０３を実行し、タスク情報６０１に記憶されたタスクの中から、タスク切り替えの対象とするタスクを一つ選択する。処理はステップ７−２に進む。
ステップ７−２では、ＣＰＵはタスク選択制約条件判定プログラム６０４を実行し、直前のステップ７−１で選択されたタスクが、タスク切り替えをしても良いタスクなのか否かを判定する。処理はステップ７−３に進む。
ステップ７−３では、選択されたタスクへのタスク切り替えが適切であると判定されればステップ７−４に、そうでなければステップ７−１に処理を進める。このとき、タスク切り替えが適切であると判定されなかったタスクが、次回のステップ７−１における処理で選択されにくくすることが望ましい。例えば、タスク選択プログラム６０３において、実行頻度の高いタスクのスコアが低くなり選択されにくくなるアルゴリズムによりタスクを選択する場合には、ステップ７−１で選択されたがステップ７−２で切り替えが適切であると判定されなかったタスクのスコアを低くした後、ステップ７−１に処理を進めることにより実現することができる。
ステップ７−４では、実際に選択されたタスクへの切り替えを行う。プログラムの動作はこれで終了となる。
【００３６】
図３に示すタスク情報６０１およびタスク選択制約情報６０２の例では、ステップ７−１の処理でユーザタスク１またはカーネルタスクが選択されるまで、ステップ７−１から７−３が繰り返され、ユーザタスク１またはカーネルタスクが選択されてタスク切り替えが起こった時点で処理終了となる。
なお、この例では記憶されるタスク情報６０１、およびタスク選択制約情報６０２は、ＩＤとメモリ空間、タスクを起動したユーザ、外部装置へのアクセスであるとしたが、記憶される情報はこれに限定されるものではなく、メモリの消費量、起動時コマンドライン引数、タスク切り替え履歴など、タスクに関する情報であれば何でも良い。
【００３７】
［実施形態２］
次に、本マルチタスクシステムの処理の別の形態について、図５に示すフローチャートを参照して説明する。
図２と図５の記載が異なるのはステップ３−８のみであり、それ以外のステップは前述の図２と同一、すなわち、ステップ３−１〜３−７、３−９、３−１０はステップ２−１〜２−７、２−９、２−１０と、それぞれ同じ記載なので、ステップ３−８以外については説明を省略する。ただし、図５には、図２のステップ２−８に記載された「タスク切り替えプログラム」を設定する処理が存在しないので、実施形態２で用いられるタスク切り替えプログラム１０７は、前述した一般的なタスク切り替えが実行できるものであればよい。
【００３８】
ステップ３−８では、ＣＰＵ・１０１が直接“不正な処理による例外を発生させたタスク”への切り替えを行う。その結果、ＣＰＵ・１０１はタスク切り替えプログラム１０７を実行することなく、すぐに“不正な処理による例外を発生させたタスク”の状態を復元させる。処理はステップ３−９ではなく３−１に移る。
ユーザタスク１の“数値０による除算命令１１１”がステップ３−１で実行されていた場合は、このステップで“不正な処理による例外”を発生させた命令の実行直前のＣＰＵ・１０１の状態が復元され、処理がステップ３−１に戻る。すると次に実行される命令は、ステップ３−７で書き込まれていたブレーク命令１１０なので、その結果、処理はステップ３−２から３−１０へ移り、デバッガ１０２が起動される。
【００３９】
上記のように、図２のステップ２−６に示すような“不正な処理による例外を発生させたタスクとメモリ空間を共有するタスクに切り替えないようにタスク切り替えプログラムを設定する処理”がなくても、図２のフローチャートで説明した処理と同様の効果を得ることは可能である。
しかし、この場合、システムの通常の例外復帰処理を経ることなく例外復帰をしてしまうことになるため、システム内の不整合を起こす恐れがある。従ってマルチタスクコンピュータシステムに導入する処理としては、実施形態１に示す処理の方が、より望ましい。
【００４０】
［実施形態３］
図６は、本発明を実施するための第３の実施形態であるシングルタスクコンピュータシステム（以下、本シングルタスクシステムと呼ぶ）のブロック図である。
本シングルタスクシステムは、ＣＰＵ・４０１と、起動されるとＣＰＵ・４０１の状態を制御し、プログラムのデバッグを支援するデバッガ４０２と、ＣＰＵ・４０１が管理するメモリ空間４０３とを有する。
さらに、メモリ空間４０３は、例外処理プログラム４０６と、ユーザプログラム４０８とを記憶している。
さらに、例外処理プログラム４０６は、ブレーク命令４１０を含み、ユーザプログラム４０８は、数値０による除算命令４１１を含んでいる。
ＣＰＵ・４０１、デバッガ４０２、メモリ空間４０３、ユーザプログラム４０８、ブレーク命令４１０、数値０による除算命令４１１は、それぞれ前述の実施形態１と同一のものなので、説明は省略する。
例外処理プログラム４０６は、前述の実施形態１のものとほぼ同様であるが、例外処理が終了したところで、ＣＰＵ・４０１はタスク切り替えプログラムを実行する代わりに、直ちに例外復帰処理を行う。
【００４１】
次に、本シングルタスクシステムの処理について、図７に示すフローチャートを参照して説明する。
はじめにステップ５−１では、ＣＰＵ・４０１はプログラムを実行する。処理はステップ５−２に進む。ステップ５−２、５−３は、前述のステップ２−２、２−３と同一である。ステップ５−４では、ＣＰＵ・４０１は実行中のタスクの状態を保存した後、例外処理プログラム４０６の実行を開始する。処理はステップ５−５へ進む。ステップ５−５〜５−７は、前述のステップ２−５〜２−７と同一である。ステップ５−９では、ＣＰＵが例外復帰処理を行う。処理はステップ５−１に移る。ステップ５−１０は、前述のステップ２−１０と同一である。
【００４２】
ユーザプログラム４０８の“数値０による除算命令４１１”が実行されると、実施形態１の場合と同様に、ステップ５−３から５−４、５−５、５−７へと処理が進み、除算命令４１１がブレーク命令４１０に書き換えられた後、５−９で例外復帰処理が行われる。その結果、除算命令４１１の実行直前のＣＰＵ・４０１の実行状態が復元された上で、処理はステップ５−１に戻る。直後に実行されるのはステップ５−７で書き込まれたブレーク命令４１０なので、処理はステップ５−２から５−１０へ進み、デバッガ４０２が起動されることになる。
【００４３】
以上のような処理により、本シングルタスクシステムにおいても、不正な処理による例外が発生したときに、その例外を発生させた命令を実行する直前の状態で、タスクの状態もＣＰＵの状態もメモリの状態も変えることなく、デバッガ４０２を起動することができる。
なお、シングルタスクシステムにおいては「タスク切り替えプログラム」が存在しないので、上で説明したように、例外復帰処理は実施形態１で説明したような仕組みではなく、実施形態２で述べたような、シングルタスクシステムにおける通常の例外復帰処理の仕組みが用いられる。
【００４４】
なお、実施形態１〜３では“数値０による除算命令”が“不正な処理による例外”を発生させるとしたが、この命令に限定するものではなく、例えば“不正なメモリ領域へのアクセス”、“アドレスアラインメントの不正”、“未定義命令の実行”など、“不正な処理による例外”を発生させるような命令であれば何でも良い。
また、実施形態１、２では“不正な処理による例外を発生させる命令”を含むプログラムはユーザタスク１とユーザタスク２に共有されているとしたが、このようなプログラムは複数のタスクに共有されていなくてもよく、また逆に３つ以上のタスクに共有されていても良い。同様に、ユーザタスクの数も３つに限定するものではない。
また、実施形態1〜３ではデバッガを“ブレーク命令”で起動するとしたが、これはデバッガを起動することの出来る命令であれば何でも良く、この命令に限定するものではない。
【００４５】
次に、図８、図９を参照して、本発明を実装した機器の例を説明する。なお、以下で説明するテレビおよび携帯電話は例示であり、本発明が実装される機器はこれらに限定されない。
図８は、本発明を実装したテレビのブロック図である。テレビ８０１は、アンテナ８０２と接続されたチューナ８０３、制御部８０４、画面８０５、スピーカ８０６、メモリ空間１０３、１０４、１０５を備える。なお、ケーブル（同軸ケーブル、光ケーブル等）を用いて有線放送を受信する場合は、図示しないが、チューナ８０３はケーブルに接続される。また、制御部８０４はＣＰＵ・１０１を備え、ＣＰＵ・１０１はデバッガ１０２と接続されるとともにメモリ空間１０３、１０４、１０５と接続されている。図８に示す通り、テレビ８０１のチューナ８０３、制御部８０４、画面８０５、スピーカ８０６、メモリ空間１０３、１０４、１０５は相互に接続されている。
図８のＣＰＵ・１０１、デバッガ１０２、メモリ空間１０３、１０４、１０５の構成および動作は、図１、図２を参照して説明した通りであり、図８のテレビ８０１は図１、図２を参照して説明したマルチタスクコンピュータシステムを具備している。
制御部８０４のＣＰＵ・１０１は、メモリ空間１０３、１０４、１０５に記憶されたプログラムを実行することによって、テレビ８０１の各部を制御する。すなわち、制御部８０４の制御のもとで、チューナ８０３は、アンテナ８０２によって受信された電波から映像、音声を再生し、画面８０５、スピーカ８０６に出力する。制御部８０４による制御には、図２を参照して説明した第１実施形態における処理が含まれる。例えば、作業者がテレビ８０１のＣＰＵ・１０１にデバッガを接続してテレビ８０１を動作させると、ＣＰＵ・１０１はメモリ空間１０３、１０４、１０５のプログラムを実行する。そして、ＣＰＵ・１０１は、不正な処理による例外を検出すると、その例外を発生させたタスクのメモリ空間上にある、その例外を発生させた命令をブレーク命令に書き換え、デバッガ１０２はＣＰＵ・１０１によるブレーク命令の実行を検出し、強制的にＣＰＵ・１０１を停止させ、作業者にデバッグ作業の開始を促す。
なお、上記のテレビ８０１の構成は例示であり、この構成に限定されない。また、制御部８０４は図５を参照して説明した第２実施形態における処理を行ってもよい。
【００４６】
図９は、本発明を実装した携帯電話のブロック図である。携帯電話９０１は、アンテナ９０２と接続された送受信部９０３、制御部９０４、マイク９０５、スピーカ９０６、メモリ空間１０３、１０４、１０５を備える。また、制御部９０４はＣＰＵ・１０１を備え、ＣＰＵ・１０１はデバッガ１０２と接続されるとともにメモリ空間１０３、１０４、１０５と接続されている。図９に示す通り、携帯電話９０１の送受信部９０３、制御部９０４、マイク９０５、スピーカ９０６、メモリ空間１０３、１０４、１０５は相互に接続されている。
図９のＣＰＵ・１０１、デバッガ１０２、メモリ空間１０３、１０４、１０５の構成および動作は、図１、図２を参照して説明した通りであり、図９の携帯電話９０１は図１、図２を参照して説明したマルチタスクコンピュータシステムの構成を具備している。
制御部９０４のＣＰＵ・１０１は、メモリ空間１０３、１０４、１０５に記憶されたプログラムを実行することによって、携帯電話９０１の各部を制御する。すなわち、制御部９０４の制御のもとで、送受信部９０３は、アンテナ９０２によって受信された搬送波を復調し、得られた音声をスピーカ９０６に出力するとともに、マイク９０５から入力された音声によって搬送波を変調してアンテナ９０２から発信する。制御部９０４による制御には、図２を参照して説明した第１実施形態における処理が含まれる。例えば、作業者が携帯電話９０１のＣＰＵ・１０１にデバッガを接続して携帯電話９０１を動作させると、ＣＰＵ・１０１はメモリ空間１０３、１０４、１０５のプログラムを実行する。そして、ＣＰＵ・１０１は、不正な処理による例外を検出すると、その例外を発生させたタスクのメモリ空間上にある、その例外を発生させた命令をブレーク命令に書き換え、デバッガ１０２はＣＰＵ・１０１によるブレーク命令の実行を検出し、強制的にＣＰＵ・１０１を停止させ、作業者にデバッグ作業の開始を促す。
なお、上記の携帯電話９０１の構成は例示であり、この構成に限定されない。また、制御部９０４は図５を参照して説明した第２実施形態における処理を行ってもよい。
【００４７】
次に、図１０、図１１を参照してデバッガの実際の動作時の画面例を表わす。上述したように、これらの画面は、例えば、デバッガを、デバッグ作業の対象となるプログラムを実行するコンピュータのＣＰＵとプローブを介して接続するとともに、一般的なパーソナルコンピュータと通信インタフェースを介して接続し、そのパーソナルコンピュータで実行されるデバッガ制御プログラムによって表示される。
図１０はブレーク命令が書き込まれる前の画面であり、作業者がデバッガを操作して図２のステップ２−７が実行される前にＣＰＵ、メモリの状態を表示すると、このように表示される。図１０の画面の上段中央のウィンドウには、行ごとに、メモリアドレス、そのアドレスに記憶された機械語コード、対応するアセンブラコードの順で表示されており、対応するソースコードを表示する行も含む。ここで、「004007F4  A0400000    SB  r0,0(r2)」と表示された行は、不正メモリアクセスを行う命令が記憶されたアドレス、その命令の機械語コード、アセンブラコードを表わす。
一方、図１１はブレーク命令が書き込まれた後の画面であり、図２のステップ２−１０においてＣＰＵ、メモリの状態を表示すると、このように表示される。図１１の画面の上段中央のウィンドウの表示を見ると、メモリアドレス「004007F4」からの４バイトは、図１０では不正メモリアクセスを行う命令「A0400000」であったが、ブレーク命令「0000000E」に書き換えられている。
【図面の簡単な説明】
【００４８】
【図１】本発明を実装したマルチタスクコンピュータシステムのブロック図である。
【図２】本発明を実装したマルチタスクコンピュータシステムのフローチャートである。
【図３】タスク切り替えプログラムの構成を表わす図である。
【図４】タスク切り替えプログラムの動作を表わすフローチャートである。
【図５】本発明を実装したマルチタスクコンピュータシステムの、もう一つのフローチャートである。
【図６】本発明を実装したシングルタスクコンピュータシステムのブロック図である。
【図７】本発明を実装したシングルタスクコンピュータシステムのフローチャートである。
【図８】本発明を実装したテレビのブロック図である。
【図９】本発明を実装した携帯電話のブロック図である。
【図１０】デバッガの実際の動作時の画面例を表わす。
【図１１】デバッガの実際の動作時の画面例を表わす。
【符号の説明】
【００４９】
１０１  ＣＰＵ
１０２  デバッガ
１０３  カーネルタスクのメモリ空間
１０４  ユーザタスク１およびユーザタスク２のメモリ空間
１０５  ユーザタスク３のメモリ空間
１０６  例外処理プログラム
１０７  タスク切り替えプログラム
１０８  ユーザタスク１およびユーザタスク２のユーザプログラム
１０９  ユーザタスク３のユーザプログラム
１１０  ブレーク命令
１１１  数値０による除算命令
４０１  ＣＰＵ
４０２  デバッガ
４０３  メモリ空間
４０６  例外処理プログラム
４０８  ユーザプログラム
４１０  ブレーク命令
４１１  数値０による除算命令
６０１  タスク情報
６０２  タスク選択制約情報
６０３  タスク選択プログラム
６０４  タスク選択制約条件判定プログラム
６０５  タスク切り替え実施プログラム
【図１】
2008257438.tif 000003
【図２】
2008257438.tif 000004
【図３】
2008257438.tif 000005
【図４】
2008257438.tif 000006
【図５】
2008257438.tif 000007
【図６】
2008257438.tif 000008
【図７】
2008257438.tif 000009
【図８】
2008257438.tif 000010
【図９】
2008257438.tif 000011
【図１０】
2008257438.tif 000012
【図１１】
2008257438.tif 000013