日本-日本語
日本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
デバッガ説明書


目次 索引



デバッグ中にタスクの特性やタスキング環境を変更するには,次表の 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 ではサポートされていません。サポートされていないコンテキストでコマンドを使用する場合,次のエラー・メッセージが出されます。

%DEBUG-E-NOTIMSLI, time slice modification 
     not supported by this event facility 

タイム・スライス機能とデバッガのウォッチポイントの実行とは,互いに影響を与えることに注意してください。ウォッチポイントを設定すると,タイム・スライス間隔値はデバッガにより自動的に 10.0 秒に増加されることがあります。タイム・スライス速度を遅くすることにより,発生を防げる問題があるからです。

16.6 実行の制御とモニタ

次の各項では,次の各機能の実行方法について説明します。

  • タスク依存およびタスク非依存のイベントポイント ( ブレークポイント,トレースポイントなど ) を設定する。

  • POSIX Threads 固有のタスク記憶位置にブレークポイントとトレースポイントを設定する。

  • Ada 固有のタスク記憶位置にブレークポイントとトレースポイントを設定する。

  • SET BREAK/EVENT コマンドまたは SET TRACE/EVENT コマンドを使用してタスク・イベントをモニタする。



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.6.2 POSIX Threads タスキング構造へのブレークポイントの設定

ブレークポイントをスレッド起動ルーチンに設定することは可能です。そのようなブレークポイントは,起動ルーチンの実行開始直前に検出されます。 例 16-1 の場合は,この型のブレークポイントはたとえば次のように設定します。

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.6.3 Adaタスク本体,エントリ呼び出し,およびaccept文へのブレークポイントの設定

タスク本体にブレークポイントを設定するには,次のどちらかの構文に従ってタスク本体を指定します( 第 16.3.2 項 を参照)。

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 文の先頭 ( 行 12 か行 19 )。ここにブレークポイントかトレースポイントを設定すれば,実行が accept 文の先頭に達してランデブが実際に起こる前に,タスクの受け入れが中断すると思われる箇所をモニタできる。

  • accept 文の本体 ( 一連の文 ) の先頭 ( 行 13 か行 20)。ここにブレークポイントかトレースポイントを設定すれば,ランデブが始まる箇所,つまり実際に accept 文の実行が始まる箇所をモニタできる。

  • accept 文の最後 ( 行 14 か行 21 )。ここにブレークポイントかトレースポイントを設定すれば,ランデブが終了し,実行が呼び出し側タスクに切り替えられるところをモニタできる。

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)



16.6.4 タスク・イベントのモニタ

SET BREAK/EVENT コマンドと SET TRACE/EVENT コマンドを使用すれば,タスク・イベントと例外イベントによって検出されるブレークポイントおよびトレースポイントを設定できます。たとえば,次のコマンドで設定するトレースポイントは,タスク CHILDか%TASK 2 が RUN 状態に移るときに検出されます。

DBG> SET TRACE/EVENT=RUN CHILD,%TASK 2

あるイベントの結果,ブレークポイントかトレースポイントが検出されると,デバッガはそのイベントを識別し,追加情報を与えます。

次の各表に,SET BREAK/EVENT コマンドと SET TRACE/EVENT コマンドに\ 指定できるイベント名キーワードの一覧を示します。

  • 表 16-6 に,すべてのタスクに共通する一般的な言語非依存イベントの一覧を示す。

  • 表 16-7 に, POSIX Threads タスクに固有のイベントの一覧を示す。

  • 表 16-8 に,Ada タスクに固有のイベントの一覧を示す。

表 16-6 下位レベルの汎用タスクのスケジューリング・イベント
イベント名 機能
RUN タスクが実行する直前に検出される。
PREEMPTED RUN状態にあるタスクが強制的に READY 状態に移される直前に検出される ( 表 16-3 を参照)。
ACTIVATING タスクが実行を開始する直前に検出される。
SUSPENDED タスクが中断される直前に検出される。

表 16-7 POSIX Threads依存イベント
イベント名 機能
HANDLED ある TRY ブロックで例外が処理される直前に検出される。
TERMINATED タスクが終了する直前に検出される ( 警告や例外による場合を含む )。
EXCEPTION_TERMINATED タスクが例外によって終了する直前に検出される。
FORCED_TERM タスクが警告処理によって終了する直前に検出される。

表 16-8 Ada固有のイベント
イベント名 機能
HANDLED 例外が Ada の例外ハンドラ ( その他のハンドラを含む ) によって処理される直前に検出される。
HANDLED_OTHERS 例外がその他の Ada 例外ハンドラによって処理される直前にだけ検出される。
RENDEZVOUS_EXCEPTION 例外がランデブの外に通知される直前に検出される。
DEPENDENTS_EXCEPTION 例外によってタスクがある有効範囲内の依存タスクを待つ直前に検出される ( 未処理例外 1 を含む。したがって,Ada の実行時ライブラリ内部の特殊な例外を含む。詳しくは,Ada のマニュアルを参照 )。デッドロックの直前のことが多い。
TERMINATED タスクの終了直前に検出される。正常終了のとき,abort 文によるとき,および例外によるときを含む。
EXCEPTION_TERMINATED 処理されない例外 1 によってタスクが終了する直前に検出される。
ABORT_TERMINATED abort 文によってタスクが終了する直前に検出される。

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

上記の各表には,例外関係のイベントも含めてあります。次の各段落では,タスク・イベントについてだけ説明しています。例外イベントについての詳しい説明は,デバッガのオンライン・ヘルプを参照してください ( type Help Language_Support Ada を入力します )。

イベント名キーワードは,一意性を損わない文字数まで短縮できます。

SET BREAK/EVENT コマンドまたは SET TRACE/EVENT コマンドに指定できるイベント名キーワードは,そのときのイベント機能がタスク・イベント時に THREADS なのか ADA なのかで異なります。プログラムをデバッガの制御下に置くと,適切なイベント機能が自動的に設定されます。 SHOW EVENT_FACILITY コマンドでは,現在設定されている機能が示され,その機能に指定できるイベント名キーワード ( 汎用イベントのキーワードを含む ) の一覧が表示されます。

以後,いくつかの例によって /EVENT 修飾子の使用法を示します。


目次 索引

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