日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
次の番号は, 例 16-2 の番号に対応しています。
タスク とは,その他のタスクと並行して実行される要素です。タスクには固有のタスク ID ( 第 16.3.3 項 を参照 ),独立したスタック,および独立したレジスタ・セットが与えられます。
アクティブ・タスクと可視タスクの現在の定義により,タスク操作のコンテキストが決まります。 第 16.3.1 項 を参照してください。
デバッガ・コマンドにタスクを指定するときには,次のいずれかの形式で指定できます。
アクティブ・タスクとは,STEP,GO,CALL,または EXIT コマンドを実行したときに起動されるタスクです。プログラムをデバッガの制御下に置くと,最初はアクティブ・タスクの中で実行が中断されます。デバッグ・セッション中にアクティブ・タスクを変更するには SET TASK/ACTIVE コマンドを使用します。
注意 SET TASK/ACTIVE コマンドは, POSIX Threads (OpenVMS VAX システム, Alpha システム,および Integrity システム) と POSIX Threads 経由で実行するタスキングである Ada (OpenVMS Alpha システムおよび Integrity システム) では動作しません。 POSIX Threads で照会型のアクションを行うときは, SET TASK/ACTIVE コマンドの代わりに,SET TASK/VISIBLE コマンドを使用します。特定のスレッドでステップを制御したいときは,ブレークポイントを適切な位置に配置します。 |
次のコマンドでは CHILD というタスクがアクティブ・タスクになります。
DBG> SET TASK/ACTIVE CHILD |
可視タスク とは,スタックとレジスタ・セットがデバッガによって現在のコンテキストとして使用されるタスクです。デバッガはシンボル,レジスタ値,ルーチン呼び出し,ブレークポイントなどを参照するときにスタックとレジスタ・セットを使用します。たとえば,次のコマンドでは,可視タスクのコンテキストの変数 KEEP_COUNT の値が表示されます。
DBG> EXAMINE KEEP_COUNT |
最初は,可視タスクがアクティブ・タスクです。可視タスクを変更するには, SET TASK/VISIBLE コマンドを使用します。このコマンドにより,アクティブ・タスクに影響を与えずにその他のタスクの状態を参照することができます。
デバッガ・コマンドに組み込みシンボルの %ACTIVE_TASK と %VISIBLE_TASK を使用することにより,それぞれアクティブ・タスクと可視タスクを指定できます ( 第 16.3.4 項 を参照 )。
SET TASK コマンドによるタスク特性の変更についての詳しい説明は, 第 16.5 節 を参照してください。
タスクを宣言するには,単一タスクを宣言するか,またはあるタスク型のオブジェクトを宣言します。次に例を示します。
16.3.2 Adaのタスキングの構文
-- タスク型の宣言。 -- task type FATHER_TYPE is ... end FATHER_TYPE; task body FATHER_TYPE is ... end FATHER_TYPE; -- 単一タスク。 -- task MOTHER is ... end MOTHER; task body MOTHER is ... end MOTHER; |
タスク・オブジェクト とは,タスク値を含むデータ項目です。タスク・オブジェクトが作成されるのは,プログラムによって単一タスクかタスク・オブジェクトが作成されるとき,タスク構成要素を含んでいる配列かレコードをユーザが宣言するとき,またはタスク・アロケータが評価されるときです。次に例を示します。
-- タスク・オブジェクトの宣言。 -- FATHER : FATHER_TYPE; -- タスク・オブジェクト(T)はレコードの構成要素。 -- type SOME_RECORD_TYPE is record A, B: INTEGER; T : FATHER_TYPE; end record; HAS_TASK : SOME_RECORD_TYPE; -- タスク・オブジェクト(POINTER1)はアロケータを通じて作成される。 -- type A is access FATHER_TYPE; POINTER1 : A := new FATHER_TYPE; |
タスク・オブジェクトは,その他のオブジェクトに似ています。デバッガ・コマンドにタスク・オブジェクトを指定するときには,名前かパス名を指定します。次に例を示します。
DBG> EXAMINE FATHER DBG> EXAMINE FATHER_TYPE$TASK_BODY.CHILD |
タスク・オブジェクトを作成すると,Ada 実行時ライブラリによってタスクが作成され,そのタスク・オブジェクトにタスク値が割り当てられます。タスク・オブジェクトの値はその他の Ada オブジェクトと同じく,オブジェクトが初期化されるまでは未定義になるので,初期化されていない値を使用するとその結果は予測できません。
あるタスク型または単一タスクの タスク本体 は, 1 つのプロシージャとして Ada の中に組み込まれます。そのプロシージャはその型のタスクが起動されるとき, Ada の実行時ライブラリから呼び出されます。デバッガはタスク本体を普通のAdaプロシージャとして処理します。特別な構造の名前を持っている点が異なります。
デバッガ・コマンドにタスク本体を指定するには,次の構文を使用して,タスク型として宣言されているタスクを指定します。
task-type-identifier$TASK_BODY |
単一タスクの指定には,次の構文を使用します。
task-identifier$TASK_BODY |
たとえば,次のように指定します。
DBG> SET BREAK FATHER_TYPE$TASK_BODY |
デバッガはタスク依存の Ada 属性 T'CALLABLE, E'COUNT,T'STORAGE_SIZE,および T'TERMINATED はサポートしません。このうち,T はタスク型,E はタスク・エントリです ( これらの属性についての詳しい説明は,Ada の資料を参照してください )。 EVALUATE CHILD'CALLABLE などのコマンドは入力できません。しかし,デバッガの SHOW TASK コマンドを使用してこれらの属性の内容を知ることはできます。詳しい説明は, 第 16.4 節 を参照してください。
16.3.3 タスクID
タスクID とは,タスクがタスキング・システムによって作成されるときタスクに付けられる番号です。タスク ID により,タスクはプログラムの実行中は常に一意的に識別されます。
タスク ID の構文は次のとおりです。ただし,n は正の 10 進整数です。
%TASK n |
あるタスク・オブジェクトのタスク ID を知るためには,そのタスク・オブジェクトを評価または検査します。次はその一例です。パス名は Ada の構文に従っています。
DBG> EVALUATE FATHER %TASK 2 DBG> EXAMINE FATHER TASK_EXAMPLE.FATHER: %TASK 2 |
プログラミング言語に組み込みタスキング・サービスが用意されていない場合,タスクのタスク ID を得るためには EXAMINE/TASK コマンドを使用しなければなりません。
EXAMINE/TASK/HEXADECIMAL コマンドにタスク・オブジェクトを指定すると 16 進のタスク値が表示されるので注意してください。タスク値とはそのタスクのタスク ( すなわちスレッド ) 制御ブロックのアドレスです。次はその一例です ( Ada の例 )。
DBG> EXAMINE/HEXADECIMAL FATHER TASK_EXAMPLE.FATHER: 0015AD00 DBG> |
SHOW TASK/ALL コマンドでは,現存するすべてのタスクに割り当てられているタスク ID を表示することができます。これらのタスクの中には,次のような理由からユーザにとってはなじみのないものもあります。
次の各例は,それぞれ 例 16-1 と 例 16-2 で実行したときのものです。
DBG> SHOW TASK/ALL task id state hold pri substate thread_object %TASK 1 READY HOLD 12 Initial thread %TASK 2 SUSP 12 Condition Wait THREAD_EX1\main\threads[0].field1 %TASK 3 SUSP 12 Condition Wait THREAD_EX1\main\threads[1].field1 DBG> |
DBG> SHOW TASK/ALL task id pri hold state substate task object * %TASK 1 7 RUN SHARE$ADARTL+130428 %TASK 2 7 SUSP Accept TASK_EXAMPLE.MOTHER+4 %TASK 4 7 SUSP Entry call TASK_EXAMPLE.FATHER_TYPE$TASK_BODY.CHILD+4 %TASK 3 6 READY TASK_EXAMPLE.MOTHER+4 DBG> |
タスク ID を使用すれば,デバッガの条件文に非存在タスクを指定できます。たとえば,自分のプログラムを一度実行して,%TASK 2 と %TASK 3 を調べたい場合は,その次のデバッグ・セッションを開始して,まだ %TASK 2 も %TASK 3 も作成されていないときに次のコマンドを入力します。
DBG> SET BREAK %LINE 60 WHEN (%ACTIVE_TASK=%TASK 2) DBG> IF (%CALLER=%TASK 3) THEN (SHOW TASK/FULL) |
タスクが作成される前にそのタスク ID を特定のデバッガ・コマンドに指定しても,デバッガがエラーを報告することはありません。しかし,タスク・オブジェクトが存在する前にそのタスク・オブジェクト名を使用すると,デバッガによりエラーが報告されます。タスクは作成されて初めて存在することになります。タスクは終了後しばらくして非存在になります。非存在タスクがデバッガの SHOW TASK コマンドによって表示されることはありません。
プログラムの文が同じ順序で実行されるかぎり,そのプログラムを実行するつど同じタスクには同じタスク ID が割り当てられます。しかし,AST ( delay 文の満了や入出力 (I/O) の完了で起こる ) が異なる順序で発生するために実行順序が変わることがあります。タイム・スライス機能を許可しても実行順序が変わることがあります。同じプログラムの実行中に同じタスク ID が 2 回以上割り当てられることはありません。
16.3.4 タスク組み込みシンボル
表 16-2 に定義されているデバッガの組み込みシンボルを使用すれば,コマンド・プロシージャやコマンド構造にタスクを指定できます。
組み込みシンボル | 機能 |
---|---|
%ACTIVE_TASK | GO, STEP, CALL,または EXIT コマンドの実行によって 起動されるタスク。 |
%CALLER_TASK | (Adaプログラムだけの機能。) 実行される accept 文のエントリを呼び出したタスク。 |
%NEXT_TASK | デバッガのタスク・リスト内の,可視タスクの後のタスク。 各タスクの順序はランダムだが,同じプログラムを 1 回実行している間は首尾一貫している。 |
%PREVIOUS_TASK | デバッガのタスク・リスト内の,可視タスクの前の タスク。 |
%VISIBLE_TASK | シンボル,レジスタ値,ルーチン呼び出し,ブレーク ポイントなどの参照に現在のコンテキストとして使用される呼び出しスタックとレジスタ・セットを持っているタスク。 |
これらのタスク組み込みシンボルの使用例は次のとおりです。
次のコマンドでは,可視タスクのタスク ID が表示されます。
DBG> EVALUATE %VISIBLE_TASK |
次のコマンドではアクティブ・タスクが保留されます。
DBG> SET TASK/HOLD %ACTIVE_TASK |
次のコマンドでは行 38 にブレークポイントが設定されます。このブレークポイントはタスク CHILD が行 38 を実行するときにだけ検出されます。
DBG> SET BREAK %LINE 38 WHEN (%ACTIVE_TASK=CHILD) |
シンボル %NEXT_TASK と %PREVIOUS_TASK を使用すれば,現存しているすべてのタスクを順次表示できます。たとえば,次のように使用します。
DBG> SHOW TASK %VISIBLE_TASK; SET TASK/VISIBLE %NEXT_TASK DBG> SHOW TASK %VISIBLE_TASK; SET TASK/VISIBLE %NEXT_TASK . . . DBG> EXAMINE MONITOR_TASK MOD\MONITOR_TASK: %TASK 2 DBG> WHILE %NEXT_TASK NEQ %ACTIVE DO (SET TASK %NEXT_TASK; SHOW CALLS) |
目次 | 索引 |
|