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


目次 索引

DBG> SET BREAK/EVENT=PREEMPTED
DBG> GO
break on THREADS event PREEMPTED 
  Task %TASK 4 is getting preempted by %TASK 3
   .
   .
   .
DBG> SET BREAK/EVENT=SUSPENDED
DBG> GO
break on THREADS event SUSPENDED 
  Task %TASK 1 is about to be suspended
   .
   .
   .
DBG> SET BREAK/EVENT=TERMINATED
DBG> GO
break on THREADS event TERMINATED 
  Task %TASK 4 is terminating normally
DBG>

プログラムをデバッガの制御下に置くと,次の定義済みイベント・ブレークポイントが自動的に設定されます。

  • EXCEPTION_TERMINATED イベント・ブレークポイントは, POSIX Threads ルーチンを呼び出すプログラムでは定義済みである。

  • EXCEPTION_TERMINATEDとDEPENDENTS_EXCEPTION の各イベント・ブレークポイントは,Ada プログラムか Ada ルーチンを呼び出すプログラムでは定義済みである。

以後,Ada での定義済みおよびその他の型のイベント・ブレークポイント例を示します。

EXCEPTION_TERMINATEDイベントの例

EXCEPTION_TERMINATED イベントが起動されるときには,通常,予期しないプログラム・エラーが示されます。次に例を示します。

...
break on ADA event EXCEPTION_TERMINATED 
  Task %TASK 2 is terminating because of an exception 
    %ADA-F-EXCCOP, Exception was copied at a "raise;" or "accept" 
    -ADA-F-EXCEPTION, Exception SOME_ERROR 
    -ADA-F-EXCRAIPRI, Exception raised prior to PC = 00000B61 
DBG> 

DEPENDENTS_EXCEPTIONイベントの例(Ada)

Ada プログラムの場合,DEPENDENTS_EXCEPTION イベントが起こると,そのあとにデッドロックが続くことがよくあります。次に例を示します。

...
break on ADA event DEPENDENTS_EXCEPTION 
  Task %TASK 2 may await dependent tasks because of this exception: 
    %ADA-F-EXCCOP, Exception was copied at a "raise;" or "accept" 
    -ADA-F-EXCEPTION, Exception SOME_ERROR 
    -ADA-F-EXCRAIPRI, Exception raised prior to PC = 00000B61 
DBG> 

RENDEZVOUS_EXCEPTIONイベントの例(Ada)

Ada プログラムの場合,RENDEZVOUS_EXCEPTION イベントを指定しておけば,制御がランデブを離れる前に (例外情報が呼び出しタスクにコピーされて失われる前に) その例外を見ることができます。次に例を示します。

...
break on ADA event RENDEZVOUS_EXCEPTION 
  Exception is propagating out of a rendezvous in task %TASK 2 
    %ADA-F-CONSTRAINT_ERRO, CONSTRAINT_ERROR 
    -ADA-I-EXCRAIPRI, Exception raised prior to PC = 00000BA6 
DBG> 

/EVENT 修飾子によって設定されたブレークポイントまたはトレースポイントを取り消すには,CANCEL BREAK/EVENT または CANCEL TRACE/EVENT コマンドを使用します。 SET コマンドのときと全く同じように,CANCEL コマンドにイベント修飾子とオプションのタスク式を指定します。ただし,WHEN 句や DO 句は指定しません。

タスキング・プログラム用のデバッガ初期化ファイルに,イベント・ブレークポイントとトレースポイントを設定したいことがあります。次に例を示します。

SET BREAK/EVENT=ACTIVATING 
SET BREAK/EVENT=HANDLED DO (SHOW CALLS) 
SET BREAK/EVENT=ABORT_TERMINATED DO (SHOW CALLS) 
SET BREAK/EVENT=EXCEPTION_TERM DO (SHOW CALLS) 
SET BREAK/EVENT=TERMINATED 



16.7 タスク・デバッグについての補足

次の各項では,タスク・デバッグに関係する次の補足事項について説明します。

  • デッドロック

  • 自動スタック・チェック

  • Ctrl/Yの使用法



16.7.1 デッドロック状態になるプログラムのデバッグ

デッドロック とは,あるタスク・グループ内の各タスクが中断されて,そのグループ内のどれか別のタスクが実行されないかぎり,グループ内のどのタスクも実行を再開できないエラー状態のことです。デッドロックは,タスキング・プログラムでよく起こるエラーです。 WHILE 文を使用するプログラムでは無限ループがよく起こるエラーであるのと同様です。

デッドロックは簡単に検出できます。この状態のプログラムは実行を中断しているように見えます。デバッガの制御下で実行しているプログラムがデッドロックを起こしたときには,Ctrl/C を押します。そのデッドロックが中断され,デバッガのプロンプトが表示されます。

通常は,SHOW TASK/ALL コマンド ( 第 16.4 節 を参照 ) か SHOW TASK/STATE=SUSPENDED コマンドが役立ちます。プログラム内の中断しているタスクとその理由が示されるからです。画面モードでデバッグしているときは,SET TASK/VISIBLE %NEXT_TASK コマンドがたいへん便利です。これを使用すれば,すべてのタスクを調べ,各タスクが実行しているコード ( 実行が停止しているコードを含む ) を表示できるからです。

SHOW TASK/FULL コマンドでは,ランデブ情報,エントリ呼び出し情報,エントリ索引値などのタスク状態についての詳しい情報が得られます。 SET BREAK/EVENT コマンドや SET TRACE/EVENT コマンド ( 第 16.6.4 項 を参照 ) では,デッドロックを引き起こす可能性がある記憶位置かその近くにブレークポイントやトレースポイントを設定できます。 SET TASK/PRIORITY コマンドと SET TASK/RESTORE コマンドでは,全く実行されない低優先順位のタスクがデッドロックを引き起こしているのかどうかが分かります。

表 16-9 に,さまざまなタスクのデッドロック状態と,その原因の診断に役立つと思われるデバッガ・コマンドの一覧を示します。

表 16-9 Adaタスクのデッドロック状態とそれを診断するためのデバッガ・コマンド
デッドロック状態 デバッガ・コマンド
自己呼び出しデッドロック ( タスクが自分自身のエントリの 1 つを呼び出す) SHOW TASK/ALL
SHOW TASK/STATE=SUSPENDED
SHOW TASK/FULL
循環呼び出しデッドロック(あるタスクが別のタスクを呼び出し,呼び出されたタスクが最初のタスクを呼び出す) SHOW TASK/ALL
SHOW TASK/STATE=SUSPENDED
SHOW TASK/FULL
動的呼び出しデッドロック(一連のエントリ呼び出しが循環し,そのうちの少なくとも1つがループ内の時限または条件付きエントリ呼び出しである ) SHOW TASK/ALL
SHOW TASK/STATE=SUSPENDED
SHOW TASK/FULL
例外によって生じるデッドロック(例外によって,タスクがそのエントリ呼び出しの1つに応えられないまたは例外の通知が依存タスクを待たなければならない) SHOW TASK/ALL
SHOW TASK/STATE=SUSPENDED
SHOW TASK/FULL
SET BREAK/EVENT=DEPENDENTS_EXCEPTION (Adaプログラムの場合)
エントリ索引に対する実行時の計算間違い,when条件,およびselect文内のdelay文によるデッドロック SHOW TASK/ALL
SHOW TASK/STATE=SUSPENDED
SHOW TASK/FULL
EXAMINE
エントリが間違った順番で呼び出されたためのデッドロック SHOW TASK/ALL
SHOW TASK/STATE=SUSPENDED
SHOW TASK/FULL
優先順位の低いタスクによって設定される変数をフラグとして使用するが,それより優先順位の高いタスクがいつもレディ状態のため優先順位の低いタスクが全く実行できなくて生じる,変数の変更待ちデッドロック SHOW TASK/ALL
SHOW TASK/STATE=SUSPENDED
SHOW TASK/FULL
SET TASK/PRIORITY
SET TASK/RESTORE



16.7.2 デバッガによる自動スタック・チェック

タスキング・プログラムの場合,ある種の状況では検出されないスタック・オーバフローが起こり,予期しない処理が行われることがあります。タスク・スタック・オーバフローについての詳しい説明は, Adaか POSIX Threads のマニュアルを参照してください。デバッガによって自動的に次のスタック・チェックが行われるので,スタック・オーバフローの問題の原因を探り出すのに役立ちます。スタック・ポインタが境界を越えている場合は,エラー・メッセージが表示されます。

  • STEP コマンドの実行後,またはブレークポイントの検出後に,アクティブ・タスクのスタック・チェックが行われる ( 第 16.6.1 項 を参照 )。 STEP または SET BREAKPOINT コマンドに /SILENT 修飾子を指定していると,このチェックは行われない。

  • SHOW TASK コマンドによって状態が表示される各タスクについてスタック・チェックが行われる。したがって,SHOW TASK/ALL コマンドを実行すればすべてのタスクのスタックが自動的にチェックされる。

次のエラー・メッセージ例は,スタック・チェックによってエラーが見つかったときに発行されるものです。たとえスタックがまだオーバフローしていなくても,スタックの大半が使用し尽くされているときには,警告メッセージが発行されます。

warning: %TASK 2 has used up over 90% of its stack 
  SP: 0011194C  Stack top at: 00111200  Remaining bytes: 1868 
 
error: %TASK 2 has overflowed its stack 
  SP: 0010E93C  Stack top at: 00111200  Remaining bytes: -10436 
 
error: %TASK 2 has underflowed its stack 
  SP: 7FF363A4  Stack base at: 001189FC  Stack top at: 00111200 

スタックのオーバフローに続いてスタックのアンダフローが起こることがあります。その経過は次のとおりです。タスク・スタックがオーバフローしてスタック・ポインタが上部保護領域を指したままでいるとき,オペレーティング・システムは ACCVIO 状態をシグナル通知しようとします。しかし上部保護領域には ACCVIO のシグナル引数を書き込めないので,オペレーティング・システムはスタックの別の場所を探します。つまり,フレーム・ポインタとスタック・ポインタがメイン・プログラムのスタック領域の基底を指すようにしてシグナル引数を書き込み,プログラム・カウンタを変更してイメージを強制終了します。

このときタイム・スライス AST かその他の AST が発生すると,別のタスクの実行が再開し,しばらくの間は正常でないままプログラムが続行することがあります。スタックがオーバフローしたタスクは,メイン・プログラムのスタックを使用し,重ね書きすることがあります。デバッガのスタック・チェックは,このような状態を検出するのに役立ちます。オペレーティング・システムによってスタックの規定外の箇所に書き込みをされたタスク内の命令をステップ実行すれば,またはそのときに SHOW TASK/ALL コマンドを使用すれば,デバッガからスタック・アンダフロー・メッセージが発行されます。

16.7.3 AdaタスクをデバッグするときのCtrl/Yの使用

デバッグ・セッション中にプログラムの実行やデバッガ・コマンドに割り込むには,Ctrl/C を押すのが望ましい方法です。 Ctrl/C を押せば制御はデバッガに戻りますが,Ctrl/Y を押せば制御は DCL レベルに戻ります。

Ctrl/Y を押してタスク・デバッグ・セッションに割り込むと, DEBUG コマンドを使用して DCL レベルでデバッガを開始するときに問題が生じることがあります。そのような場合は,メイン・プログラムのソース・コードの先頭に次の 2 行を挿入して,Ada の定義済みパッケージCONTROL_C_INTERCEPTIONの名前を指定してください。

with CONTROL_C_INTERCEPTION; 
pragma ELABORATE(CONTROL_C_INTERCEPTION); 

このパッケージについての詳しい説明は,Comapq Ada のマニュアルを参照してください。


目次 索引

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