Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


17.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 を表示することができます。これらのタスクの中には,次のような理由からユーザにとってはなじみのないものもあります。

次の各例は,それぞれ 例 17-1例 17-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 回以上割り当てられることはありません。

17.3.4 タスク組み込みシンボル

表 17-2 に定義されているデバッガの組み込みシンボルを使用すれば,コマンド・プロシージャやコマンド構造にタスクを指定できます。

表 17-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)

17.3.4.1 呼び出す側のタスクのシンボル(Ada 専用)

シンボル %CALLER_TASK は Ada のタスクだけに使用します。これが評価されると,accept 文のエントリを呼び出したタスクのタスク ID か,%TASK 0 になります。たとえば,アクティブ・タスクが accept 文に対応する一連の文を実行していないときに %CALLER_TASK が評価されると,%TASK 0 になります。

たとえば,例 17-2 の行 61(accept 文の中)にブレークポイントが設定されているものとします。この例では,メイン・プログラム(%TASK 1)がエントリ RENDEZVOUS を呼び出すのに応じて,タスク FATHER(%TASK 2)が accept 文を実行します。したがって,そのときに EVALUATE %CALLER_TASK コマンドを入力すれば,呼び出しタスク,つまりメイン・プログラムのタスク ID と評価されます。


DBG> EVALUATE %CALLER_TASK
%TASK 1
DBG>

AST によるエントリ呼び出しの結果がランデブのときに %CALLER_TASK を評価すると,%TASK 0 になります。呼び出す側がタスクでないからです。

17.4 タスク情報の表示

プログラム内のタスクの情報を表示するには,SHOW TASK コマンドを使用します。

SHOW TASK コマンドでは,存在している(終了していない)タスクの情報が表示されます。省略時の設定では,可視タスクの情報が1行だけ表示されます。

第 17.4.1 項第 17.4.2 項 には,それぞれ,SHOW TASK コマンドによって表示される POSIX Threads タスクと Ada タスクの情報が説明されています。

17.4.1 POSIX Threads タスクのタスク情報の表示

SHOW TASK コマンドでは,プログラム内に現存しているすべてのタスクの情報が表示されます(例 17-3 を参照)。

例 17-3 POSIX Threadsタスクに対してSHOW TASK/ALLを実行したときの表示例

 (1)          (2)     (3)     (4)   (5)               (6)
 task id    state hold  pri substate        thread_object 
  %TASK    1 SUSP         12 Condition Wait  Initial thread 
  %TASK    2 SUSP         12 Mutex Wait      T_EXAMP\main\threads[0].field1 
  %TASK    3 SUSP         12 Delay           T_EXAMP\main\threads[1].field1 
  %TASK    4 SUSP         12 Mutex Wait      T_EXAMP\main\threads[2].field1 
* %TASK    5 RUN          12                 T_EXAMP\main\threads[3].field1 
  %TASK    6 READY        12                 T_EXAMP\main\threads[4].field1 
  %TASK    7 SUSP         12 Mutex Wait      T_EXAMP\main\threads[5].field1 
  %TASK    8 READY        12                 T_EXAMP\main\threads[6].field1 
  %TASK    9 TERM         12 Term. by alert  T_EXAMP\main\threads[7].field1 
DBG> 

次の番号は,例 17-3 の番号に対応しています。

  1. タスク ID(第 17.3.3 項 を参照)。アクティブ・タスクには左端の欄にアスタリスク(*)が付けられる。

  2. タスクの現在の状態(表 17-3 を参照)。RUN(RUNNING)状態のタスクがアクティブ・タスクである。表 17-3 には,プログラムの実行中にどの状態に移ることができるかが示されている。

  3. タスクが SET TASK/HOLD コマンドによって保留されているかどうか。タスクの保留については 第 17.5.1 項 を参照。

  4. タスクの優先順位。

  5. タスクの現在の副次状態。副次状態はあるタスク状態を引き起こした原因を推定するのに役立つ。表 17-4 を参照。

  6. タスク(スレッド)オブジェクトのデバッガのパス名,または,デバッガがタスク・オブジェクトをシンボル化できない場合はタスク・オブジェクトのアドレス。

表 17-3 一般的なタスクの状態
タスクの状態 説明
RUNNING タスクは現在プロセッサで実行中である。これがアクティブ・タスクである。この状態のタスクが移ることができるのは,READY,SUSPENDED,TERMINATED のいずれかの状態である。
READY タスクは実行適格であり,プロセッサが使用可能になるのを待っている。この状態のタスクが移ることができるのは RUNNING 状態だけである。
SUSPENDED タスクは中断している。つまり,プロセッサが使用できるのを待っているのではなく,あるイベントを待っている。たとえば,タスクは作成されてから起動されるまで中断状態に留まる。この状態のタスクが移ることができるのは,READY 状態または TERMINATED 状態だけである。
TERMINATED タスクは終了している。この状態のタスクは,ほかの状態に移ることはできない。

表 17-4 POSIX Threadsタスクの副次状態
タスクの副次状態 説明
Condition Wait タスクは POSIX Threads の条件変数を待っている。
Delay タスクは POSIX Threads 遅延への呼び出しで待っている。
Mutex Wait タスクは POSIX Threads ミューテクスを待っている。
Not yet started タスクはまだその起動ルーチンを実行していない。
Term. by alert タスクは警告処理により打ち切られた。
Term. by exc タスクは例外により打ち切られた。
Timed Cond Wait タスクは時限 POSIX Threads 条件変数を待っている。

SHOW TASK/FULL コマンドでは,選択した各タスクについての詳細情報が表示されます。例 17-4 に,POSIX Threads タスクの例でこのコマンドを実行した場合の出力を示します。

例 17-4 POSIX Threadsタスクに対してSHOW TASK/FULLを実行したときの表示例

(1) task id    state hold  pri substate        thread_object 
 %TASK    4 SUSP         12 Delay           T_EXAMP\main\threads[1].field1 
(2)        Alert is pending 
          Alerts are deferred 
 
(3)        Next pc:           SHARE$CMA$RTL+46136 
          Start routine:     T_EXAMP\thread_action 
(4)        Scheduling policy: throughput 
 
(5)        Stack storage: 
          Bytes in use:          1288   (6) Base:    00334C00 
          Bytes available:      40185        SP:      003346F8 
          Reserved Bytes:       10752        Top:     00329A00 
          Guard Bytes:           4095 
 
(7)        Thread control block: 
          Size:                   293        Address: 00311B78 
 
(8)    Total storage:          56613 
DBG> 

次の番号は,例 17-4 の番号に対応しています。

  1. タスク情報の種別を示す。

  2. なんらかの異常についての掲示板型の情報。

  3. 次に実行される箇所を示すPC値と起動ルーチン。

  4. タスク・スケジューリングの方針。

  5. スタック記憶域の情報。

  6. タスク・スタックの上限アドレスと下限アドレス。

  7. タスク(スレッド)制御ブロック情報。タスク値はタスク制御ブロックの 16 進表記アドレス。

  8. タスクが使用する記憶域の合計。タスク制御ブロック・サイズ,予約バイト数,上部保護領域サイズ,記憶域サイズを合計したもの。

図 17-1 にタスク・スタックを示します。

図 17-1 タスク・スタック図


SHOW TASK/STATISTICS コマンドでは,プログラム内のすべてのタスクについての統計情報が報告されます。例 17-5 には,POSIX Threads タスクのプログラム例に対して SHOW TASK/STATISTICS/FULL コマンドを実行したときの出力が示されています。この情報により,プログラムの性能を測定できます。スケジューリング(コンテキスト・スイッチとも呼ぶ)の合計回数が多いほど,タスキング・オーバヘッドは大きくなります。

例 17-5 POSIX Threadsタスクに対してSHOW TASK/STAT/FULLを実行したときの表示例(VAX システムの例)

task statistics 
    Total context switches:              0 
    Number of existing threads:          0 
    Total threads created:               0 
DBG> 

17.4.2 Adaタスクのタスク情報の表示

SHOW TASK/ALLコマンドでは,プログラム内に現存しているすべてのタスクの情報,つまりタスク自体が作成されてからその親がまだ終了していないすべてのタスクの情報が表示されます(例 17-6 を参照)。

例 17-6 Adaタスクに対してSHOW TASK/ALLを実行したときの表示例

 (1)       (2)   (3)    (4)       (5)            (6)
 task id pri hold state   substate     task object 
* %TASK 1  7       RUN                SHARE$ADARTL+130428 
  %TASK 2  7  HOLD 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)
DBG> 

次の番号は,例 17-6 の番号に対応しています。

  1. タスク ID(第 17.3.3 項 を参照)。 アクティブ・タスクには左端の欄にアスタリスク(*)が付く。

  2. タスク優先順位。Ada の優先順位は 0 〜 15。

    VAX プロセッサで作成されるタスクは省略時の設定である優先順位 7 が割り当てられる。ただし,それ以外の優先順位がプラグマ PRIORITY で指定されている場合は,その優先順位が割り当てられる。

    Alpha プロセッサで作成されるタスクは,タイム・スライス機能が使用不能ならば,省略時の設定である優先順位 7 が割り当てられる。タイム・スライス機能が使用可能ならば,プラグマ PRIORITY が指定されていないかぎり,適当な中間の値が優先順位として割り当てられる。

  3. タスクが SET TASK/HOLD コマンドによって保留中かどうかを示す。タスクの保留については,第 17.5.1 項 を参照。タスクの保留には,プログラムの以降の実行が許可されていれば,タスクの状態遷移の制限が伴う。

  4. タスクの現在の状態(表 17-3 を参照)。RUN(RUNNING)状態のタスクがアクティブ・タスク。表 17-3 には,プログラムの実行中に移る可能性のある状態が示されている。

  5. タスクの現在の副次状態。副次状態は,あるタスク状態を引き起こした原因を推定するのに役立つ。表 17-5 を参照。

  6. タスク・オブジェクトのデバッガのパス名,または,デバッガがタスク・オブジェクトをシンボル化できない場合はタスク・オブジェクトのアドレス。

表 17-5 Adaタスクの副次状態
タスクの副次状態 説明
Abnormal タスクは強制終了された。
Accept タスクはselect文の外のaccept文で待っている。
Activating タスクはその宣言部分を作成中である。
Activating tasks タスクは自分が作成した各タスクが活動を終了するのを待っている。
Completed [abn] タスクは abort 文のために打ち切られたが,まだ終了していない。Ada でいう打ち切られたタスクとは,その end 文で各依存タスクを待っているタスクである。それらの依存タスクが終了すると,タスクの状態は Terminated に変わる。
Completed [exc] タスクは処理されない例外1 のために打ち切られたが,まだ終了していない。Ada でいう打ち切られたタスクとは,その end 文で各依存タスクを待っているタスクである。それらの依存タスクが終了すると,タスクの状態は Terminated に変わる。
Completed タスクは打ち切られている。abort 文は実行されず,処理されない例外1 は起こっていない。
Delay タスクは delay 文で待っている。
Dependents タスクは各依存タスクの終了を待っている。
Dependents [exc] タスクは処理されない例外1 の通知を依存タスクが許すのを待っている。
Entry call タスクはそのエントリ呼び出しが受け付けられるのを待っている。
Invalid state Compaq Adaの実行時ライブラリにエラーがある。
I/OまたはAST タスクは入出力(I/O)の終了かなんらかの AST を待っている。
Not yet activated タスクは,自分を作成したタスクによって起動されるのを待っている。
Select or delay タスクは遅延という代替方法が可能な select 文で待っている。
Select or terminate タスクは終了という代替方法が可能な select 文で待っている。
Select タスクはno else,遅延,終了のいずれも不可能な select 文で待っている。
Shared resource タスクは内部共用リソースを待っている。
Terminated [abn] タスクは abort 文により終了した。
Terminated [exc] タスクは処理されない例外1 により終了した。
Terminated タスクは正常終了した。
Timed entry call タスクは時限エントリ呼び出しをして待っている。


1処理されない例外とは,現在のフレーム内にそのためのハンドラがない例外,またはハンドラがあって raise 文を実行しその例外を外部有効範囲に通知する例外のことです。


前へ 次へ 目次 索引