Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


14.3.2.3 配列およびレコード

配列要素やレコード構成要素(適用できる場合)を表す文法は,言語によって異なります。

たとえば,ある言語では配列要素を区切るために大括弧([])を使用し,別の言語では括弧(())を使用します。

ある言語ではゼロを基底とする配列を持ち,また別の言語では,次の例のように1を基底とする配列を持ちます。


DBG> EXAMINE INTEGER_ARRAY
PROG2\INTEGER_ARRAY 
  (1,1):       27 
  (1,2):       31 
  (1,3):       12 
  (2,1):       15 
  (2,2):       22 
  (2,3):       18
DBG>

ある言語(Pascal や Ada など)では,特定の配列宣言によって配列が何を基底にするかが決まります。

14.3.2.4 大文字/小文字の区別

C 言語では,名前や言語式の大文字/小文字が区別されます。名前や言語式を指定する場合,ソース・コードに記述されているとおりに指定しなければなりません。たとえば,言語が C に設定されているとき,次の 2 つのコマンドは等しくありません。


DBG> SET BREAK SCREEN_IO\%LINE 10
DBG> SET BREAK screen_io\%LINE 10

14.3.2.5 初期化コード

多くのプログラムでは,プログラムがデバッガの制御下に置かれたとき,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 コマンドを再び入力すると,プログラムの実行が開始されます。

14.3.2.6 定義済みのブレークポイント

タスキング・プログラムの場合,プログラムがデバッガの制御下に置かれると,タスキング例外イベントに関連づけられた 2 つのブレークポイントが自動的に設定されます。これらのブレークポイントは,SET LANGUAGE コマンドの影響を受けません。これらのブレークポイントは,適切な実行ライブラリが存在すると,デバッガの初期化の間に自動的に設定されます。

これらの定義済みのブレークポイントを示すには,SHOW BREAKコマンドを入力します。次に例を示します。


DBG> SHOW BREAK
Predefined breakpoint on ADA event "EXCEPTION_TERMINATED" for any value 
Predefined breakpoint on ADA event "DEPENDENTS_EXCEPTION" for any value
DBG>

14.3.2.7 STEP/OVERコマンドとFortran(VAX のみ)

VAX システムでは,STEP/OVER コマンドを使用すると,Fortran 実行時ライブラリ(RTL)ルーチンを飛び越さずに,その中でステップ実行することがあります。Compaq Fortran プログラムをデバッグしているときに,READ,WRITE,PRINT などの Fortran 入出力操作が見つかった場合,Fortran コンパイラは,Fortran RTL ルーチンを呼び出し,入出力操作を終了させます。RTL ルーチンを呼び出すときSTEPコマンドを使用すると,デバッガはこのルーチンを飛び越さずにその中でステップ実行し,次のエラー・メッセージを表示します。


%DEBUG-W-NOSCRLIN, no source line for address nnnnnnnn 

通常デバッガは,次に実行するRET命令を探すことによってルーチンを飛び越しますが,Fortran コンパイラは,明示的に RET 命令を実行せずに,標準的でない方法を使用して,Fortran RTL 入出力ルーチンで使用されている一時文字列の割り当てをスタックから解除します。これがその原因になります。

エラー・メッセージから回復するときは,STEP コマンドを何度か出して,セッション内の希望するコード行に戻ります。問題の再発を防ぐために,プログラムを変更して,入出力文の前に,関数の結果を格納する一時変数を含むように書き換えます。たとえば次のようにします。


    CHARACTER*23 c1, c2 
    c1 = c2()                  ! c1 is the temporary variable 
    WRITE(*)c1 
    END 
C 
    CHARACTER*23 FUNCTION c2()
    c2 = 'ABCDEFGHIJKLMNOPQRSTUVW' 
    RETURN 
    END 

14.4 スタックの破損からの回復

デバッガは,起動時に一定量のメモリを割り当て,ユーザのプログラムとスタックを共有します。ユーザ・プロセスの例外により,リソースの浪費やスタックの破損が発生した場合,デバッガは制御を失うことがあり,その場合デバッグ・セッションも異常終了します。

スタック破損のメッセージや,重大なエラーについての警告が出たら,このような事態になることも考えておかなければなりません。どちらの場合も,デバッグ・セッションの完全性が保証されなくなります。

次のいずれかの手段を試してみます。

14.5 例外ハンドラおよび条件ハンドラのデバッグ

条件ハンドラは,例外が発生した場合にオペレーティング・システムが実行するプロシージャです。

例外には,ハードウェア条件(算術演算でのオーバフローやメモリ・アクセス違反など),またはシグナル通知されたソフトウェア的な例外(ファイルが見つからないためにシグナル通知された例外など)が含まれます。

オペレーティング・システムやデバッガ,またはユーザ・プログラムによって設定された種々の条件ハンドラ,たとえば,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つが,プログラムの実行によって発生した例外を処理するために起動されます。複数の場合は次のリストの順番に起動されます。

  1. 1次ハンドラ

  2. 2次ハンドラ

  3. 呼び出しフレーム・ハンドラ(アプリケーションで宣言される)。スタック・ハンドラとしても知られる。

  4. 最終ハンドラ

  5. ラスト・チャンス・ハンドラ

  6. キャッチオール・ハンドラ

ハンドラは,次の 3 つの状態コードのうち 1 つを「Condition Handling Facility」へ戻します。

条件処理についてさらに詳しい説明は,『OpenVMS Programming Concepts Manual』を参照してください。

14.5.3.1 1次ハンドラ

プログラムをデバッガとともに実行する場合,1次ハンドラはデバッガです。したがって,デバッガが例外を処理する最初の機会を持ちます。例外がデバッガによって引き起こされたものであるかどうかは関係ありません。

SET BREAK/EXCEPTIONコマンドまたはSET TRACE/EXCEPTIONコマンドを入力した場合,デバッガはユーザ・プログラムによって引き起こされた例外でブレーク(トレース)します。ブレーク(トレース)処理は,アプリケーションで宣言されたハンドラが起動される前に行われます。

SET BREAK/EXCEPTIONコマンドまたはSET TRACE/EXCEPTIONコマンドを入力していない場合,1次ハンドラはユーザ・プログラムによって引き起こされた例外を再シグナル通知します。

14.5.3.2 2次ハンドラ

2次ハンドラは,特別な目的で使用され,本書で説明しているようなプログラムに対しては適用されません。

14.5.3.3 呼び出しフレーム・ハンドラ(アプリケーションで宣言されたもの)

ユーザ・プログラムの各ルーチンで,条件ハンドラを設定することができます。これらは呼び出しフレーム・ハンドラとして知られます。オペレーティング・システムは,現在実行中のルーチンからこれらのハンドラの検索を開始します。ルーチンにハンドラが設定されていない場合,呼び出しスタックの次のルーチンによって設定されたハンドラを検索します。このようにして,必要ならばメイン・プログラムまで検索します。

呼び出しフレーム・ハンドラの起動後,ハンドラは次のうち1つの処理を行います。


前へ 次へ 目次 索引