日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
16.5 タスク特性の変更 |
デバッグ中にタスクの特性やタスキング環境を変更するには,次表の SET TASK コマンドを使用します。
コマンド | 機能 |
---|---|
SET TASK/ACTIVE | 指定されたタスクをアクティブ・タスクにする。 POSIX Threads (OpenVMS Alpha システム,VAX システム,または Integrity システム) でも Ada (OpenVMS Alpha システムおよび Integrity システム) でも動作しない ( 第 16.3.1 項 を参照 )。 |
SET TASK/VISIBLE | 指定されたタスクを可視タスクにする ( 第 16.3.1 項 を参照 )。 |
SET TASK/ABORT | 次に可能な機会にタスクを終了するように要求する。具体的な効果はそのときのイベント機能により異なる ( 言語依存 )。Ada タスクの場合,これは abort 文の実行と同じである。 |
SET TASK/PRIORITY | タスクの優先順位を設定する。具体的な効果はそのときのイベント機能により異なる ( 言語依存 )。 |
SET TASK/RESTORE | タスクの優先順位を復元する。具体的な効果はそのときのイベント機能により異なる ( 言語依存 )。 |
SET TASK/[NO]HOLD | タスク・スイッチを制御する。タスク状態の遷移については 第 16.5.1 項 を参照。 |
SET TASK/TIME_SLICE | タイム・スライス値を制御するか,タイム・スライス機能を禁止する。VAX Ada のみでサポートされ, POSIX Threads ではサポートされていない ( 第 16.5.2 項 を参照 )。 |
詳細については,SET TASK コマンドの説明を参照してください。
16.5.1 タスクの保留によるタスク・スイッチの制御
タスク・スイッチにより,プログラムのデバッグが複雑になります。 SET TASK/HOLD コマンドを使用してタスクを保留すれば,あとでそのプログラムが実行可能になったときにそのタスクが移る状態を制限できます。
保留されたタスクは RUNNING 以外のいずれかの状態に移ります。しかし,必要であれば SET TASK/ACTIVE コマンドを使用して保留されたタスクを RUNNING 状態に移すことも可能です。
SET TASK/HOLD/ALL コマンドではアクティブ・タスク以外のすべてのタスクの状態が凍結されます。このコマンドを SET TASK/ACTIVE コマンドと併用すれば,指定した 1 つか複数のタスクの動作を観察できます。そのためには,STEP コマンドまたは GO コマンドによってそのアクティブ・タスクを実行し,SET TASK/ACTIVE コマンドを使用して実行を別のタスクに切り替えます。次に例を示します。
DBG> SET TASK/HOLD/ALL DBG> SET TASK/ACTIVE %TASK 1 DBG> GO . . . DBG> SET TASK/ACTIVE %TASK 3 DBG> STEP . . . |
タスクを保留する必要がなくなったら,SET TASK/NOHOLD コマンドを使用します。
16.5.2 タイム・スライス機能を使用するプログラムのデバッグ (VAX のみ)
タイム・スライス機能を使用するタスキング・プログラムのデバッグは複雑です。タイム・スライス機能によってタスクの相対的な動作が非同期になるからです。タイム・スライス機能を使用しない場合,タスクの実行はタスクの優先順位だけで決まります。タスク・スイッチは予測可能なので,実行のたびにプログラムの同じ動作を繰り返すことができます。タイム・スライス機能を使用する場合もタスクの優先順位によってタスク・スイッチが行われますが,指定期間は同じ優先順位の複数のタスクが交互に実行されます。したがって,タイム・スライス機能があれば各タスクは互いにいっそう独立して実行されるようになります。そのため,タイム・スライス機能を使用するプログラムは,実行するたびに同じ動作を繰り返さないことがあります。
SET TASK/TIME_SLICE=t コマンド ( VAX Ada のみでサポート ) を使用すれば,新しいタイム・スライスを指定したり, SET TASK/TIME_SLICE=0.0 と指定してタイム・スライス機能を禁止したりできます。したがって,タスキング・プログラムの実行を調整したり,タスクの実行順序に依存する問題を診断したりできます。
注意 SET TASK/TIME_SLICE コマンドは,VAX Ada のみでサポートされており, POSIX Threads を使用した VAX Ada ではサポートされていません。サポートされていないコンテキストでコマンドを使用する場合,次のエラー・メッセージが出されます。
|
タイム・スライス機能とデバッガのウォッチポイントの実行とは,互いに影響を与えることに注意してください。ウォッチポイントを設定すると,タイム・スライス間隔値はデバッガにより自動的に 10.0 秒に増加されることがあります。タイム・スライス速度を遅くすることにより,発生を防げる問題があるからです。
16.6 実行の制御とモニタ
次の各項では,次の各機能の実行方法について説明します。
16.6.1 タスク依存およびタスク非依存のデバッガ・イベントポイントの設定
イベントポイント とは,デバッガに制御を戻すために使用できるイベントです。ブレークポイント,トレースポイント,ウォッチポイント,および STEP コマンドの終了はいずれもイベントポイントです。
タスク非依存イベントポイント は,プログラム内のいずれかのタスクの実行によって起動されます。そのイベントポイントの設定時にどのタスクがアクティブなのかは関係ありません。タスク非依存イベントポイントの指定には,行番号や名前などのアドレス式を使用するのが普通です。ウォッチポイントはすべて,タスク非依存イベントポイントです。次にタスク非依存イベントポイントの設定例を示します。
DBG> SET BREAK COUNTER DBG> SET BREAK/NOSOURCE %LINE 55, CHILD$TASK_BODY DBG> SET WATCH/AFTER=3 KEEP_COUNT |
タスク依存イベントポイント は,コマンド入力時にアクティブなタスクにしか設定できません。タスク依存イベントポイントは,その同じタスクがアクティブなときにしか起動されません。たとえば,STEP/LINE コマンドはタスク依存イベントポイントです。その他のタスクが同じソース行を実行してもそのイベントは起動されないことがあります。
次の修飾子を指定して SET BREAK, SET TRACE,または STEP コマンドを実行すれば,タスク依存イベントポイントが設定されます。
/BRANCH
/CALL
/INSTRUCTION
/LINE
/RETURN
/VECTOR_INSTRUCTION (VAX専用)
これらのコマンドでこれらの修飾子を使用しないで設定するイベントポイントおよび SET WATCH コマンドを使用して設定するイベントポイントは,タスク非依存になります。次にタスク依存イベントポイントの設定例を示します。
DBG> SET BREAK/INSTRUCTION DBG> SET TRACE/INSTRUCTION/SILENT DO (EXAMINE KEEP_COUNT) DBG> STEP/CALL/NOSOURCE |
通常はタスク非依存のイベントポイントに条件を設定して,タスク依存にすることができます。次に例を示します。
DBG> SET BREAK %LINE 11 WHEN (%ACTIVE_TASK=FATHER) |
ブレークポイントをスレッド起動ルーチンに設定することは可能です。そのようなブレークポイントは,起動ルーチンの実行開始直前に検出されます。 例 16-1 の場合は,この型のブレークポイントはたとえば次のように設定します。
16.6.2 POSIX Threads タスキング構造へのブレークポイントの設定
DBG> SET BREAK worker_routine |
Ada タスクの場合とは異なり POSIX Threads タスクの場合は名前で本体を指定することはできませんが,起動ルーチンは似ています。
SET BREAK コマンドに WHEN 句を指定すれば,特定のスレッドの実行開始時点を確実にとらえることができます。次に例を示します。
DBG> SET BREAK worker_routine - _DBG> WHEN (%CALLER_TASK = %TASK 4) |
例 16-1 の場合,この条件付きブレークポイントは 2 番目のワーカ・スレッドがその起動ルーチンを開始するときに検出されます。
ブレークポイントの設定に適するその他の箇所には,条件待ち,結合,およびミューテクスのロックの直前と直後があります。そのようなブレークポイントの設定には,行番号かルーチン名を指定します。
タスク本体にブレークポイントを設定するには,次のどちらかの構文に従ってタスク本体を指定します(
第 16.3.2 項 を参照)。
16.6.3 Adaタスク本体,エントリ呼び出し,およびaccept文へのブレークポイントの設定
task-type-identifier$TASK_BODY |
task-identifier$TASK_BODY |
たとえば,次のコマンドではタスク CHILD の本体にブレークポイントが設定されます。そのブレークポイントは,タスクの宣言部分の作成 ( タスクのアクティベーションとも呼ぶ ) の直前に検出されます。
DBG> SET BREAK CHILD$TASK_BODY |
CHILD$TASK_BODY は,タスクが最初に実行する命令が置かれている箇所の名前です。ブレークポイントをある命令に設定するのは意味があることなので,この名前を指定します。しかし,SET BREAK コマンドにタスク・オブジェクトの名前 ( たとえば,CHILD ) を指定してはなりません。タスク・オブジェクト名は,データ項目のアドレス ( 32 ビットのタスク値 ) を示します。整数オブジェクトにブレークポイントを設定するのは間違いであるように,タスク・オブジェクト名にブレークポイントを設定するのも間違いです。
エントリ呼び出し文と accept 文にブレークポイントかトレースポイントを設定すれば,呼ぶ側,呼ばれる側のタスクの実行をモニタできます。
注意 Ada タスクのエントリ呼び出しは,サブプログラム呼び出しと同じではありません。タスク・エントリ呼び出しはキューに登録されるので,すぐ実行されるとは限らないからです。STEP コマンドを使用して実行をタスク・エントリ呼び出しに移しても,期待通りの結果が得られないことがあります。 |
ブレークポイントやトレースポイントの設定に適する箇所は,accept 文とその前後に数箇所あります。たとえば,RENDEZVOUS という同じエントリに 2 つの accept 文が使用されている次のプログラム・セグメントについて考えてみます。
8 task body TWO_ACCEPTS is 9 begin 10 for I in 1..2 loop 11 select 12 accept RENDEZVOUS do 13 PUT_LINE("This is the first accept statement"); 14 end RENDEZVOUS; 15 or 16 terminate; 17 end select; 18 end loop; 19 accept RENDEZVOUS do 20 PUT_LINE("This is the second accept statement"); 21 end RENDEZVOUS; 22 end TWO_ACCEPTS; |
この例では,次の箇所にブレークポイントかトレースポイントを設定できます。
accept 文かその前後にブレークポイントかトレースポイントを設定するためには,その行番号を指定します。たとえば,次のコマンドでは,前の例の最初の accept 文の先頭と本体にブレークポイントが設定されます。
DBG> SET BREAK %LINE 12, %LINE 13 |
accept 文の本体にブレークポイントかトレースポイントを設定するには,エントリ名も使用できます。その展開された名前を指定して,そのエントリが宣言されているタスク本体を示します。次に例を示します。
DBG> SET BREAK TWO_ACCEPTS$TASK_BODY.RENDEZVOUS |
同じエントリに 2 つ以上の accept 文がある場合,デバッガはそのエントリをオーバーロードされた名前として扱います。デバッガからそのシンボルがオーバーロードされていることを示すメッセージが発行されるので,ユーザは SHOW SYMBOL コマンドを使用して,デバッガによって割り当てられたオーバーロードされた名前を表示しなければなりません。次に例を示します。
DBG> SHOW SYMBOL RENDEZVOUS overloaded symbol TEST.TWO_ACCEPTS$TASK_BODY.RENDEZVOUS overloaded instance TEST.TWO_ACCEPTS$TASK_BODY.RENDEZVOUS__1 overloaded instance TEST.TWO_ACCEPTS$TASK_BODY.RENDEZVOUS__2 |
オーバーロードされた名前の後ろには,2 つの下線と整数が続きます。オーバーロードされた名前についての詳しい説明は,デバッガのオンライン・ヘルプを参照してください ( Help Language_Support Ada を入力します )。
オーバーロードされた名前のどちらが特定の accept 文に対応しているかを知るためには,EXAMINE/SOURCE コマンドを使用します。次に例を示します。
DBG> EXAMINE/SOURCE TWO_ACCEPTS$TASK_BODY.RENDEZVOUS__1 module TEST_ACCEPTS 12: accept RENDEZVOUS do DBG> EXAMINE/SOURCE TWO_ACCEPTS$TASK_BODY.RENDEZVOUS__2 module TEST_ACCEPTS 19: accept RENDEZVOUS do |
次の例でブレークポイントが検出されると,呼び出しタスクが評価されます。シンボル %CALLER_TASK についての詳しい説明は, 第 16.3.4 項 を参照してください。
DBG> SET BREAK TWO_ACCEPTS$TASK_BODY.RENDEZVOUS__2 - _DBG> DO (EVALUATE %CALLER_TASK) |
次のブレークポイントが検出されるのは,呼び出しタスクが %TASK 2 のときだけです。
DBG> SET BREAK TWO_ACCEPTS$TASK_BODY.RENDEZVOUS__2 - _DBG> WHEN (%CALLER_TASK = %TASK 2) |
呼び出しタスクが同じ accept 文に 2 回以上エントリ呼び出しを行う場合は,SHOW TASK/CALLS コマンドを使用することにより,そのエントリ呼び出しが実行されたソース行を表示できます。たとえば,次のように指定します。
DBG> SET BREAK TWO_ACCEPTS$TASK_BODY.RENDEZVOUS__2 - _DBG> DO (SHOW TASK/CALLS %CALLER_TASK) |
SET BREAK/EVENT コマンドと SET TRACE/EVENT コマンドを使用すれば,タスク・イベントと例外イベントによって検出されるブレークポイントおよびトレースポイントを設定できます。たとえば,次のコマンドで設定するトレースポイントは,タスク CHILDか%TASK 2 が RUN 状態に移るときに検出されます。
DBG> SET TRACE/EVENT=RUN CHILD,%TASK 2 |
あるイベントの結果,ブレークポイントかトレースポイントが検出されると,デバッガはそのイベントを識別し,追加情報を与えます。
次の各表に,SET BREAK/EVENT コマンドと SET TRACE/EVENT コマンドに\ 指定できるイベント名キーワードの一覧を示します。
イベント名 | 機能 |
---|---|
RUN | タスクが実行する直前に検出される。 |
PREEMPTED | RUN状態にあるタスクが強制的に READY 状態に移される直前に検出される ( 表 16-3 を参照)。 |
ACTIVATING | タスクが実行を開始する直前に検出される。 |
SUSPENDED | タスクが中断される直前に検出される。 |
イベント名 | 機能 |
---|---|
HANDLED | ある TRY ブロックで例外が処理される直前に検出される。 |
TERMINATED | タスクが終了する直前に検出される ( 警告や例外による場合を含む )。 |
EXCEPTION_TERMINATED | タスクが例外によって終了する直前に検出される。 |
FORCED_TERM | タスクが警告処理によって終了する直前に検出される。 |
イベント名 | 機能 |
---|---|
HANDLED | 例外が Ada の例外ハンドラ ( その他のハンドラを含む ) によって処理される直前に検出される。 |
HANDLED_OTHERS | 例外がその他の Ada 例外ハンドラによって処理される直前にだけ検出される。 |
RENDEZVOUS_EXCEPTION | 例外がランデブの外に通知される直前に検出される。 |
DEPENDENTS_EXCEPTION | 例外によってタスクがある有効範囲内の依存タスクを待つ直前に検出される ( 未処理例外 1 を含む。したがって,Ada の実行時ライブラリ内部の特殊な例外を含む。詳しくは,Ada のマニュアルを参照 )。デッドロックの直前のことが多い。 |
TERMINATED | タスクの終了直前に検出される。正常終了のとき,abort 文によるとき,および例外によるときを含む。 |
EXCEPTION_TERMINATED | 処理されない例外 1 によってタスクが終了する直前に検出される。 |
ABORT_TERMINATED | abort 文によってタスクが終了する直前に検出される。 |
上記の各表には,例外関係のイベントも含めてあります。次の各段落では,タスク・イベントについてだけ説明しています。例外イベントについての詳しい説明は,デバッガのオンライン・ヘルプを参照してください ( type Help Language_Support Ada を入力します )。
イベント名キーワードは,一意性を損わない文字数まで短縮できます。
SET BREAK/EVENT コマンドまたは SET TRACE/EVENT コマンドに指定できるイベント名キーワードは,そのときのイベント機能がタスク・イベント時に THREADS なのか ADA なのかで異なります。プログラムをデバッガの制御下に置くと,適切なイベント機能が自動的に設定されます。 SHOW EVENT_FACILITY コマンドでは,現在設定されている機能が示され,その機能に指定できるイベント名キーワード ( 汎用イベントのキーワードを含む ) の一覧が表示されます。
以後,いくつかの例によって /EVENT 修飾子の使用法を示します。
目次 | 索引 |
|