(57)【要約】【課題】少なくとも一部のタスクがスレッドであるようなシステムにおいても、ユーザが意図しないところでシステムの状態が変わってしまうという事象がおきないようにしつつも、相互に関連するタスクを動作させながら、プログラムの部分実行を行う。【解決手段】マルチタスク処理を行うコンピュータ上で他のタスクと相互に関連して実行されるタスクの一部の処理に対するデバッグを行うデバッグ装置は、デバッグ対象タスクに一部の処理の実行をさせる指示を受け付けるコマンド入力部と、一部の処理の実行に関連する関連タスク群をコンピュータ上で実行中のタスクの実行位置及びデータフロー解析に基づいて判定する関連タスク識別部と、デバッグ対象タスク及び関連タスク群にのみタスク切り替えが起こるようコンピュータを制御するタスク切り替え抑制部と、一部の処理をコンピュータに実行させる部分実行部と、を備える。【選択図】図１
2009295078.tif 000002
【特許請求の範囲】
【請求項１】
マルチタスク処理を行うコンピュータ上で他のタスクと相互に関連して実行されるタスクの一部の処理に対するデバッグを行うデバッグ装置であって、
デバッグ対象タスクに一部の処理の実行をさせる指示を受け付けるコマンド入力部と、
前記コマンド入力部により実行指示された一部の処理の実行に関連する関連タスク群を前記コンピュータ上で実行中のタスクの実行位置及びプログラムの各要素同士の関連を解析するデータフロー解析に基づいて判定する関連タスク識別部と、
前記デバッグ対象タスク及び前記関連タスク識別部により判定された関連タスク群にのみタスク切り替えが起こるよう前記コンピュータを制御するタスク切り替え抑制部と、
前記コマンド入力部により指定された一部の処理を前記コンピュータに実行させる部分実行部と、
を備えることを特徴とするデバッグ装置。
【請求項２】
前記関連タスク識別部は、
前記コンピュータ上で実行中のタスクの実行位置を示すユーザタスク実行位置情報を前記コンピュータから取得する取得部と、
前記デバッグ対象タスク及び前記コンピュータ上で実行中のタスクのプログラムの実行単位である関数の呼び出し関係を示すプログラムコールグラフ情報及び前記プログラム中の関数が参照する変数を示すプログラムデータフロー情報の入力を受け付ける入力部と、
を備え、
前記ユーザタスク実行位置情報と、前記プログラムコールグラフ情報及び前記プログラムデータフロー情報を用いたデータフロー解析に基づいて前記関連タスク群を判定する
ことを特徴とする請求項１に記載のデバッグ装置。
【請求項３】
マルチタスク処理を行うコンピュータ上で他のタスクと相互に関連して実行されるタスクの一部の処理に対するデバッグを行うデバッグ方法であって、
デバッガ装置が、デバッグ対象タスクに一部の処理の実行をさせる指示を受け付けるステップと、
デバッガ装置が、前記一部の処理の実行に関連する関連タスク群を前記コンピュータ上で実行中のタスクの実行位置及びプログラムの各要素同士の関連を解析するデータフロー解析に基づいて判定するステップと、
デバッガ装置が、前記デバッグ対象タスク及び前記関連タスク群にのみタスク切り替えが起こるよう前記コンピュータを制御するステップと、
デバッガ装置が、前記一部の処理を前記コンピュータに実行させるステップと、
を有することを特徴とするデバッグ方法。
【請求項４】
マルチタスク処理を行うコンピュータ上で他のタスクと相互に関連して実行されるタスクの一部の処理に対するデバッグを行うためのプログラムであって、
デバッグ対象タスクに一部の処理の実行をさせる指示を受け付けるステップと、
前記一部の処理の実行に関連する関連タスク群を前記コンピュータ上で実行中のタスクの実行位置及びプログラムの各要素同士の関連を解析するデータフロー解析に基づいて判定するステップと、
前記デバッグ対象タスク及び前記関連タスク群にのみタスク切り替えが起こるよう前記コンピュータを制御するステップと、
前記一部の処理を前記コンピュータに実行させるステップと、
をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、デバッグ装置、デバッグ方法及びプログラムに関する。
【背景技術】
【０００２】
まず、主な用語を説明した後、従来のデバッグ作業について説明する。
「マルチタスクコンピュータシステム」とは、後述の「タスク切り替え」と呼ばれる機構により、実際の中央演算装置（以下、ＣＰＵ）の搭載数よりも多い数のプログラムを並行に実行することができるように構成されたコンピュータのことである。
【０００３】
「タスク」とは、プログラムやデータ、及び実行中のＣＰＵの状態を管理する単位である。ＣＰＵは、後述の「例外」と呼ばれる事象を検出すると、プログラムの実行を一時中断し、その時のタスクの状態（そのタスクに対応するプログラム、データ、ＣＰＵの状態）を保存して、その代わりに以前に中断された別のタスクの状態を復元し、あるいは新たにまったく別のタスクを生成し、実行を再開（あるいは開始）させることができる。この動作を「タスク切り替え」と呼び、このとき実行を再開（あるいは開始）されたタスクを「実行中」のタスクと呼ぶ。この切り替えを周期的かつ高速に行うことにより、あたかも一つのＣＰＵが複数のプログラムを並列に実行しているかのような状況を作るのが、前述のマルチタスクコンピュータシステムにおける“複数のプログラムを並行に実行する”技術である。
【０００４】
「メモリ空間」とは、ＣＰＵの仮想記憶技術により作り出された論理的な記憶装置である。仮想記憶技術とは、情報を、ハードディスク装置等の外部記憶装置と物理的メモリ装置とに分散させて記憶し、記憶された情報の配置を必要に応じて入れ替えることにより、実際に装備されている物理的メモリ装置よりも大きなサイズのメモリ装置がシステムに装備されているかのように見せかける技術である。さらに、マルチタスクコンピュータシステムにおいては、この技術を応用して、タスク切り替えの瞬間にメモリの内容を全く入れ替えてしまうことにより、タスクごとに専用のメモリ空間を提供し、タスク同士がお互いに干渉することなくプログラムやデータを保持できるようにする、という機能も実現している。この仮想記憶技術において、物理的メモリ装置に配置されていた情報を外部記憶装置に配置しなおすことを「ページアウト」、その逆に外部記憶装置に配置されていた情報を物理的メモリ装置に配置しなおす操作のことを「ページイン」と呼ぶ。
【０００５】
タスクの中には全部、または一部のメモリ空間を他のタスクと共有するものがある。これには、タスク生成時に他のタスクのメモリ空間を全てそのまま共有してプログラムを実行するようにメモリ空間を構成する場合と、別々に生成されたタスクが協調動作を行うために、カーネルタスクの特別の機能を用いる等して、メモリ空間の一部をお互いに読み書きできるような状態にする場合とがある。前者の場合において、他のタスクとメモリ空間をまるごと共有するように構成されているタスクを特に「スレッド」と呼ぶ。
【０００６】
タスクの中には、「カーネルタスク」という特別なタスクが存在する。これはタスクの管理をする唯一のタスクであり、システム動作中は必ず一つだけ常に存在している。ＣＰＵは、このカーネルタスクの実行中にはタスクの生成や消滅、後述の例外処理等、他のタスクの実行中には実行できない特別な処理を実行することができる。ＣＰＵが、任意のタスクのメモリ空間を読み書きできるのも、カーネルタスクの実行中だけである。なお、カーネルタスク以外のタスクは、これと区別するために「ユーザタスク」と呼ぶ。
【０００７】
前述の通り、タスクは「例外」という事象をＣＰＵが検出したときに実行が中断される。例外とは、プログラムの実行中にＣＰＵが検知した“特別な処理が必要な事態”のことである。例えば、“除算を実行しようとしたら除数が０だった”、“メモリの読み書きをしようとしたらその領域が読み書き禁止に設定されていた”、“外部機器から緊急の処理が必要であることを示す信号が入力された”、“周期的なタスク切り替えを起こすべき時間になったことがタイマから通知された”、等の事象がこれに相当する。
【０００８】
例外が発生すると、マルチタスクコンピュータシステムでは、ＣＰＵは実行中のタスクを直ちに中断し、タスクをカーネルタスクに切り替え、例外処理プログラムを実行させる。例外処理プログラムは例外事象を解析し、その原因に応じた対応、例えばエラーの処理や外部機器の制御等を行った後、タスク切り替えプログラムに制御を移す。タスク切り替えプログラムは、各々のタスクの状態に基づいて実行させるべきタスクを一つ選択し、そのタスクへのタスク切り替えを行う。
【０００９】
一般に、例外により中断されたタスクの実行を再開することを「例外復帰処理」と呼ぶ。タスクの中断は常に例外によるものであり、タスク切り替えは常に例外により中断されたタスクを再び実行状態にする処理である。よってタスク切り替えは一種の例外復帰処理であると言える。
【００１０】
「デバッガ」（「デバッグ装置」とも呼ぶ）とは、プログラムの修正作業（以下、デバッグ作業）を支援する装置である。デバッガは一般に、ＣＰＵの動作を一時的に中断させたり、ＣＰＵの内部状態を調査したり、ＣＰＵに１命令ずつプログラムを実行させたりするなどして、ＣＰＵがプログラムを実際に実行する際の動作を細かく解析するための機能を持つ。作業者はこれらの機能を用いてプログラム実行時のＣＰＵの動作を観察し、プログラムのどの部分の処理がプログラム製作者の意図と違うのかを解析することにより、プログラムの誤りを見つけ出す手掛かりを得ることができる。デバッガには大別すると「ソフトウェアデバッガ」と「ハードウェアデバッガ」の２種類がある。
【００１１】
「ソフトウェアデバッガ」は、デバッガの機能を持ったプログラムによって構成される。このデバッガプログラムは、カーネルタスクに対し専用の要求を発行することにより、他のタスクの処理を停止したり、メモリやＣＰＵレジスタの値を読み書きしたりする機能を提供する。システム内にタスクを生成し、その上でこのデバッガプログラムを実行することにより、デバッグ機能をユーザに提供するのがソフトウェアデバッガの一般的な形態である。このとき、このデバッガを実行するためのタスクを「デバッガタスク」と呼ぶ。また本明細書では説明の便宜上、「デバッガタスク」とデバッガが制御対象とするタスクをあわせて、「デバッグ対象タスク」と呼ぶことにする。
【００１２】
「ハードウェアデバッガ」は、デバッグ作業の対象となるプログラムを実行するコンピュータのＣＰＵとプローブ（測定物に接触させる探針）を介して接続されるとともに、一般的なパーソナルコンピュータと通信インタフェースを介して接続され、そのパーソナルコンピュータで実行されるデバッガ制御プログラムによって制御される。なお、後述する図１６は、既存のデバッガ制御プログラムによってパーソナルコンピュータのディスプレイに表示される画面の一例である。作業者は、キー入力等を行ってデバッガを操作し、この画面にデバッグ作業の対象となるプログラムを実行するコンピュータのＣＰＵやメモリの状態を表示することができる。なお、本発明の実施形態の説明において、上記のパーソナルコンピュータは図示しない。ハードウェアデバッガにおいては、デバッガタスクという概念は存在しないが、デバッガが起動したときに実行中の状態であったタスクを、本明細書では説明の便宜上「デバッグ対象タスク」と呼ぶことにする。
【００１３】
ＣＰＵの動作をデバッガにより一時的に中断させ、作業者がＣＰＵの動作を解析できる状態にすることをデバッガの「起動」と呼ぶ。デバッガを起動するには、２種類の方法がある。一つは作業者がデバッガを操作する方法、もう一つはデバッガを起動させる特別な命令（「デバッガ起動用命令」と呼ぶ。）をＣＰＵに実行させる方法である。ＣＰＵがこのような命令を実行すると、デバッガはその実行を自動的に検出し自分自身を起動させる。このような命令の１つに後述の「ブレーク命令」がある。デバッガが起動されると、デバッガは、例えば、作業者にデバッグ作業の開始を促す画面を表示する。
【００１４】
デバッグ対象のプログラムは小さな実行単位に分割できることが多い。使用するコンピュータ言語によって「サブルーチン」、「メソッド」、「プロシージャ」、「ラムダ式」等、さまざまな表現形式があるが、大きな処理をこうした小さな実効単位に分割して管理する手法は、プログラムの設計、実装、保守を容易にするため、一般に広く用いられている。ここでは、便宜上Ｃ言語の「関数」という概念を用いてこれらの実行単位を代表させることにするが、この特許の原理はＣ言語だけでなく他の言語で作成されたプログラムにも応用可能なものである。
【００１５】
さて、デバッガを使った解析作業の代表的なものの一つに、デバッガを起動し、デバッグ対象のシステムを一時的に停止させ、プログラムの一部、例えば関数を指定してその部分だけを実行する、プログラムの「部分実行」というものがある。特定の関数がシステムに与える影響が、ユーザの意図したどおりであるかを確認することで、バグの存在を調査する、という手法である。
この部分実行を実施すると、周辺装置の性質やデバッグ対象システムの状態等によっては例外が発生することがある。これは、例えば参照しようとしたメモリがページアウトされていた、周辺装置からレジスタ値の取得完了を示す割り込みが送られてきた、周期タイマ装置から自立的に割り込みが送られてきた、などの場合である。
【００１６】
一般にマルチタスクシステムでは、例外が発生すると、例外処理プログラムが実行された後に例外復帰処理が実行され、その結果タスク切り替えプログラムによるタスク切り替えが行われるが、その際切り替えの対象となるのは、必ずしも例外発生直前に実行中だったタスクとは限らない。もしデバッグ対象システムの部分実行中に例外が発生し、その結果デバッグ対象タスクからデバッグに無関係な他のタスクへの切り替えが発生したとすると、その後にまた他の例外が発生しデバッグ対象タスクへの切り替えが発生するまで、デバッガは制御を得ることが出来なくなってしまう。デバッグ対象タスクに制御が戻れば、ユーザは部分実行の結果を得ることができるが、このときにはデバッグに無関係なタスクの処理によって、ユーザが意図しないところでシステムの状態が変わってしまう可能性がある。
この結果、プログラムの部分実行が、ユーザの意図しないシステムの状態変化を引き起こしてしまい、ユーザが正しく部分実行の結果を認識できなくなるという問題が発生する。
【００１７】
また、関数の中には他のタスクと協調して動作するものもあり、こうした関数の動作を正しく観測するには、関数と相互に関連して動作するようなタスク群へのタスク切り替えが、部分実行時にも発生するようになっていなければならない。したがって単純にタスク切り替えを停止させるだけでは、上の問題に対処することはできない。
【００１８】
従来のデバッガには、このような問題に対処するため、次の方法を取っているものがある（例えば、特許文献１参照）。
・デバッグ対象タスクの、少なくとも一部の処理をＣＰＵに実行させる。
・デバッグ対象タスクと相互に関連して実行されるタスクを、少なくとも一部のハードウェア資源へのアクセスを制限しつつ、ＣＰＵに実行させる。
・デバッグ対象タスクと“相互に関連して実行”しているタスクか否かは、同一ハードウェア資源を共有しているタスクか否かで判断する。
このような構成を取ることにより、ユーザが意図しないところでシステムの状態が変わってしまうという事象がおきないようにしつつも、相互に関連するタスクを動作させながら、プログラムの部分実行を行う、という機能を提供することが出来るようになる。
【特許文献１】特開２００７−１２８１３２号公報
【発明の開示】
【発明が解決しようとする課題】
【００１９】
しかし上記特許文献１に記載の方法では、デバッグ対象タスクと“相互に関連して実行”しているタスクか否かを、同一ハードウェア資源を共有しているタスクか否かで判断することになるので、例えば一部のタスクが互いに全ての資源を共有する「スレッド」で構成されているような場合は、スレッド同士を“相互に関連して実行”するタスクであると判定せざるを得ないため、デバッグ対象タスクの実行時に、デバッグ対象タスクがスレッドであるときは、デバッグに無関係なタスク（スレッド）の実行を抑制することが出来ない、という欠点がある。
本発明は上記の点に鑑みてなされたものであり、本発明の目的は、少なくとも一部のタスクが全ての資源を共有するスレッドであるようなシステムにおいても、ユーザが意図しないところでシステムの状態が変わってしまうという事象がおきないようにしつつも、相互に関連するタスクを動作させながら、プログラムの部分実行を行うことができるデバッグ装置、デバッグ方法及びプログラムを提供することにある。
【課題を解決するための手段】
【００２０】
本発明は上記の課題を解決するためになされたものであり、本発明の一態様は、マルチタスク処理を行うコンピュータ上で他のタスクと相互に関連して実行されるタスクの一部の処理に対するデバッグを行うデバッグ装置であって、デバッグ対象タスクに一部の処理の実行をさせる指示を受け付けるコマンド入力部と、前記コマンド入力部により実行指示された一部の処理の実行に関連する関連タスク群を前記コンピュータ上で実行中のタスクの実行位置及びプログラムの各要素同士の関連を解析するデータフロー解析に基づいて判定する関連タスク識別部と、前記デバッグ対象タスク及び前記関連タスク識別部により判定された関連タスク群にのみタスク切り替えが起こるよう前記コンピュータを制御するタスク切り替え抑制部と、前記コマンド入力部により指定された一部の処理を前記コンピュータに実行させる部分実行部と、を備えることを特徴とするデバッグ装置である。
【００２１】
また、本発明の一態様は、上記のデバッグ装置において、前記関連タスク識別部は、前記コンピュータ上で実行中のタスクの実行位置を示すユーザタスク実行位置情報を前記コンピュータから取得する取得部と、前記デバッグ対象タスク及び前記コンピュータ上で実行中のタスクのプログラムの実行単位である関数の呼び出し関係を示すプログラムコールグラフ情報及び前記プログラム中の関数が参照する変数を示すプログラムデータフロー情報の入力を受け付ける入力部と、を備え、前記ユーザタスク実行位置情報と、前記プログラムコールグラフ情報及び前記プログラムデータフロー情報を用いたデータフロー解析に基づいて前記関連タスク群を判定することを特徴とする。
【００２２】
また、本発明の一態様は、マルチタスク処理を行うコンピュータ上で他のタスクと相互に関連して実行されるタスクの一部の処理に対するデバッグを行うデバッグ方法であって、デバッガ装置が、デバッグ対象タスクに一部の処理の実行をさせる指示を受け付けるステップと、デバッガ装置が、前記一部の処理の実行に関連する関連タスク群を前記コンピュータ上で実行中のタスクの実行位置及びプログラムの各要素同士の関連を解析するデータフロー解析に基づいて判定するステップと、デバッガ装置が、前記デバッグ対象タスク及び前記関連タスク群にのみタスク切り替えが起こるよう前記コンピュータを制御するステップと、デバッガ装置が、前記一部の処理を前記コンピュータに実行させるステップと、を有することを特徴とするデバッグ方法である。
【００２３】
また、本発明の一態様は、マルチタスク処理を行うコンピュータ上で他のタスクと相互に関連して実行されるタスクの一部の処理に対するデバッグを行うためのプログラムであって、デバッグ対象タスクに一部の処理の実行をさせる指示を受け付けるステップと、前記一部の処理の実行に関連する関連タスク群を前記コンピュータ上で実行中のタスクの実行位置及びプログラムの各要素同士の関連を解析するデータフロー解析に基づいて判定するステップと、前記デバッグ対象タスク及び前記関連タスク群にのみタスク切り替えが起こるよう前記コンピュータを制御するステップと、前記一部の処理を前記コンピュータに実行させるステップと、をコンピュータに実行させるためのプログラムである。
【発明の効果】
【００２４】
本発明によれば、デバッグ対象タスクの一部の処理の実行に関連する関連タスク群をコンピュータ上で実行中のタスクの実行位置及びデータフロー解析に基づいて判定し、判定した関連タスク群にのみタスク切り替えが起こるようコンピュータを制御するので、デバッグ対象タスクの一部の処理に関連しない他のタスクによるシステム状態の変化を防ぎつつ、デバッグ対象タスクの一部の処理を実行することができる。
すなわち本発明の効果は、少なくとも一部のタスクがスレッドであるようなシステムにおいても、ユーザが意図しないところでシステムの状態が変わってしまうという事象がおきないようにしつつも、相互に関連するタスクを動作させながら、プログラムの部分実行を行うことのできるデバッグ装置、デバッグ方法及びプログラムを提供することにある。
【発明を実施するための最良の形態】
【００２５】
以下、図面を参照しながら本発明の一実施形態について詳しく説明する。
図１は、本実施形態におけるマルチタスクコンピュータシステム（以下、本システムと呼ぶ）のブロック図である。
本システムは、デバッグ対象タスクを含むプログラムを実行するコンピュータ１００と、プログラムのデバッグ作業を支援するデバッガ装置１２０と、を有する。コンピュータ１００は、コンピュータ１００を統括して制御するＣＰＵ（中央演算装置）１１０と、ＣＰＵ１１０が管理するメモリ管理ユニット１５０と、を含んで構成される。メモリ管理ユニット１５０は、カーネルタスクのメモリ空間（以下、メモリ空間Ａとする）１３０と、ユーザタスクＡ〜Ｄのメモリ空間（以下、メモリ空間Ｂとする）１４０と、を含んで構成される。
【００２６】
また、デバッガ装置１２０は、ユーザコマンド入力部１２５と、ユーザプログラム部分実行部１２６と、関連タスク識別部１２７と、タスク切り替え抑制部１２８と、ユーザコマンド結果出力部１２１と、を含んで構成される。ユーザコマンド入力部１２５は、デバッグ対象タスクにプログラムの関数（一部の処理）の実行をさせる指示を受け付ける。ユーザプログラム部分実行部１２６は、ユーザコマンド入力部１２５により指定された関数をＣＰＵ１１０に実行させる。関連タスク識別部１２７は、ユーザコマンド入力部１２５により指定された関数の実行に関連する関連タスク群をコンピュータ１００上で実行中のタスクの実行位置及びデータフロー解析に基づいて判定する。関連タスク識別部１２７が行うデータフロー解析とは、プログラムの各要素同士の関連を解析する処理である。本実施形態における要素は関数である。タスク切り替え抑制部１２８は、関連タスク識別部１２７によって判定された関連タスク群にのみタスク切り替えが起こるようコンピュータ１００を制御する。なお、図中に示す矢印ｂは、タスク切り替え抑制部１２８がタスク切り替え抑制情報１３３を書き替えることによりタスク切り替え制御をすることを表わす。ユーザコマンド結果出力部１２１は、関数の実行結果を出力する。
【００２７】
また、関連タスク識別部１２７は、コンピュータ１００からユーザタスク実行位置情報１３４を取得する取得部１２７Ｂと、関数マップ情報１２２、プログラムコールグラフ情報１２３及びプログラムデータフロー情報１２４の入力を受け付ける入力部１２７Ａと、を含んで構成される。なお、図中に示す矢印ａは、取得部１２７Ｂがユーザタスク実行位置情報１３４を取得することを表わす。関数マップ情報１２２は、プログラム実行時に各関数やデバイスのレジスタ１４８が配置されるアドレスを示す情報である。プログラムコールグラフ情報１２３は、プログラムを構成する関数のそれぞれについてお互いの呼び出し関係を示す情報である。プログラムデータフロー情報１２４は、プログラムを構成する関数が参照する変数を示す情報である。本実施形態では、関連タスク識別部１２７は、関数マップ情報１２２、プログラムコールグラフ情報１２３及びプログラムデータフロー情報１２４に基づいてデータフロー解析を行う。
【００２８】
カーネルタスクのメモリ空間１３０は、例外処理プログラム１３１と、タスク切り替えプログラム１３２と、を記憶している。さらに、タスク切り替えプログラム１３２は、タスク切り替えの対象とすべきタスクの情報を示すタスク切り替え抑制情報１３３と、コンピュータ１００が生成した全ユーザタスクについてそれぞれの実行位置のアドレスを示すユーザタスク実行位置情報１３４と、を含む。
【００２９】
ユーザタスクＡ〜Ｄのメモリ空間１４０は、ユーザタスクＡ〜Ｄのプログラム１４１と、デバイスのレジスタ１４８と、を記憶している。さらに、ユーザタスクＡ〜Ｄのプログラム１４１は、プログラムの一部として、関数「func_under_test」１４２と、関数「func_1」１４３と、関数「func_2」１４４と、関数「func_3」１４５と、関数「func_4」１４６と、その他の関数群１４７と、を含む。
【００３０】
本実施形態では、ＣＰＵ１１０は以下５つのタスク、すなわち、カーネルタスク、ユーザタスクＡ、ユーザタスクＢ、ユーザタスクＣ、ユーザタスクＤを持っており、これらを並列に実行している。
本実施形態におけるユーザタスクＡ〜Ｄは全て「スレッド」である。
【００３１】
デバッガ装置１２０は、ＣＰＵ１１０の動作を停止させたり、ＣＰＵ１１０の内部の状態を調査したり、ＣＰＵ１１０に１命令ずつプログラムを実行させたりすることにより、作業者のデバッグ作業を支援する。なお、本実施形態では、デバッガ装置１２０はハードウェアデバッガである。但し、これがソフトウェアで構成されるソフトウェアデバッガであった場合でも、同様の仕組みを構築することができる。
【００３２】
各タスクのメモリ空間Ａ及びＢは、そのタスクに対応するプログラムやデータ、および実行中のＣＰＵ１１０の状態を保存する。なお、本実施形態では全てのユーザタスクＡ〜Ｄはメモリ空間Ｂおよびその上に記憶されているプログラム１４１を共有している。
【００３３】
例外処理プログラム１３１は、ＣＰＵ１１０が例外を検出したときに実行するプログラムである。ＣＰＵ１１０は例外を検出すると、自動的に実行中のタスクを中断し、タスクをカーネルタスクに切り替え、この例外処理プログラム１３１の実行を開始し、例外の種別の判定、各々の例外の内容に適した処理を行う。
【００３４】
タスク切り替えプログラム１３２は、ＣＰＵ１１０が“次に実行すべきタスク”を選択するために実行するプログラムである。ＣＰＵ１１０は例外処理プログラム１３１の実行後、このタスク切り替えプログラム１３２を実行し、それまでの実行履歴やタスク間の優先度などに基づいて、次にどのタスクへの切り替えを行うのが適切かを決定する。
【００３５】
図２は、本実施形態におけるユーザタスクＡ〜Ｄのプログラム１４１のソースコードの一部を示す概略図である。
変数定義６０１では、「data_1」、「data_2」という２つの変数が定義されている。いずれも、すべての関数から読み書き可能な大域変数であり、また、複数の関数から安全に並行アクセスができるようにするvolotile修飾子が与えられている。また、いずれも初期値として数値０が与えられている。
【００３６】
関数定義６０２では、関数「func_under_test」１４２の次のような動作が規定されている。
・変数「data_1」が０以外になるまで、１ミリ秒の休眠状態を繰り返す。
・変数「data_1」が０以外になったら、「data_1」の値を返す。
【００３７】
関数定義６０３では、関数「func_1」１４３の次のような動作が規定されている。
・変数「data_2」が０以外になるまで、１ミリ秒の休眠状態を繰り返す。
・変数「data_2」が０以外になったら、「data_1」に「data_2」の値を代入する。
【００３８】
関数定義６０４では、関数「func_2」１４４の次のような動作が規定されている。
・関数「func_3」１４５を呼び出す。
関数定義６０５では、関数「func_3」１４５の次のような動作が規定されている。
・変数「data_2」に、デバイスのレジスタ１４８の値を代入する。
関数定義６０６では、関数「func_4」１４６の動作が規定されている。関数「func_4」１４６からは他の関数「func_1」１４３、「func_2」１４４、「func_3」１４５への呼び出しは含まない。
なお、その他の関数の定義についてはここでは説明を省略する。
【００３９】
次に、デバッガ装置１２０に入力されるデータについて説明する。
図３は、本実施形態におけるプログラム１４１に対する関数マップ情報１２２のデータ構成及びデータ例を示す概略図である。関数マップ情報１２２には、各関数やデバイスのレジスタ１４８がプログラム実行時に配置されるアドレスが記録されている。図示するように、関数マップ情報１２２は、行と列からなる２次元の表形式のデータであり、アドレスと、用途の各項目の列を有している。関数マップ情報１２２の各行は、用途毎に存在する。用途は、各関数やデバイスのレジスタ１４８を示す値である。アドレスは、対応する用途が配置されるアドレス値である。
【００４０】
この図において、例えば、１行目のデータは、アドレス「0x0000-0x00ff」に関数「func_under_test」１４２が配置されることを表わす。２行目のデータは、アドレス「0x0100-0x01ff」に関数「func_1」１４３が配置されることを表わす。３行目のデータは、アドレス「0x0200-0x02ff」に関数「func_2」１４４が配置されることを表わす。４行目のデータは、アドレス「0x0300-0x03ff」に関数「func_3」１４５が配置されることを表わす。５行目のデータは、アドレス「0x0400-0x04ff」に関数「func_4」１４６が配置されることを表わす。６行目のデータは、アドレス「0x0500-…」に「その他の関数」１４７が配置されることを表わす。７行目のデータは、アドレス「0xf000」にデバイスのレジスタ１４８が配置されることを表わす。本実施形態では、この関数マップ情報１２２は、ユーザタスクＡ〜Ｄのプログラム１４１のソースコードをＣＰＵ１１０が実行可能な形式に変換するコンパイル処理時に生成され、デバッグ作業の開始時にユーザからデバッガ装置１２０に入力される。
【００４１】
図４、図５は、プログラム１４１のプログラムコールグラフ情報１２３のデータ構造とデータ例を示す概略図である。図示するように、プログラムコールグラフ情報１２３は、行と列からなる２次元の表形式のデータであり、呼び出される関数と、呼び出す関数の各項目の列を有している。
図４は、呼び出される関数から呼び出す関数を求めるプログラムコールグラフ情報１２３である。この図に示すプログラムコールグラフ情報１２３の各行は呼び出される関数毎に存在する。この図において、呼び出される関数は、対応する呼び出す関数から呼び出されることを表わしている。例えば、１行目のデータは、関数「func_under_test」１４２を呼び出す関数がないことを表わす。２行目のデータは、関数「func_1」１４３を呼び出す関数がないことを表わす。３行目のデータは、関数「func_2」１４４を呼び出す関数がないことを表わす。４行目のデータは、関数「func_3」１４５を呼び出す関数は「func_2」１４４であることを表わす。５行目のデータは、「func_4」１４６を呼び出す関数がないことを表わす。
【００４２】
一方、図５は、呼び出す関数から呼び出される関数を求めるプログラムコールグラフ情報１２３である。この図に示すプログラムコールグラフ情報１２３の各行は呼び出す関数毎に存在する。この図において、呼び出す関数は、対応する呼び出される関数を呼び出すことを表わしている。例えば、１行目のデータは、関数「func_under_test」１４２から呼び出される関数がないことを表わす。２行目のデータは、関数「func_1」１４３から呼び出される関数がないことを表わす。３行目のデータは、関数「func_2」１４４から「func_3」１４５を呼び出すことを表わす。４行目のデータは、関数「func_3」１４５から呼び出される関数がないことを表わす。５行目のデータは、関数「func_4」１４６から呼び出される関数がないことを表わす。
なお、ここでは、プログラム１４１の「その他の関数」１４７に含まれる関数の記載がないが、それらの関数からここに示した関数群への呼び出しは存在しないため、図示しない。
【００４３】
図６、図７は、プログラム１４１のプログラムデータフロー情報１２４のデータ構造とデータ例を示す概略図である。
図６は、変数からそれを参照する関数を求めるプログラムデータフロー情報１２４である。図示するように、プログラムデータフロー情報１２４は、行と列からなる２次元の表形式のデータであり、変数と、変数を参照する関数の各項目の列を有している。この図に示すプログラムデータフロー情報１２４の各行は変数毎に存在する。この図において、変数は、対応する変数を参照する関数から参照されることを表わしている。例えば、1行目のデータは、変数「data_1」を参照する関数は関数「func_under_test」１４２及び関数「func_1」１４３であることを表わす。２行目のデータは、変数「data_2」を参照する関数は関数「func_1」１４３及び関数「func_3」１４５であることを表わす。
【００４４】
一方、図７は、関数からその関数が参照する変数を求めるプログラムデータフロー情報１２４である。図示するようにプログラムデータフロー情報１２４は、行と列からなる２次元の表形式のデータであり、関数と、関数が参照する変数の各項目の列を有している。この図に示すプログラムデータフロー情報１２４の各行は関数毎に存在する。この図において、関数は、対応する関数が参照する変数を参照することを表わしている。例えば、1行目のデータは、関数「func_under_test」１４２が参照する変数は変数「data_1」であることを表わす。２行目のデータは、関数「func_1」１４３が参照する変数は変数「data_1」及び変数「data_2」であることを表わす。３行目のデータは、関数「func_2」１４４が変数「data_1」及び変数「data_2」を参照しないことを表わす。４行目のデータは、関数「func_3」１４５が参照する変数は変数「data_2」であることを表わす。５行目のデータは、関数「func_4」１４６が変数「data_1」及び変数「data_2」を参照しないことを表わす。
なお、ここでは、プログラム１４１の「その他の関数」１４７に含まれる関数の記載がないが、それらの関数からここに示した変数群への参照は存在しないため、図示しない。なお、ここで言う“参照”は、読み出しと書き込みのいずれか、あるいは両方を意味する。
【００４５】
本実施形態では、プログラムコールグラフ情報１２３及びプログラムデータフロー情報１２４は、いずれもユーザがここに図示しない静的解析ツールを使って求めるものであり、関数マップ情報１２２と同様に、デバッグ作業の開始時にユーザからデバッガ装置１２０に入力される。静的解析ツールとは、プログラムの品質評価に利用されるツールである。なお、プログラムコールグラフ情報１２３及びプログラムデータフロー情報１２４を求める技術は、各種文献（例えば、佐々政孝著「プログラミング言語処理系」岩波書店１９８９年発行）に記載されているので、ここでは説明を省略する。
【００４６】
次に、カーネルタスクのメモリ空間１３０が記憶するデータについて説明する。
図８は、ユーザタスク実行位置情報１３４のデータ構造の一例を示す概略図である。図示するようにユーザタスク実行位置情報１３４は、行と列からなる２次元の表形式のデータであり、タスクとプログラムカウンタの値の各項目の列を有している。ユーザタスク実行位置情報１３４は、タスク毎に存在する。この図において、プログラムカウンタの値は、対応するタスクの実行位置を表している。例えば、１行目のデータは、ユーザタスクＡのプログラムカウンタの値が「0x0580」であることを表わす。２行目のデータは、ユーザタスクＢのプログラムカウンタの値が「0x0180」であることを表わす。３行目のデータは、ユーザタスクＣのプログラムカウンタの値が「0x0280」であることを表わす。４行目のデータは、ユーザタスクＤのプログラムカウンタの値が「0x0480」であることを表わす。前述のとおり、デバッガ装置１２０はユーザタスク実行位置情報１３４に自由にアクセス可能である。デバッガ装置１２０は、このユーザタスク実行位置情報１３４と関数マップ情報１２２を照合することにより、各タスクがどの関数を実行中であるかを求めることが出来る。なお、各タスクがどの関数を実行中であるかを識別する技術は、各種文献（例えば、（Richard M. Stallman、Roland H. Pesch、Stan Shebs著）「Debugging With GDB: The Gnu Source-Level Debugger」Free Software Foundation 1992年発行）に記載されているので、ここでは説明を省略する。
【００４７】
次に、本システムの処理について説明する。
図９は、本実施形態におけるプログラムの部分実行処理の一例を示すフローチャートである。
ここでは、説明の便宜上、ユーザの指示でデバッガ装置１２０が起動した状態を処理の起点とする。デバッガ装置１２０起動時点で実行中の状態だったタスクはユーザタスクＡであり、各タスクの実行位置は図８のユーザタスク実行位置情報１３４に示すとおりである。本例では、ユーザタスクＡがデバッグ対象タスクであり、ユーザタスクＢ〜Ｄがコンピュータ１００上で実行中のタスクである。なお、ユーザは、ユーザタスクＡをデバッグ対象タスクとするために、ユーザタスクＡが実行中にコンピュータ１００を一時停止させてからデバッガ装置１２０を起動させる。ここで、ユーザは、コンピュータ１００上でユーザタスクＡを指定することによりユーザタスクＡが実行中にコンピュータ１００を一時停止させる。
【００４８】
まず、ステップ２−１では、デバッガ装置１２０のユーザコマンド入力部１２５が、ユーザからのデバッグ対象タスクに関数（以下、ユーザ実行関数とする）の実行をさせる指示を受け付ける。本例では、ユーザ実行関数は関数「func_under_test」１４２である。処理はステップ２−２へ進む。
ステップ２−２では、デバッガ装置１２０の関連タスク識別部１２７がユーザタスク実行位置情報１３４を取得する。処理はステップ２−３へ進む。
ステップ２−３では、デバッガ装置１２０の関連タスク識別部１２７が、関数マップ情報１２２、プログラムコールグラフ情報１２３、プログラムデータフロー情報１２４と、ステップ２−２で取得したユーザタスク実行位置情報１３４に基づいて、ユーザ実行関数の関連タスク群を同定する。なお、このステップ２−３の関連タスク群決定処理の詳細については後述する。処理はステップ２−４へ進む。
【００４９】
ステップ２−４では、デバッガ装置１２０のタスク切り替え抑制部１２８が、関連タスク群にだけタスク切り替えが起こるようカーネルタスクのタスク切り替え抑制情報１３３を更新する。なお、このタスク切り替え抑制処理の詳細については後述する。処理はステップ２−５へ進む。
ステップ２−５では、デバッガ装置１２０のユーザプログラム部分実行部１２６が、関数「func_under_test」１４２の最後にデバッガ起動用命令であるブレーク命令を書き込む。次に、ユーザプログラム部分実行部１２６は、ユーザタスク実行位置情報１３４のユーザタスクＡに対応するプログラムカウンタ値を書き換えることにより、ユーザタスクＡの実行位置をユーザ実行関数に移す。最後に、ユーザプログラム部分実行部１２６は、ＣＰＵ１１０にユーザタスクＡを実行させる。ここでデバッガは非起動状態に入る。処理はステップ２−６に進む。
【００５０】
ステップ２−６では、ＣＰＵ１１０がユーザ実行関数を実行する。ＣＰＵ１１０は、ユーザ実行関数の最後のブレーク命令を実行すると、デバッガ装置１２０を再び起動する。処理はステップ２−７に進む。
最後に、ステップ２−７では、デバッガ装置１２０のユーザプログラム部分実行部１２６が、ユーザ実行関数に埋め込んだブレーク命令を元に戻す。さらに、ユーザコマンド結果出力部１２１がユーザ実行関数の実行結果をユーザに対して出力し、プログラムの部分実行処理を終了する。
【００５１】
次に、上記ステップ２−３のデータフロー解析に基づいた関連タスク群決定処理について図１０から図１３を参照してより詳細に説明する。
図１０は、本実施形態におけるタスク群決定処理の一例を示すフローチャートである。この図に示す処理は、上記ステップ２−３の処理に相当する。
はじめに、ステップ３−１では、関連タスク識別部１２７が、＜関連関数集合＞を空集合にする。処理はステップ３−２に進む。
【００５２】
ステップ３−２では、関連タスク識別部１２７が、ユーザ実行関数（本例では、関数「func_under_test」１４２）について、プログラムデータフロー情報１２４を元にその関数がアクセスする変数の集合を求め、それを＜変数集合＞とする。処理はステップ３−３に進む。
ステップ３−３では、関連タスク識別部１２７が、＜変数集合＞の各要素について、プログラムデータフロー情報１２４を元にそれらの変数を参照する関数の集合を求め、それをもって＜拡大関連関数集合＞とする。処理はステップ３−４に進む。
ステップ３−４では、関連タスク識別部１２７が、＜拡大関連関数集合＞の各要素について、プログラムコールグラフ情報１２３を元に呼び出し関係にある関数の集合を求め、＜拡大関連関数集合＞に追加する。処理はステップ３−５に進む。
【００５３】
ステップ３−５では、関連タスク識別部１２７が、＜関連関数集合＞と＜拡大関連関数集合＞を比較する。同じなら処理はステップ３−８に進む。一方、違うなら処理はステップ３−６に進む。
ステップ３−６では、関連タスク識別部１２７が、＜拡大関連関数集合＞を新たに＜関連関数集合＞とする。処理はステップ３−７に進む。
ステップ３−７では、関連タスク識別部１２７が、＜関連関数集合＞の各要素について、プログラムデータフロー情報１２４を元にそれらの関数がアクセスする変数の集合を求め、それを新たに＜変数集合＞と再定義する。処理はステップ３−３に進む。
このステップ３−３から３−７までを繰り返すことにより、関連関数集合を求めることができる。
【００５４】
ステップ３−８では、関連タスク識別部１２７が、ユーザタスク実行位置情報１３４と関数マップ情報１２２を照合し、各タスクが実行中の関数を特定する。処理はステップ３−９に進む。
最後にステップ３−９では、関連タスク識別部１２７が、＜関連関数集合＞に含まれる関数を実行しているタスクの集合を求め、これを関連タスク群と定義し、処理を終了する。
【００５５】
図１１は、本実施形態のタスク群決定処理における変数の値の推移図である。
この図に示すデータは、関連タスク識別部１２７が上記ステップ３−３（ＳＴＥＰ３−３）から３−７まで繰り返した際の関連関数集合、変数集合、拡大関連関数集合及びステップ３−５の比較結果を示す。この図の状態番号「状態１５」に示すように、ここでは最終的に関連関数集合が｛func_1，func_2，func_3｝となっている。
【００５６】
図１１に示す例では、状態１の対応ステップはステップ３−１であって、関連関数集合を空にしている。状態２のステップ３−２においてユーザ実行関数が参照する変数は「data_1」のみであるのでそれを変数集合とする。状態３のステップ３−３において変数集合｛data_1｝を参照している関数は「func_1」のみであるのでそれを拡大関連関数集合とする。状態４のステップ３−４において拡大関連関数集合｛func_1｝と呼び出し関係にある関数はないので拡大関連関数に関数を追加しない。状態５のステップ３−５において関連関数集合は空であり、拡大関連関数集合は｛func_1｝であるので一致しないと判定する。状態６のステップ３−６において拡大関連関数集合は｛func_1｝であるのでそれを関連関数集合とする。状態７のステップ３−７において拡大関連関数集合｛func_1｝が参照する変数の集合は｛data_1，data_2｝であるのでそれを変数集合とする。
【００５７】
状態８のステップ３−３において変数集合｛data_1，data_2｝を参照している関数は「func_1」及び「func_3」であるのでそれを拡大関連関数集合とする。状態９のステップ３−４において拡大関連関数集合｛func_1，func_3｝と呼び出し関係にある関数は「func_2」のみであるのでそれを拡大関連関数集合に追加する。状態１０のステップ３−５において関連関数集合は｛func_1｝であり、拡大関連関数集合は｛func_1，func_2，func_3｝であるので一致しないと判定する。状態１１のステップ３−６において拡大関連関数集合は｛func_1，func_2，func_3｝であるのでそれを関連関数集合とする。状態１２のステップ３−７において拡大関連関数集合｛func_1，func_2，func_3｝が参照する変数の集合は｛data_1，data_2｝であるのでそれを変数集合とする。状態１３のステップ３−３において変数集合｛data_1，data_2｝を参照している関数は「func_1」及び「func_3」であるのでそれを拡大関連関数集合とする。状態１４のステップ３−４において拡大関連関数集合｛func_1，func_3｝と呼び出し関係にある関数は「func_2」のみであるのでそれを拡大関連関数集合に追加する。状態１５のステップ３−５において関連関数集合は｛func_1，func_2，func_3｝であり、拡大関連関数集合は｛func_1，func_2，func_3｝であるので一致すると判定する。このようにして、関連関数集合｛func_1，func_2，func_3｝を求める。
【００５８】
図１２は、本実施形態におけるタスク群決定処理で求めたユーザタスク実行関数情報を示す概略図である。
ユーザタスク実行関数情報は、上記ステップ３−８で、関連タスク識別部１２７が図３に示す関数マップ情報１２２と図８に示すユーザタスク実行位置情報１３４とを照合することにより求められる。ユーザタスク実行関数情報には、各タスクが実行中の関数が示されている。本例では、この図に示すように、ユーザタスクＡはその他の関数１４７を実行している。また、ユーザタスクＢは「func_1」１４３を実行している。また、ユーザタスクＣは「func_2」１４４を実行している。また、ユーザタスクＤは「func_4」１４６を実行している。
【００５９】
図１３は、本実施形態におけるタスク群決定処理で求めた関連タスク群を示す概略図である。
この図に示すデータは、上記ステップ３−９で、関連タスク識別部１２７が関連関数集合とユーザタスク実行関数情報とを照合することにより求められる。本例では、この図に示すように、最終的に関連タスク群が｛ユーザタスクＢ，ユーザタスクＣ｝であるとの結果を得ることができる。
【００６０】
次に、本実施形態で用いられたタスク切り替えプログラム１３２を詳細に説明する。
図１４は、本実施形態におけるマルチタスクコンピュータシステムのタスク切り替えプログラム１３２をより詳細に説明したブロック図である。
この図に示すように、本タスク切り替えプログラム１３２は、タスク切り替えの対象とすべき、あるいは対象としてはならないタスクに関する情報を記憶したタスク切り替え抑制情報１３３と、システムが生成した全ユーザタスクについてそれぞれの実行中のアドレスを記憶したユーザタスク実行位置情報１３４と、システムが生成した全タスクについてそれぞれの情報を記憶したタスク情報１３５と、タスク情報１３５に基づいてタスク切り替えの対象とするタスクを選択するタスク選択プログラム１３６と、タスク切り替え抑制情報１３３に基づいて選択されたタスクが切り替えの対象としても良いタスクなのか否かを判定するタスク選択制約条件判定プログラム１３７と、選択されたタスクへの切り替えを実行するタスク切り替え実施プログラム１３８と、を含んで構成される。
【００６１】
また、この図に示すようにタスク情報１３５は、行と列からなる２次元の表形式のデータである。タスク情報１３５には、それぞれのタスク（カーネルタスク、ユーザタスクＡ〜Ｄ）が使用するメモリ空間（メモリ空間Ａ、Ｂを識別する情報）、タスクを起動したユーザ（カーネル、ユーザＡ、Ｂを識別する情報）、そのタスクが使用する外部装置を表す情報（例えば、オープンしているファイル、メモリ空間に保持している外部装置の識別情報、メモリマップ技術により直接アクセス可能な状態になっているメモリマップドＩ／Ｏ空間の情報等の情報である。図１４では簡略に「外部装置Ｘ」または「なし」と記載している。）が記憶されている。
例えば、１行目のデータは、カーネルタスクのメモリ空間は「メモリ空間Ａ」、ユーザは「カーネル」、外部装置へのアクセスは「全外部装置」であることを表わす。２行目のデータは、ユーザタスクＡのメモリ空間は「メモリ空間Ｂ」、ユーザは「ユーザＡ」、外部装置へのアクセスは「外部装置Ｘ」であることを表わす。３行目のデータは、ユーザタスクＢのメモリ空間は「メモリ空間Ｂ」、ユーザは「ユーザＡ」、外部装置へのアクセスは「なし」であることを表わす。
【００６２】
またこの図に示すように、タスク切り替え抑制情報１３３には、切り替えの対象としてはならない、あるいは対象とすべきタスクの条件が情報要素として記憶されている。この図に示すようにタスク切り替え抑制情報１３３は、行と列からなる２次元の表形式のデータであり、タスクの識別子名と、タスクの条件であるタスク切り替え対象の各項目の列を有している。この図に示す例では、「識別子名が『ユーザタスクＡ』、『ユーザタスクＢ』、『ユーザタスクＣ』であるタスクだけが選択される」という条件が記憶されている。なお、切り替えの対象とすべきタスクとしてカーネルタスクが表わされていないが、仮想記憶技術によってメモリ空間を実現するシステムにおいては、ページフォルトの例外を処理する必要があるため、カーネルタスクも切り替えの対象とすべきタスクに含む。これは、ユーザプログラム１４１のうちＣＰＵ１１０がアクセスしようとするアドレスのプログラムがページアウト（物理的メモリ装置から外部記憶装置に退避）されていた場合に、ページインする（外部記憶装置から物理的メモリ装置に読み込む）ためである。
【００６３】
なお、これは本実施形態において上記ステップ２−４で述べた「関連タスク群だけに切り替えが起こるようカーネルタスクのタスク切り替え抑制情報１３３を更新する」という処理の結果の具体例になっている。つまり、ステップ２−４の処理は実際にはこのようなタスク切り替え抑制情報１３３への情報追加、という形で実現される。
【００６４】
図１５は、本実施形態における、タスク切り替えプログラム１３２の動作を示すフローチャートである。
はじめにステップ５−１では、ＣＰＵ１１０はタスク選択プログラム１３６を実行し、タスク情報１３５に記憶されたタスクの中から、タスク切り替えの対象とするタスクを一つ選択する。処理はステップ５−２に進む。
ステップ５−２では、ＣＰＵ１１０はタスク選択制約条件判定プログラム１３７を実行し、直前のステップ５−１で選択されたタスクが、タスク切り替えをしても良いタスクなのか否かを判定する。処理はステップ５−３に進む。
ステップ５−３では、選択されたタスクへのタスク切り替えが適切であると判定されればステップ５−４に、そうでなければステップ５−１に処理を進める。このとき、タスク切り替えが適切であると判定されなかったタスクが、次回のステップ５−１における処理で選択されにくくすることが望ましい。例えば、タスク選択プログラム１３６において、実行頻度の高いタスクのスコアが低くなり選択されにくくなるアルゴリズムによりタスクを選択する場合には、ステップ５−１で選択されたがステップ５−２で切り替えが適切であると判定されなかったタスクのスコアを低くした後、ステップ５−１に処理を進めることにより実現することができる。
ステップ５−４では、ＣＰＵ１１０は実際に選択されたタスクへの切り替えを行う。プログラムの動作はこれで終了となる。
【００６５】
図１６は、本実施形態におけるデバッガ装置１２０の実際の動作時の画面例である。
この図に示す画面は、例えば、デバッガ装置１２０をデバッグ作業の対象となるプログラムを実行するコンピュータのＣＰＵ１１０とプローブを介して接続するとともに、一般的なパーソナルコンピュータと通信インタフェースを介して接続し、そのパーソナルコンピュータで実行されるデバッガ制御プログラムによって表示される。操作者がデバッガを操作すると、このような画面が表示される。この図の画面の上段中央のウィンドウには、行ごとに、メモリアドレス、そのアドレスに記憶された機械語コード、対応するアセンブラコードの順で表示されており、対応するソースコードを表示する行も含む。ここで、「004007F4  A0400000    SB  r0,0(r2)」と表示された行は、メモリアドレス、その命令の機械語コード、アセンブラコードを表わす。
【００６６】
このように、本実施形態によれば、デバッグ対象タスクの一部の処理の実行に関連する関連タスク群をコンピュータ１００上で実行中のタスクの実行位置及びデータフロー解析に基づいて判定し、判定した関連タスク群にのみタスク切り替えが起こるようコンピュータ１００を制御するので、デバッグ対象タスクの一部の処理に関連しない他のタスクによるシステム状態の変化を起こさせることなく、デバッグ対象タスクの一部の処理を実行することが出来る。
これにより、少なくとも一部のタスクがスレッドであるようなシステムにおいても、ユーザが意図しないところでシステムの状態が変わってしまうという事象がおこさないようにしつつも、相互に関連するタスクを動作させながら、プログラムの部分実行を行うことができる。
【００６７】
また、図９、図１０及び図１５に示す各ステップを実現するためのプログラムをコンピュータ読み取り可能な記録媒体に記録して、
この記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行することにより、部分実行処理を行ってもよい。なお、ここでいう「コンピュータシステム」とは、ＯＳや周辺機器等のハードウェアを含むものであってもよい。
また、「コンピュータシステム」は、ＷＷＷシステムを利用している場合であれば、ホームページ提供環境（あるいは表示環境）も含むものとする。
また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ＲＯＭ、フラッシュメモリ等の書き込み可能な不揮発性メモリ、ＣＤ−ＲＯＭ等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。
【００６８】
さらに「コンピュータ読み取り可能な記録媒体」とは、インターネット等のネットワークや電話回線等の通信回線を介してプログラムが送信された場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリ（例えばＤＲＡＭ（Dynamic Random Access Memory））のように、一定時間プログラムを保持しているものも含むものとする。
また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されてもよい。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク（通信網）や電話回線等の通信回線（通信線）のように情報を伝送する機能を有する媒体のことをいう。
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるもの、いわゆる差分ファイル（差分プログラム）であっても良い。
【００６９】
以上、図面を参照してこの発明の一実施形態について詳しく説明してきたが、具体的な構成は上述のものに限られることはなく、この発明の要旨を逸脱しない範囲内において様々な設計変更等をすることが可能である。
例えば、本実施形態ではデバッガ装置１２０をハードウェアデバッガであるとしたが、これはコンピュータ１００で動作するソフトウェアデバッガであっても良い。また、本実施形態ではデバッガ装置１２０を“ブレーク命令”で起動するとしたが、これはデバッガ装置１２０を起動することの出来る命令であれば何でも良く、この命令に限定するものではない。
また、本実施形態では全てのタスクがスレッドで構成されているとしたが、これは必ずしもこの構成を取る必要は無く、一部、あるいは全部のタスクがメモリ空間を共有しない非スレッド型のタスクになっていても良い。
また、本実施形態ではカーネルタスクは無条件でタスク切り替えの対象とするとしたが、例えば全てのメモリ空間を物理的メモリに展開しているためにページイン・ページアウトの仕組みを持っていないなどして、部分実行時にカーネルタスクを動作させる必要のないようなシステムにおいては、必ずしもカーネルタスクをタスク切り替えの対象とする必要は無い。
【００７０】
また、本実施形態ではプログラムデータフロー情報１２４、ならびにプログラムコールグラフ情報１２３は外部のツールから与えられるとしたが、ツールの種類はここに示したものに限定するものではない。また、この情報を求める方法は外部から与えるというものに限定するものではなく、例えばシステム内部で計算するような仕組みを持つようにしても良い。
また、本実施形態では関数マップ情報１２２とユーザタスク実行位置情報１３４からタスクが実行している関数を同定しているとしたが、タスクが実行する関数を同定する方法はこれに限定するものではなく、例えば関数の出入り位置に特別なコードを入れる、などしてタスクが実行中の関数を常時記録しておく、などの方法を持ってもよい。
【図面の簡単な説明】
【００７１】
【図１】本発明の一実施形態によるマルチタスクコンピュータシステムのブロック図である。
【図２】本実施形態におけるユーザタスクＡ〜Ｄのプログラムのソースコードの一部を示す概略図である。
【図３】本実施形態における関数マップ情報のデータ構造及びデータ例を示す概略図である。
【図４】本実施形態におけるデータフロー情報のデータ構造及びデータ例を示す概略図である。
【図５】本実施形態におけるもう一つのデータフロー情報のデータ構造及びデータ例を示す概略図である。
【図６】本実施形態におけるコールグラフ情報のデータ構造及びデータ例を示す概略図である。
【図７】本実施形態におけるもう一つのコールグラフ情報のデータ構造及びデータ例を示す概略図である。
【図８】本実施形態におけるユーザタスク実行位置情報のデータ構造の一例を示す概略図である。
【図９】本実施形態におけるプログラムの部分実行処理の一例を示すフローチャートである。
【図１０】本実施形態におけるタスク群決定処理の一例を示すフローチャートである。
【図１１】本実施形態の関連タスク群決定処理における変数の値の推移図である。
【図１２】本実施形態におけるタスク群決定処理で求めたユーザタスク実行関数情報を示す概略図である。
【図１３】本実施形態におけるタスク群決定処理で求めた関連タスク群を示す概略図である。
【図１４】本実施形態におけるマルチタスクコンピュータシステムのタスク切り替えプログラムのブロック図である。
【図１５】本実施形態におけるマルチタスクコンピュータシステムのタスク切り替えプログラムの動作を示すフローチャートである。
【図１６】本実施形態におけるデバッガの実際の動作時の画面例を表わす。
【符号の説明】
【００７２】
１００…コンピュータ  １１０…ＣＰＵ  １２０…デバッガ  １２１…ユーザコマンド結果出力装置  １２２…関数マップ情報  １２３…プログラムコールグラフ情報  １２４…プログラムデータフロー情報  １２５…ユーザコマンド入力部  １２６…ユーザプログラム部分実行部  １２７…関連タスク識別部  １２８…タスク切り替え抑制部  １３０…カーネルタスクのメモリ空間  １３１…例外処理プログラム  １３２…タスク切り替えプログラム  １３３…タスク切り替え抑制情報  １３４…ユーザタスク実行位置情報  １３５…タスク情報  １３６…タスク選択プログラム  １３７…タスク選択制約条件判定プログラム  １３８…タスク切り替え実施プログラム  １４０…ユーザタスクＡ〜Ｄのメモリ空間  １４１…ユーザタスクＡ〜Ｄのプログラム  １４２…関数func_under_test  １４３…関数func_1  １４４…関数func_2  １４５…関数func_3  １４６…関数func_4  １４７…その他の関数  １４８…デバイスのレジスタ  １５０…メモリ管理ユニット  ６０１…ユーザタスクＡ〜Ｄのプログラムの変数定義  ６０２…ユーザタスクＡ〜Ｄのプログラムの関数func_under_testの定義  ６０３…ユーザタスクＡ〜Ｄのプログラムの関数func_1の定義  ６０４…ユーザタスクＡ〜Ｄのプログラムの関数func_2の定義  ６０５…ユーザタスクＡ〜Ｄのプログラムの関数func_3の定義  ６０６…ユーザタスクＡ〜Ｄのプログラムの関数func_4の定義
【図１】
2009295078.tif 000003
【図２】
2009295078.tif 000004
【図３】
2009295078.tif 000005
【図４】
2009295078.tif 000006
【図５】
2009295078.tif 000007
【図６】
2009295078.tif 000008
【図７】
2009295078.tif 000009
【図８】
2009295078.tif 000010
【図９】
2009295078.tif 000011
【図１０】
2009295078.tif 000012
【図１１】
2009295078.tif 000013
【図１２】
2009295078.tif 000014
【図１３】
2009295078.tif 000015
【図１４】
2009295078.tif 000016
【図１５】
2009295078.tif 000017
【図１６】
2009295078.tif 000018