日本-日本語 |
|
|
|
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> |
プログラムをデバッガの制御下に置くと,次の定義済みイベント・ブレークポイントが自動的に設定されます。
以後,Ada での定義済みおよびその他の型のイベント・ブレークポイント例を示します。
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 |
次の各項では,タスク・デバッグに関係する次の補足事項について説明します。
デッドロック とは,あるタスク・グループ内の各タスクが中断されて,そのグループ内のどれか別のタスクが実行されないかぎり,グループ内のどのタスクも実行を再開できないエラー状態のことです。デッドロックは,タスキング・プログラムでよく起こるエラーです。 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.7 タスク・デバッグについての補足
デッドロック状態 | デバッガ・コマンド |
---|---|
自己呼び出しデッドロック ( タスクが自分自身のエントリの 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 |
タスキング・プログラムの場合,ある種の状況では検出されないスタック・オーバフローが起こり,予期しない処理が行われることがあります。タスク・スタック・オーバフローについての詳しい説明は, Adaか POSIX Threads のマニュアルを参照してください。デバッガによって自動的に次のスタック・チェックが行われるので,スタック・オーバフローの問題の原因を探り出すのに役立ちます。スタック・ポインタが境界を越えている場合は,エラー・メッセージが表示されます。
次のエラー・メッセージ例は,スタック・チェックによってエラーが見つかったときに発行されるものです。たとえスタックがまだオーバフローしていなくても,スタックの大半が使用し尽くされているときには,警告メッセージが発行されます。
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 のマニュアルを参照してください。
目次 | 索引 |
|