日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 部:デバッガ概要
第 1 章:デバッガ概要
第 2 部:コマンド・インタフェース
第 2 章:デバッガの起動
第 3 章:プログラム実行の制御とモニタ
第 4 章:プログラム・データの検査と操作
第 5 章:プログラム内シンボルへのアクセス制御
第 6 章:ソース・コードの表示の制御
第 7 章:画面モード
第 3 部:DECwindows インタフェース
第 8 章:DECwindows Motifインタフェースの概要
第 9 章:デバッグ・セッションの開始と終了
第 10 章:デバッガの使用方法
第 4 部:PC クライアント・インタフェース
第 11 章:デバッガの PC クライアント/サーバ・インタフェースの概要
第 5 部:高度なトピック
第 12 章:ヒープ・アナライザの使用
第 13 章:その他の便利な機能
第 14 章:特殊なデバッグ
第 15 章:マルチプロセス・プログラムのデバッグ
第 16 章:タスキング・プログラムのデバッグ
第 6 部:付録
付録 A :定義済みのキー機能
付録 B :組み込みシンボルと論理名
付録 C :各言語に対するデバッガ・サポートの要約
付録 D :EIGHTQUEENS.C
索引
PDF
OpenVMS ホーム

HP OpenVMS
デバッガ説明書


目次 索引

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

  1. すべての Ada ライブラリ・パッケージ ( この場合は TEXT_IO ) の作成が終わると,メイン・プログラムが自動的に呼び出されてその宣言部分の作成が開始される ( 行 5 〜 82)。

  2. この例では,実行のつど同じ処理が行われるように,タイム・スライス機能 ( 第 16.5.2 項 を参照 ) は使用していない。プラグマ TIME_SLICE の値が 0.0 になっているのは,プロシージャ TASK_EXAMPLE のためにタイム・スライス機能を禁止する必要があることを示している。
    VAX プロセッサでは,プラグマ TIME_SLICE を省略するか値 0.0 を指定すると,タイム・スライス機能は禁止される。
    Alpha プロセッサでは,タイム・スライス機能を禁止するためにプラグマ TIME_SLICE(0.0) を使用しなければならない。

  3. タスク・オブジェクト FATHER が作成され,%TASK 2 と指定されたタスクが作成される。FATHER にはプラグマ PRIORITY がないので,省略時の優先順位が与えられる。FATHER (%TASK 2) は中断状態で作成され,Ada の規則に従ってメイン・プログラムの文部分が開始されて初めて起動されます ( 行 83)。行 29 〜 81 のタスク本体の作成では,FATHER_TYPE 型のタスクが実行する文が定義されている。

  4. タスク FATHER はタスク CHILD を宣言する ( 行 32)。 1 つのタスクは,1 つのタスク・オブジェクトであり,なにか 1 つのタスク型を表す。タスク CHILD が作成され,起動されるのは,FATHER が起動されてからである。

  5. 非同期システム・トラップ (AST) を引き起こすのは,この TEXT_IO の一連の PUT_LINE 文だけである。入出力 (I/O) の終了により AST が実行要求される。

  6. タスクの FATHER は,メイン・プログラムが待っているときに並行して起動される。FATHER にはプラグマ PRIORITY がないので,省略時の優先順位 7 を与えられる ( 省略時の優先順位については『DEC Ada Language Reference Manual』を参照 )。 FATHER の起動は行 29 〜 44 で作成される。
    起動されたタスク FATHER は,タスク CHILD が起動され,%TASK 3 を指定されたタスクが作成されるのを待つ。 CHILD は行 38 で 1 つのエントリ呼び出しを実行し,そのエントリが受け付けられないのでデッドロックになる ( 第 16.7.1 項 を参照 )。
    タイム・スライス機能が禁止され,優先順位の高い実行可能なタスクがないので,FATHER は起動後も行 47 の ACCEPT 文でブロックされるまで実行される。

  7. タスク MOTHER が定義され,%TASK 4 と指定されたタスクが作成される。プラグマ PRIORITY により,MOTHER には優先順位 6 が与えられる。

  8. タスク MOTHER が起動し,行 91 を実行する。起動後,メイン・プログラム (%TASK 1) の実行再開が可能になる。 %TASK 1 は省略時の優先順位が7であり,MOTHER の優先順位より高いので,メイン・プログラムの実行が再開される。

  9. メイン・プログラムとタスク FATHER の最初のランデブ。この後,FATHER は行 58 の TARMINATO 文の SELECT で中断される。

  10. FATHER との 3 回目のランデブでは,FATHER は行 67 で SOME_ERROR という例外を発生させる。ハンドラは行 72 でその例外を捉え,中断しているタスク CHILD を強制終了してから,再び例外を発生させる。その後,FATHER は終了する。

  11. delay 文で指定されたループにより,制御が行 122 に到達するときには FATHER は終了するのに十分なほど先まで実行されている。

  12. このエントリ呼び出しにより,MOTHER は行 93 のランデブ待ちを解除される。 MOTHER はその accept 文 ( その他の文は含まない ) を実行し,ランデブは終了する。すると,優先順位が 6 にすぎない MOTHER は行 94 で制御を奪われる。

  13. メイン・プログラム (%TASK 1) は MOTHER とのランデブ後,行 127 〜 129 を実行する。メイン・プログラムは行 129 で,自分のすべての依存タスクの終了を待たなければならない ( 第 16.6.4 項 を参照 )。メイン・プログラムが行 129 に到達するとき,まだ終了していないタスクは MOTHER だけである。MOTHER は,行 97 の 文が実行されるまでは終了できない。MOTHER は行 98 で実行を終了する。すべてのタスクが終了したので,メイン・プログラムは実行を終了する。メイン・プログラムから制御が戻されて,コマンド行インタプリタの実行が再開される。



16.3 デバッガ・コマンドによるタスクの指定

タスク とは,その他のタスクと並行して実行される要素です。タスクには固有のタスク ID ( 第 16.3.3 項 を参照 ),独立したスタック,および独立したレジスタ・セットが与えられます。

アクティブ・タスクと可視タスクの現在の定義により,タスク操作のコンテキストが決まります。 第 16.3.1 項 を参照してください。

デバッガ・コマンドにタスクを指定するときには,次のいずれかの形式で指定できます。

  • プログラム内に宣言されているタスク ( スレッド ) 名 ( たとえば, 第 16.2.2 項 の FATHER ) またはタスク値を算出するための言語式。 第 16.3.2 項 には,タスク用の Ada 言語式が説明されている。

  • タスク ID ( たとえば,%TASK 2)。 第 16.3.3 項 を参照。

  • タスク組み込みシンボル ( たとえば,%ACTIVE_TASK)。 第 16.3.4 項 を参照。



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

  • SHOW TASK/ALL の表示には,ユーザのアプリケーションに関連したタスクだけでなく, POSIX Threads ,リモート・プロシージャ呼び出しサービス,C 実行時ライブラリのようなサブシステムが作成したタスクも含まれる。

  • SHOW TASK/ALL の表示には,ユーザのオペレーティング・システム,ユーザのタスキング・サービス,および作成用サブシステムに依存するタスク ID 割り当てが含まれる。異なったシステムで実行される同一のタスキング・プログラムや異なったサービス用に調整された同一のタスキング・プログラムは,別のタスクを同じ 10 進整数では識別しない。%TASK1 だけは例外であり,このタスクはすべてのシステムおよびサービスによって,メイン・プログラムを実行するタスクに割り当てられる。

次の各例は,それぞれ 例 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 に定義されているデバッガの組み込みシンボルを使用すれば,コマンド・プロシージャやコマンド構造にタスクを指定できます。

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


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.