日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
多くのプログラムでは,プログラムがデバッガの制御下に置かれたとき, NOTATMAINメッセージが表示されます。次に例を示します。
$ DEBUG/KEEP Debugger Banner and Version Number DBG> RUN prog-name Language: ADA, Module: MONITOR Type GO to reach main program DBG> |
NOTATMAIN メッセージは,メイン・プログラムの先頭の前でプログラムが一時停止していることを知らせます。これによって,デバッガの制御下でいくつかの初期化コードを実行し,チェックすることが可能になります。
初期化コードはコンパイラによって作成され,LIB$INITIALIZE という名前の特別な PSECT に置かれます。たとえば,Ada パッケージの場合,初期化コードはパッケージ本体 ( 変数を初期化するための文を含む ) に属します。 Fortran プログラムの場合は,初期化コードは /CHECK=UNDERFLOW 修飾子または /CHECK=ALL 修飾子を指定したときに必要とされるハンドラを宣言します。
NOTATMAIN メッセージは,初期化コードをデバッグしたくない場合, GO コマンドを入力すると直ちにメイン・プログラムの先頭から実行できることを知らせます。このとき,ユーザは他のプログラムのデバッグを起動するときと同じ場面にいます。GO コマンドを再び入力すると,プログラムの実行が開始されます。
タスキング・プログラムの場合,プログラムがデバッガの制御下に置かれると,タスキング例外イベントに関連づけられた 2 つのブレークポイントが自動的に設定されます。これらのブレークポイントは, SET LANGUAGE コマンドの影響を受けません。これらのブレークポイントは,適切な実行ライブラリが存在すると,デバッガの初期化の間に自動的に設定されます。
これらの定義済みのブレークポイントを示すには,SHOW BREAKコマンドを入力します。次に例を示します。
14.3.2.6 定義済みのブレークポイント
DBG> SHOW BREAK Predefined breakpoint on ADA event "EXCEPTION_TERMINATED" for any value Predefined breakpoint on ADA event "DEPENDENTS_EXCEPTION" for any value DBG> |
デバッガは,起動時に一定量のメモリを割り当て,ユーザのプログラムとスタックを共有します。ユーザ・プロセスの例外により,リソースの浪費やスタックの破損が発生した場合,デバッガは制御を失うことがあり,その場合デバッグ・セッションも異常終了します。
スタック破損のメッセージや,重大なエラーについての警告が出たら,このような事態になることも考えておかなければなりません。どちらの場合も,デバッグ・セッションの完全性が保証されなくなります。
次のいずれかの手段を試してみます。
条件ハンドラは,例外が発生した場合にオペレーティング・システムが実行するプロシージャです。
例外には,ハードウェア条件 ( 算術演算でのオーバフローやメモリ・アクセス違反など ),またはシグナル通知されたソフトウェア的な例外 ( ファイルが見つからないためにシグナル通知された例外など ) が含まれます。
オペレーティング・システムやデバッガ,またはユーザ・プログラムによって設定された種々の条件ハンドラ,たとえば,1 次ハンドラ,呼び出しフレーム・ハンドラ ( アプリケーションで宣言されたもの ) などが,どのように,またどんな順序で起動されるかは,オペレーティング・システムの規則によって指定されます。デバッガを使用する場合の条件処理については, 第 14.5.3 項 を参照してください。条件処理についての一般的な説明については,『OpenVMS Run-Time Library Routines Volume』を参照してください。
例外ハンドラおよび条件ハンドラのデバッグ・ツールには次のものがあります。
14.5.1 例外へのブレークポイントまたはトレースポイントの設定
SET BREAK/EXCEPTION または SET TRACE/EXCEPTION コマンドを入力すると,デバッガはユーザ・プログラムによって作成された例外をブレークポイントまたはトレースポイントとして扱うようになります。 SET BREAK/EXCEPTION コマンドの結果,ユーザのプログラムが例外を作成した場合は,デバッガは実行を一時停止し,例外が生じたことと実行が一時停止した行を報告し,コマンド入力を要求するプロンプトを表示します。次に例を示します。
DBG> SET BREAK/EXCEPTION DBG> GO . . . %SYSTEM-F-INTDIV, arithmetic trap, integer divide by zero at PC=0000066C, PSL=03C00022 break on exception preceding TEST\%LINE 13 6: X := 3/Y; DBG> |
例外ブレークポイント ( 例外トレースポイント ) は,例外を処理するための条件ハンドラをユーザ・プログラムが持っている場合でも検出されます。 SET BREAK/EXCEPTION コマンドは,ハンドラが実行可能になる前およびその結果,例外が破棄される前にブレークポイントを発生させます。例外ブレークポイントがなければハンドラは実行され,例外を破棄するハンドラがない場合にだけ,デバッガが制御を得ることができます。 第 14.5.2 項 および 第 14.5.3 項 を参照してください。
次のコマンド行は,例外が発生した場所を示すために使用すると便利です。このコマンドを使用すると,デバッガは一連のアクティブな呼び出しと例外ブレークポイントでの PC 値を自動的に表示します。
DBG> SET BREAK/EXCEPTION DO (SET MODULE/CALLS; SHOW CALLS) |
画面モードの DO 表示を作成して,デバッガが実行に割り込みをかけた場合に SHOW CALLS コマンドを実行することもできます。次に例を示します。
DBG> DISPLAY CALLS DO (SET MODULE/CALLS; SHOW CALLS) |
SET TRACE/EXCEPTION コマンドで設定される例外トレースポイントは,例外ブレークポイントにアドレス式の指定を持たない GO コマンドが続くものと似ています。
例外ブレークポイントは例外トレースポイントを取り消します。また,その逆も同様です。
例外ブレークポイントまたは例外トレースポイントを取り消すには,それぞれ CANCEL BREAK/EXCEPTION コマンドまたは CANCEL TRACE/EXCEPTION コマンドを使用します。
14.5.2 例外ブレークポイントでの実行の再開
例外ブレークポイントが検出されると,アプリケーションで宣言された条件ハンドラが起動される前に実行が一時停止します。ブレークポイントから GO,STEP,または CALL の各コマンドで実行を再開する場合,動作は次のようになります。
次のFORTRANの例では,例外ブレークポイントで条件ハンドラの存在をどのようにして判断するか,また,ブレークポイントで入力されたSTEPコマンドがどのようにしてハンドラ内の命令をステップ実行するかを示しています。
例外ブレークポイントでは,SHOW CALLコマンドがSYS$QIOWルーチン呼び出しの間に例外が発生したことを知らせます。
DBG> SET BREAK/EXCEPTION DBG> GO . . . %SYSTEM-F-SSFAIL, system service failure exception, status=0000013C, PC=7FFEDE06, PSL=03C00000 break on exception preceding SYS$QIOW+6 DBG> SHOW CALLS module name routine name line rel PC abs PC SYS$QIOW 00000006 7FFEDE06 *EXC$MAIN EXC$MAIN 23 0000003B 0000063B DBG> |
VAX プロセッサでは,次のSHOW STACKコマンドは,SYS$QIOWルーチンではハンドラが宣言されていないことを示しています。呼び出しスタックの 1 レベル下で,EXC$MAINルーチンが「SSHAND」という名前のハンドラを宣言しています。
DBG> SHOW STACK stack frame 0 (2146296644) condition handler: 0 SPA: 0 S: 0 mask: ^M<r2,r3,r4,r5,r6,r7,r8,r9,r10,r11> PSW: 0020 (hexadecimal) saved AP: 2146296780 saved FP: 2146296704 saved PC: EXC$MAIN\%LINE 25 . . . stack frame 1 (2146296704) condition handler: SSHAND SPA: 0 S: 0 mask: ^M<r11> PSW: 0000 (hexadecimal) saved AP: 2146296780 saved FP: 2146296760 saved PC: SHARE$DEBUG+2217 . . . |
この例外ブレークポイントでSTEPコマンドを入力すると,条件ハンドラ「SSHAND」内の命令を直接ステップ実行することができます。
DBG> STEP stepped to routine SSHAND 2: INTEGER*4 FUNCTION SSHAND (SIGARGS, MECHARGS) DBG> SHOW CALLS module name routine name line rel PC abs PC *SSHAND SSHAND 2 00000002 00000642 ----- 上記の条件ハンドラは例外0000045Cで呼び出された。 %SYSTEM-F-SSFAIL, system service failure exception, status=0000013C, PC=7FFEDE06, PSL=03C00000 ----- 例外メッセージの終わり。 SYS$QIOW 00000006 7FFEDE06 *EXC$MAIN EXC$MAIN 23 0000003B 0000063B DBG> |
デバッガは,可能な場合には条件ハンドラのアドレスを名前としてシンボル化します。ただし,ある言語では,アプリケーションで宣言された条件ハンドラが起動される前に,例外はまず実行時ライブラリ (RTL) ルーチンによって処理されるので注意が必要です。このような場合,最初の条件ハンドラのアドレスはRTL共用可能イメージのアドレスからのオフセットにシンボル化されます。
14.5.3 条件ハンドラへのデバッガの影響
プログラムをデバッガとともに実行する場合,次の条件ハンドラのうち少なくとも1つが,プログラムの実行によって発生した例外を処理するために起動されます。複数の場合は次のリストの順番に起動されます。
ハンドラは,次の 3 つの状態コードのうち 1 つを「Condition Handling Facility」へ戻します。
条件処理についてさらに詳しい説明は,『OpenVMS Programming Concepts Manual』を参照してください。
プログラムをデバッガとともに実行する場合,1次ハンドラはデバッガです。したがって,デバッガが例外を処理する最初の機会を持ちます。例外がデバッガによって引き起こされたものであるかどうかは関係ありません。
SET BREAK/EXCEPTIONコマンドまたはSET TRACE/EXCEPTIONコマンドを入力した場合,デバッガはユーザ・プログラムによって引き起こされた例外でブレーク(トレース)します。ブレーク(トレース)処理は,アプリケーションで宣言されたハンドラが起動される前に行われます。
SET BREAK/EXCEPTIONコマンドまたはSET TRACE/EXCEPTIONコマンドを入力していない場合,1次ハンドラはユーザ・プログラムによって引き起こされた例外を再シグナル通知します。
2次ハンドラは,特別な目的で使用され,本書で説明しているようなプログラムに対しては適用されません。
ユーザ・プログラムの各ルーチンで,条件ハンドラを設定することができます。これらは呼び出しフレーム・ハンドラとして知られます。オペレーティング・システムは,現在実行中のルーチンからこれらのハンドラの検索を開始します。ルーチンにハンドラが設定されていない場合,呼び出しスタックの次のルーチンによって設定されたハンドラを検索します。このようにして,必要ならばメイン・プログラムまで検索します。
呼び出しフレーム・ハンドラの起動後,ハンドラは次のうち1つの処理を行います。
14.5.3.1 1次ハンドラ
14.5.3.2 2次ハンドラ
14.5.3.3 呼び出しフレーム・ハンドラ(アプリケーションで宣言されたもの)
DBG> SET BREAK/EXCEPTION DBG> GO . . . %SYSTEM-F-INTDIV, arithmetic trap, integer divide by zero at PC=0000066C, PSL=03C00022 break on exception preceding TEST\%LINE 13 6: X := 3/Y; DBG> GO %SYSTEM-F-INTDIV, arithmetic trap, integer divide by zero at PC=0000066C, PSL=03C00022 DBG> |
この例では,最初のINTDIVメッセージは1次ハンドラによって発行されます。2つ目のメッセージは最終ハンドラによって発行され,その後最終ハンドラによりDBG>プロンプトが表示されています。
ラスト・チャンス・ハンドラは,呼び出しスタックの破損のために最終ハンドラが制御を得ることができなかった場合にだけ起動されます。次に例を示します。
DBG> DEPOSIT %FP = 10 DBG> GO . . . %SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual address=0000000A, PC=0000319C, PSL=03C00000 %DEBUG-E-LASTCHANCE, stack exception handlers lost, re-initializing stack DBG> |
キャッチオール・ハンドラはオペレーティング・システムの一部であり,ラスト・チャンス・ハンドラが制御を得ることができなかった場合に起動されます。キャッチオール・ハンドラはレジスタのダンプを作成します。デバッガがユーザ・プログラムを制御している場合に起動されることはありません。デバッガを使用せずにプログラムを実行しているとき,プログラムでエラーが検出されると起動されます。
デバッグ・セッションの間,レジスタ・ダンプが現れ DCL レベル ($) に戻った場合は,弊社のサポート要員にご連絡ください。
14.5.4 例外関連の組み込みシンボル
例外がシグナル通知された場合,デバッガは次の例外関連の組み込みシンボルを設定します。
シンボル | 説明 |
---|---|
%EXC_FACILITY | 現在の例外を発行したファシリティの名前 |
%EXC_NAME | 現在の例外の名前 |
%ADAEXC_NAME | 現在のAda例外の名前 (Ada プログラムの場合のみ ) |
%EXC_NUMBER | 現在の例外の番号 |
%EXC_SEVERITY | 現在の例外の重大度コード |
これらのシンボルを次のように使用することができます。
次に,これらのシンボルの使用例を示します。 WHEN 句の条件式は言語固有ですので注意してください。
DBG> EVALUATE %EXC_NAME 'ACCVIO' DBG> SET TRACE/EXCEPTION WHEN (%EXC_NAME = "ACCVIO") DBG> EVALUATE %EXC_FACILITY 'SYSTEM' DBG> EVALUATE %EXC_NUMBER 12 DBG> EVALUATE/CONDITION_VALUE %EXC_NUMBER %SYSTEM-F-ACCVIO, access violation, reason mask=01, virtual address=FFFFFF30, PC=00007552, PSL=03C00000 DBG> SET BREAK/EXCEPTION WHEN (%EXC_NUMBER = 12) DBG> SET BREAK/EXCEPTION WHEN (%EXC_SEVERITY .NE. "I" .AND. %EXC_SEVERITY .NE. "S") |
目次 | 索引 |
|